From b1b543849e4e9772c8c89b38987f21a623cf73e9 Mon Sep 17 00:00:00 2001 From: varon Date: Fri, 15 Jul 2016 13:33:15 +0200 Subject: [PATCH] Removed OpenTK Examples --- OpenTK.sln | 16 - .../Data/Audio/the_ring_that_fell.wav | Bin 129000 -> 0 bytes Source/Examples/Data/Poem.txt | 51 - Source/Examples/Data/Shaders/CubeMap_FS.glsl | 9 - Source/Examples/Data/Shaders/CubeMap_VS.glsl | 10 - .../Data/Shaders/JuliaSet_SM2_FS.glsl | 66 - .../Data/Shaders/JuliaSet_SM3_FS.glsl | 41 - Source/Examples/Data/Shaders/JuliaSet_VS.glsl | 4 - Source/Examples/Data/Shaders/Parallax_FS.glsl | 57 - Source/Examples/Data/Shaders/Parallax_VS.glsl | 35 - Source/Examples/Data/Shaders/Picking_FS.glsl | 8 - Source/Examples/Data/Shaders/Picking_VS.glsl | 9 - Source/Examples/Data/Shaders/Simple_FS.glsl | 5 - Source/Examples/Data/Shaders/Simple_VS.glsl | 8 - .../Data/Textures/JuliaColorTable.bmp | Bin 104 -> 0 bytes .../Textures/Swizzled Textures License.txt | 18 - Source/Examples/Data/Textures/cursor.png | Bin 755 -> 0 bytes .../Examples/Data/Textures/earth-cubemap.dds | Bin 786560 -> 0 bytes Source/Examples/Data/Textures/logo-dark.jpg | Bin 28974 -> 0 bytes Source/Examples/Data/Textures/logo.jpg | Bin 41793 -> 0 bytes Source/Examples/Data/Textures/metal.jpg | Bin 101340 -> 0 bytes .../Textures/swizzled-rock-diffuse-height.dds | Bin 349648 -> 0 bytes .../Textures/swizzled-rock-normal-gloss.dds | Bin 87536 -> 0 bytes Source/Examples/DependencyLoader.cs | 90 -- Source/Examples/ExampleAttribute.cs | 59 - Source/Examples/ExampleBrowser.Designer.cs | 321 ----- Source/Examples/ExampleBrowser.cs | 447 ------- Source/Examples/ExampleBrowser.resx | 138 --- Source/Examples/ExampleInfo.cs | 26 - Source/Examples/IExample.cs | 23 - Source/Examples/Main.cs | 128 -- Source/Examples/OpenAL/1.1/Parrot.Designer.cs | 283 ----- Source/Examples/OpenAL/1.1/Parrot.cs | 239 ---- Source/Examples/OpenAL/1.1/Parrot.resx | 132 -- Source/Examples/OpenAL/1.1/Parrot.rtf | Bin 2007 -> 0 bytes Source/Examples/OpenAL/1.1/PlayStatic.cs | 83 -- Source/Examples/OpenAL/1.1/Playback.cs | 112 -- Source/Examples/OpenAL/1.1/Playback.rtf | Bin 803 -> 0 bytes .../Examples/OpenAL/1.1/StreamingPlayback.cs | 94 -- Source/Examples/OpenAL/EFX/EFXReverb.cs | 98 -- .../Examples/OpenAL/Test/OpenALDiagnostics.cs | 632 ---------- .../Examples/OpenAL/Test/TestAudioContext.cs | 203 ---- Source/Examples/OpenCL/VectorAdd.cs | 145 --- Source/Examples/OpenGL/1.x/Anaglyph.cs | 209 ---- Source/Examples/OpenGL/1.x/Anaglyph.rtf | Bin 674 -> 0 bytes Source/Examples/OpenGL/1.x/DisplayLists.cs | 157 --- Source/Examples/OpenGL/1.x/DisplayLists.rtf | Bin 1298 -> 0 bytes .../Examples/OpenGL/1.x/FramebufferObject.cs | 286 ----- .../Examples/OpenGL/1.x/FramebufferObject.rtf | Bin 1382 -> 0 bytes Source/Examples/OpenGL/1.x/ImmediateMode.cs | 192 --- Source/Examples/OpenGL/1.x/ImmediateMode.rtf | Bin 1421 -> 0 bytes .../Examples/OpenGL/1.x/OpenGLDiagnostics.cs | 443 ------- .../Examples/OpenGL/1.x/OpenGLDiagnostics.rtf | Bin 467 -> 0 bytes Source/Examples/OpenGL/1.x/Picking.cs | 323 ----- Source/Examples/OpenGL/1.x/Picking.rtf | Bin 1352 -> 0 bytes Source/Examples/OpenGL/1.x/StencilCSG.cs | 311 ----- Source/Examples/OpenGL/1.x/StencilCSG.rtf | Bin 703 -> 0 bytes Source/Examples/OpenGL/1.x/TextRendering.cs | 265 ---- Source/Examples/OpenGL/1.x/TextRendering.rtf | Bin 808 -> 0 bytes Source/Examples/OpenGL/1.x/TextureMatrix.cs | 175 --- Source/Examples/OpenGL/1.x/TextureMatrix.rtf | Bin 707 -> 0 bytes Source/Examples/OpenGL/1.x/Textures.cs | 151 --- Source/Examples/OpenGL/1.x/Textures.rtf | Bin 1698 -> 0 bytes Source/Examples/OpenGL/1.x/VBODynamic.cs | 212 ---- Source/Examples/OpenGL/1.x/VBODynamic.rtf | Bin 2690 -> 0 bytes Source/Examples/OpenGL/1.x/VBOStatic.cs | 178 --- Source/Examples/OpenGL/1.x/VBOStatic.rtf | Bin 3272 -> 0 bytes Source/Examples/OpenGL/1.x/VertexArrays.cs | 205 ---- Source/Examples/OpenGL/1.x/VertexLighting.cs | 181 --- Source/Examples/OpenGL/2.x/DDSCubeMap.cs | 273 ----- Source/Examples/OpenGL/2.x/GeometryShader.cs | 246 ---- .../OpenGL/2.x/GeometryShaderAdvanced.cs | 1061 ----------------- Source/Examples/OpenGL/2.x/JuliaSetFractal.cs | 307 ----- Source/Examples/OpenGL/2.x/SimpleGLSL.cs | 293 ----- .../Examples/OpenGL/2.x/SwizzledParallax.cs | 380 ------ Source/Examples/OpenGL/3.x/HelloGL3.cs | 233 ---- Source/Examples/OpenGLES/1.1/SimpleWindow.cs | 186 --- .../Examples/OpenGLES/2.0/SimpleWindow20.cs | 134 --- Source/Examples/OpenGLES/SimpleWindow20.cs | 0 Source/Examples/OpenTK.Examples.csproj | 688 ----------- .../OpenTK/Fonts/FontRenderingAdvanced.cs | 161 --- .../Fonts/FontRenderingBasic.Designer.cs | 96 -- .../OpenTK/Fonts/FontRenderingBasic.cs | 132 -- .../OpenTK/Fonts/FontRenderingBasic.resx | 123 -- .../OpenTK/Fonts/FontRenderingBasic.rtf | Bin 3263 -> 0 bytes .../GLControl/DerivedGLControl.Designer.cs | 37 - .../OpenTK/GLControl/DerivedGLControl.cs | 51 - .../OpenTK/GLControl/DerivedGLControl.resx | 120 -- .../GLControl/GLControlGameLoop.Designer.cs | 60 - .../OpenTK/GLControl/GLControlGameLoop.cs | 243 ---- .../OpenTK/GLControl/GLControlGameLoop.resx | 120 -- .../GLControl/GLControlSimple.Designer.cs | 110 -- .../OpenTK/GLControl/GLControlSimple.cs | 94 -- .../OpenTK/GLControl/GLControlSimple.resx | 120 -- .../OpenTK/GLControl/GLControlSimple.rtf | Bin 1767 -> 0 bytes .../GLControl/MultipleGLControls.Designer.cs | 74 -- .../OpenTK/GLControl/MultipleGLControls.cs | 35 - .../OpenTK/GLControl/MultipleGLControls.resx | 120 -- .../OpenTK/GLWidget/GLWidgetSimple.cs | 152 --- .../OpenTK/GameWindow/GameWindowMsaa.cs | 136 --- .../OpenTK/GameWindow/GameWindowMsaa.rtf | Bin 1408 -> 0 bytes .../OpenTK/GameWindow/GameWindowSimple.cs | 135 --- .../OpenTK/GameWindow/GameWindowSimple.rtf | Bin 1558 -> 0 bytes .../OpenTK/GameWindow/GameWindowThreaded.cs | 319 ----- .../OpenTK/GameWindow/GameWindowThreaded.rtf | Bin 1874 -> 0 bytes .../OpenTK/GameWindow/MouseCursorSimple.cs | 224 ---- .../OpenTK/GameWindow/MouseCursorSimple.rtf | Bin 991 -> 0 bytes .../Examples/OpenTK/Test/BasicMouseInput.cs | 123 -- .../OpenTK/Test/BlittableValueTypes.cs | 79 -- .../OpenTK/Test/BlittableValueTypes.rtf | Bin 1290 -> 0 bytes .../OpenTK/Test/Color4Serialization.cs | 32 - .../OpenTK/Test/Extensions.Designer.cs | 236 ---- Source/Examples/OpenTK/Test/Extensions.cs | 250 ---- Source/Examples/OpenTK/Test/Extensions.resx | 129 -- .../Examples/OpenTK/Test/ExternalContext.cs | 111 -- .../Examples/OpenTK/Test/GameWindowStates.cs | 731 ------------ .../Examples/OpenTK/Test/GameWindowStates.rtf | Bin 1099 -> 0 bytes .../Examples/OpenTK/Test/MathSerialization.cs | 68 -- Source/Examples/OpenTK/Test/MathSpeed.cs | 91 -- Source/Examples/OpenTK/Test/MatrixTest.cs | 32 - Source/Examples/OpenTK/Test/Multithreading.cs | 56 - Source/Examples/OpenTK/Test/PointToClient.cs | 37 - .../Examples/OpenTK/Test/TestGraphicsModes.cs | 49 - .../OpenTK/Test/TestResolutionChanges.cs | 57 - .../OpenTK/Test/TestShaderUtf8Support.cs | 238 ---- Source/Examples/Properties/AssemblyInfo.cs | 12 - .../Examples/Properties/Resources.Designer.cs | 173 --- Source/Examples/Properties/Resources.resx | 154 --- Source/Examples/Resources/App.ico | Bin 67646 -> 0 bytes Source/Examples/Resources/Game.ico | Bin 67646 -> 0 bytes Source/Examples/Resources/OpenAL.png | Bin 540 -> 0 bytes Source/Examples/Resources/OpenCL.png | Bin 468 -> 0 bytes Source/Examples/Resources/OpenGL.png | Bin 550 -> 0 bytes Source/Examples/Resources/OpenGLES.png | Bin 605 -> 0 bytes Source/Examples/Resources/OpenTK.png | Bin 499 -> 0 bytes Source/Examples/Resources/v1x.png | Bin 544 -> 0 bytes Source/Examples/Resources/v2x.png | Bin 624 -> 0 bytes Source/Examples/Resources/v3x.png | Bin 710 -> 0 bytes Source/Examples/Resources/v4x.png | Bin 607 -> 0 bytes Source/Examples/SamplesTreeViewSorter.cs | 76 -- Source/Examples/Shapes/Base/DrawableShape.cs | 181 --- Source/Examples/Shapes/Base/VertexStructs.cs | 36 - Source/Examples/Shapes/Capsule.cs | 110 -- Source/Examples/Shapes/ChamferCube.cs | 280 ----- Source/Examples/Shapes/Helpers/Chunk.cs | 82 -- Source/Examples/Shapes/Helpers/MengerCube.cs | 420 ------- .../Shapes/Helpers/TetrahedronFace.cs | 230 ---- Source/Examples/Shapes/Helpers/VboShape.cs | 27 - Source/Examples/Shapes/KochTetrahedron.cs | 71 -- Source/Examples/Shapes/MengerSponge.cs | 116 -- Source/Examples/Shapes/Old/Cube.cs | 75 -- Source/Examples/Shapes/Old/IsoSphere.cs | 54 - Source/Examples/Shapes/Old/Plane.cs | 54 - Source/Examples/Shapes/Old/Shape.cs | 70 -- .../Shapes/Old/SierpinskiTetrahedron.cs | 173 --- Source/Examples/Shapes/SlicedHose.cs | 194 --- Source/Examples/Shapes/SlicedSphere.cs | 196 --- Source/Examples/Shapes/TorusKnot.cs | 128 -- Source/Examples/Shapes/VertexPositionColor.cs | 51 - Source/Examples/TextBoxTraceListener.cs | 71 -- Source/Examples/Utilities.cs | 64 - Source/Examples/Utilities/LoaderDDS.cs | 711 ----------- Source/Examples/Utilities/LoaderGDI.cs | 152 --- Source/Examples/Utilities/LoaderStatics.cs | 50 - Source/Examples/app.manifest | 61 - 165 files changed, 19732 deletions(-) delete mode 100644 Source/Examples/Data/Audio/the_ring_that_fell.wav delete mode 100644 Source/Examples/Data/Poem.txt delete mode 100644 Source/Examples/Data/Shaders/CubeMap_FS.glsl delete mode 100644 Source/Examples/Data/Shaders/CubeMap_VS.glsl delete mode 100644 Source/Examples/Data/Shaders/JuliaSet_SM2_FS.glsl delete mode 100644 Source/Examples/Data/Shaders/JuliaSet_SM3_FS.glsl delete mode 100644 Source/Examples/Data/Shaders/JuliaSet_VS.glsl delete mode 100644 Source/Examples/Data/Shaders/Parallax_FS.glsl delete mode 100644 Source/Examples/Data/Shaders/Parallax_VS.glsl delete mode 100644 Source/Examples/Data/Shaders/Picking_FS.glsl delete mode 100644 Source/Examples/Data/Shaders/Picking_VS.glsl delete mode 100644 Source/Examples/Data/Shaders/Simple_FS.glsl delete mode 100644 Source/Examples/Data/Shaders/Simple_VS.glsl delete mode 100644 Source/Examples/Data/Textures/JuliaColorTable.bmp delete mode 100644 Source/Examples/Data/Textures/Swizzled Textures License.txt delete mode 100644 Source/Examples/Data/Textures/cursor.png delete mode 100644 Source/Examples/Data/Textures/earth-cubemap.dds delete mode 100644 Source/Examples/Data/Textures/logo-dark.jpg delete mode 100644 Source/Examples/Data/Textures/logo.jpg delete mode 100644 Source/Examples/Data/Textures/metal.jpg delete mode 100644 Source/Examples/Data/Textures/swizzled-rock-diffuse-height.dds delete mode 100644 Source/Examples/Data/Textures/swizzled-rock-normal-gloss.dds delete mode 100644 Source/Examples/DependencyLoader.cs delete mode 100644 Source/Examples/ExampleAttribute.cs delete mode 100644 Source/Examples/ExampleBrowser.Designer.cs delete mode 100644 Source/Examples/ExampleBrowser.cs delete mode 100644 Source/Examples/ExampleBrowser.resx delete mode 100644 Source/Examples/ExampleInfo.cs delete mode 100644 Source/Examples/IExample.cs delete mode 100644 Source/Examples/Main.cs delete mode 100644 Source/Examples/OpenAL/1.1/Parrot.Designer.cs delete mode 100644 Source/Examples/OpenAL/1.1/Parrot.cs delete mode 100644 Source/Examples/OpenAL/1.1/Parrot.resx delete mode 100644 Source/Examples/OpenAL/1.1/Parrot.rtf delete mode 100644 Source/Examples/OpenAL/1.1/PlayStatic.cs delete mode 100644 Source/Examples/OpenAL/1.1/Playback.cs delete mode 100644 Source/Examples/OpenAL/1.1/Playback.rtf delete mode 100644 Source/Examples/OpenAL/1.1/StreamingPlayback.cs delete mode 100644 Source/Examples/OpenAL/EFX/EFXReverb.cs delete mode 100644 Source/Examples/OpenAL/Test/OpenALDiagnostics.cs delete mode 100644 Source/Examples/OpenAL/Test/TestAudioContext.cs delete mode 100644 Source/Examples/OpenCL/VectorAdd.cs delete mode 100644 Source/Examples/OpenGL/1.x/Anaglyph.cs delete mode 100644 Source/Examples/OpenGL/1.x/Anaglyph.rtf delete mode 100644 Source/Examples/OpenGL/1.x/DisplayLists.cs delete mode 100644 Source/Examples/OpenGL/1.x/DisplayLists.rtf delete mode 100644 Source/Examples/OpenGL/1.x/FramebufferObject.cs delete mode 100644 Source/Examples/OpenGL/1.x/FramebufferObject.rtf delete mode 100644 Source/Examples/OpenGL/1.x/ImmediateMode.cs delete mode 100644 Source/Examples/OpenGL/1.x/ImmediateMode.rtf delete mode 100644 Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs delete mode 100644 Source/Examples/OpenGL/1.x/OpenGLDiagnostics.rtf delete mode 100644 Source/Examples/OpenGL/1.x/Picking.cs delete mode 100644 Source/Examples/OpenGL/1.x/Picking.rtf delete mode 100644 Source/Examples/OpenGL/1.x/StencilCSG.cs delete mode 100644 Source/Examples/OpenGL/1.x/StencilCSG.rtf delete mode 100644 Source/Examples/OpenGL/1.x/TextRendering.cs delete mode 100644 Source/Examples/OpenGL/1.x/TextRendering.rtf delete mode 100644 Source/Examples/OpenGL/1.x/TextureMatrix.cs delete mode 100644 Source/Examples/OpenGL/1.x/TextureMatrix.rtf delete mode 100644 Source/Examples/OpenGL/1.x/Textures.cs delete mode 100644 Source/Examples/OpenGL/1.x/Textures.rtf delete mode 100644 Source/Examples/OpenGL/1.x/VBODynamic.cs delete mode 100644 Source/Examples/OpenGL/1.x/VBODynamic.rtf delete mode 100644 Source/Examples/OpenGL/1.x/VBOStatic.cs delete mode 100644 Source/Examples/OpenGL/1.x/VBOStatic.rtf delete mode 100644 Source/Examples/OpenGL/1.x/VertexArrays.cs delete mode 100644 Source/Examples/OpenGL/1.x/VertexLighting.cs delete mode 100644 Source/Examples/OpenGL/2.x/DDSCubeMap.cs delete mode 100644 Source/Examples/OpenGL/2.x/GeometryShader.cs delete mode 100644 Source/Examples/OpenGL/2.x/GeometryShaderAdvanced.cs delete mode 100644 Source/Examples/OpenGL/2.x/JuliaSetFractal.cs delete mode 100644 Source/Examples/OpenGL/2.x/SimpleGLSL.cs delete mode 100644 Source/Examples/OpenGL/2.x/SwizzledParallax.cs delete mode 100644 Source/Examples/OpenGL/3.x/HelloGL3.cs delete mode 100644 Source/Examples/OpenGLES/1.1/SimpleWindow.cs delete mode 100644 Source/Examples/OpenGLES/2.0/SimpleWindow20.cs delete mode 100644 Source/Examples/OpenGLES/SimpleWindow20.cs delete mode 100644 Source/Examples/OpenTK.Examples.csproj delete mode 100644 Source/Examples/OpenTK/Fonts/FontRenderingAdvanced.cs delete mode 100644 Source/Examples/OpenTK/Fonts/FontRenderingBasic.Designer.cs delete mode 100644 Source/Examples/OpenTK/Fonts/FontRenderingBasic.cs delete mode 100644 Source/Examples/OpenTK/Fonts/FontRenderingBasic.resx delete mode 100644 Source/Examples/OpenTK/Fonts/FontRenderingBasic.rtf delete mode 100644 Source/Examples/OpenTK/GLControl/DerivedGLControl.Designer.cs delete mode 100644 Source/Examples/OpenTK/GLControl/DerivedGLControl.cs delete mode 100644 Source/Examples/OpenTK/GLControl/DerivedGLControl.resx delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlGameLoop.Designer.cs delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlGameLoop.cs delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlGameLoop.resx delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlSimple.Designer.cs delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlSimple.cs delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlSimple.resx delete mode 100644 Source/Examples/OpenTK/GLControl/GLControlSimple.rtf delete mode 100644 Source/Examples/OpenTK/GLControl/MultipleGLControls.Designer.cs delete mode 100644 Source/Examples/OpenTK/GLControl/MultipleGLControls.cs delete mode 100644 Source/Examples/OpenTK/GLControl/MultipleGLControls.resx delete mode 100644 Source/Examples/OpenTK/GLWidget/GLWidgetSimple.cs delete mode 100644 Source/Examples/OpenTK/GameWindow/GameWindowMsaa.cs delete mode 100644 Source/Examples/OpenTK/GameWindow/GameWindowMsaa.rtf delete mode 100644 Source/Examples/OpenTK/GameWindow/GameWindowSimple.cs delete mode 100644 Source/Examples/OpenTK/GameWindow/GameWindowSimple.rtf delete mode 100644 Source/Examples/OpenTK/GameWindow/GameWindowThreaded.cs delete mode 100644 Source/Examples/OpenTK/GameWindow/GameWindowThreaded.rtf delete mode 100644 Source/Examples/OpenTK/GameWindow/MouseCursorSimple.cs delete mode 100644 Source/Examples/OpenTK/GameWindow/MouseCursorSimple.rtf delete mode 100644 Source/Examples/OpenTK/Test/BasicMouseInput.cs delete mode 100644 Source/Examples/OpenTK/Test/BlittableValueTypes.cs delete mode 100644 Source/Examples/OpenTK/Test/BlittableValueTypes.rtf delete mode 100644 Source/Examples/OpenTK/Test/Color4Serialization.cs delete mode 100644 Source/Examples/OpenTK/Test/Extensions.Designer.cs delete mode 100644 Source/Examples/OpenTK/Test/Extensions.cs delete mode 100644 Source/Examples/OpenTK/Test/Extensions.resx delete mode 100644 Source/Examples/OpenTK/Test/ExternalContext.cs delete mode 100644 Source/Examples/OpenTK/Test/GameWindowStates.cs delete mode 100644 Source/Examples/OpenTK/Test/GameWindowStates.rtf delete mode 100644 Source/Examples/OpenTK/Test/MathSerialization.cs delete mode 100644 Source/Examples/OpenTK/Test/MathSpeed.cs delete mode 100644 Source/Examples/OpenTK/Test/MatrixTest.cs delete mode 100644 Source/Examples/OpenTK/Test/Multithreading.cs delete mode 100644 Source/Examples/OpenTK/Test/PointToClient.cs delete mode 100644 Source/Examples/OpenTK/Test/TestGraphicsModes.cs delete mode 100644 Source/Examples/OpenTK/Test/TestResolutionChanges.cs delete mode 100644 Source/Examples/OpenTK/Test/TestShaderUtf8Support.cs delete mode 100644 Source/Examples/Properties/AssemblyInfo.cs delete mode 100644 Source/Examples/Properties/Resources.Designer.cs delete mode 100644 Source/Examples/Properties/Resources.resx delete mode 100644 Source/Examples/Resources/App.ico delete mode 100644 Source/Examples/Resources/Game.ico delete mode 100644 Source/Examples/Resources/OpenAL.png delete mode 100644 Source/Examples/Resources/OpenCL.png delete mode 100644 Source/Examples/Resources/OpenGL.png delete mode 100644 Source/Examples/Resources/OpenGLES.png delete mode 100644 Source/Examples/Resources/OpenTK.png delete mode 100644 Source/Examples/Resources/v1x.png delete mode 100644 Source/Examples/Resources/v2x.png delete mode 100644 Source/Examples/Resources/v3x.png delete mode 100644 Source/Examples/Resources/v4x.png delete mode 100644 Source/Examples/SamplesTreeViewSorter.cs delete mode 100644 Source/Examples/Shapes/Base/DrawableShape.cs delete mode 100644 Source/Examples/Shapes/Base/VertexStructs.cs delete mode 100644 Source/Examples/Shapes/Capsule.cs delete mode 100644 Source/Examples/Shapes/ChamferCube.cs delete mode 100644 Source/Examples/Shapes/Helpers/Chunk.cs delete mode 100644 Source/Examples/Shapes/Helpers/MengerCube.cs delete mode 100644 Source/Examples/Shapes/Helpers/TetrahedronFace.cs delete mode 100644 Source/Examples/Shapes/Helpers/VboShape.cs delete mode 100644 Source/Examples/Shapes/KochTetrahedron.cs delete mode 100644 Source/Examples/Shapes/MengerSponge.cs delete mode 100644 Source/Examples/Shapes/Old/Cube.cs delete mode 100644 Source/Examples/Shapes/Old/IsoSphere.cs delete mode 100644 Source/Examples/Shapes/Old/Plane.cs delete mode 100644 Source/Examples/Shapes/Old/Shape.cs delete mode 100644 Source/Examples/Shapes/Old/SierpinskiTetrahedron.cs delete mode 100644 Source/Examples/Shapes/SlicedHose.cs delete mode 100644 Source/Examples/Shapes/SlicedSphere.cs delete mode 100644 Source/Examples/Shapes/TorusKnot.cs delete mode 100644 Source/Examples/Shapes/VertexPositionColor.cs delete mode 100644 Source/Examples/TextBoxTraceListener.cs delete mode 100644 Source/Examples/Utilities.cs delete mode 100644 Source/Examples/Utilities/LoaderDDS.cs delete mode 100644 Source/Examples/Utilities/LoaderGDI.cs delete mode 100644 Source/Examples/Utilities/LoaderStatics.cs delete mode 100644 Source/Examples/app.manifest diff --git a/OpenTK.sln b/OpenTK.sln index 4cc0b5d4..ca9ac77c 100644 --- a/OpenTK.sln +++ b/OpenTK.sln @@ -9,11 +9,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTK", "Source\OpenTK\Ope {C426C9D1-8857-4E52-BAC7-4C05EE6070AB} = {C426C9D1-8857-4E52-BAC7-4C05EE6070AB} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTK.Examples", "Source\Examples\OpenTK.Examples.csproj", "{868E37B3-0000-0000-0000-000000000000}" - ProjectSection(ProjectDependencies) = postProject - {75DC22B1-113F-4A66-96B9-2FF8208C10E8} = {75DC22B1-113F-4A66-96B9-2FF8208C10E8} - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTK.GLControl", "Source\GLControl\OpenTK.GLControl.csproj", "{A625BE88-0000-0000-0000-000000000000}" ProjectSection(ProjectDependencies) = postProject {75DC22B1-113F-4A66-96B9-2FF8208C10E8} = {75DC22B1-113F-4A66-96B9-2FF8208C10E8} @@ -25,7 +20,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build.Installer.Nsis", "Ins {650C6F3D-33B5-4216-9536-956AB42C0624} = {650C6F3D-33B5-4216-9536-956AB42C0624} {A625BE88-0000-0000-0000-000000000000} = {A625BE88-0000-0000-0000-000000000000} {75DC22B1-113F-4A66-96B9-2FF8208C10E8} = {75DC22B1-113F-4A66-96B9-2FF8208C10E8} - {868E37B3-0000-0000-0000-000000000000} = {868E37B3-0000-0000-0000-000000000000} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build.Docs", "Documentation\Build.Docs.csproj", "{650C6F3D-33B5-4216-9536-956AB42C0624}" @@ -51,7 +45,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build.Installer.Zip", "Inst {650C6F3D-33B5-4216-9536-956AB42C0624} = {650C6F3D-33B5-4216-9536-956AB42C0624} {A625BE88-0000-0000-0000-000000000000} = {A625BE88-0000-0000-0000-000000000000} {75DC22B1-113F-4A66-96B9-2FF8208C10E8} = {75DC22B1-113F-4A66-96B9-2FF8208C10E8} - {868E37B3-0000-0000-0000-000000000000} = {868E37B3-0000-0000-0000-000000000000} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build.Installer.Nuget", "Installers\Nuget\Build.Installer.Nuget.csproj", "{ADC34399-7613-44D2-90B2-19250F12FE7B}" @@ -97,15 +90,6 @@ Global {A37A7E14-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {A37A7E14-0000-0000-0000-000000000000}.ReleaseMinimal|Any CPU.ActiveCfg = ReleaseMinimal|Any CPU {A37A7E14-0000-0000-0000-000000000000}.ReleaseMinimal|Any CPU.Build.0 = ReleaseMinimal|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU - {868E37B3-0000-0000-0000-000000000000}.DebugMinimal|Any CPU.ActiveCfg = Debug|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Documentation|Any CPU.ActiveCfg = Documentation|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Nsis|Any CPU.ActiveCfg = Nsis|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Nsis|Any CPU.Build.0 = Nsis|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU - {868E37B3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU - {868E37B3-0000-0000-0000-000000000000}.ReleaseMinimal|Any CPU.ActiveCfg = ReleaseMinimal|Any CPU {A625BE88-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A625BE88-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {A625BE88-0000-0000-0000-000000000000}.DebugMinimal|Any CPU.ActiveCfg = DebugMinimal|Any CPU diff --git a/Source/Examples/Data/Audio/the_ring_that_fell.wav b/Source/Examples/Data/Audio/the_ring_that_fell.wav deleted file mode 100644 index e0dd41f3fbcd325302bb93d864c8df26d3bf1e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129000 zcmaI>5L za59_)yZrst5P5Hlc?wGa=4QLlt-5sS+S~t+|A+tKfB66WfB(yW{Gb1~|EK@`|MlM& z|C|5yfBeUP{1^ZE-~GS-WB&JF{^Ni3AODyC@#25{f4gV@|L>o}{r&c4_w;;!bG3Oq zJsh^%{b751czL|Lx!WC|9yd34`@`|!e!JOjcMnewo7K(X@py30-Tm?Y_^@5w-k(nQ zoAvGf_;5Vzwzs#(x6|G2cDucQeAwUleSf~a+a2y7AGg=H_xFc~$L)>VA0H2Q>%0BK zYpN_lT-Oa|Q_a3*?x1C?_{C&H=+fLVd`orm{$=Z54ZdU8# z)5AeyHun$5<6(27QBT@_yV0oqW^;EpSC4t{v&+6luGibWA=usA?zH9TEnAH{>dNln z;r@Pqd$W5qV&1aT#=WQPymYtS-0d`ObGO;-48iv9Za!vQjrZemv-Wgd+jvU@+W>o< z#@!m%`@P@0>gwI*pb;LkJs6qIrV%pkcbnb)gR92ed;Dg#+P}O%u70eJ&-&>0yY1=y zbbEQVd3t}^T(52q&#w>L+x2?$`1!H<DR~o_4(!I<=4x0wOZYt{`$Q8c7AvN{PTHzesy>M`t$YX-xv4K z&o8IjA7{JQ_m_v&x66n3x2OA?@8?IK-rQVV-v9jhu)exjJ^uRGudc3c9)A8jT%NDC zr=LIf=V$BvFwk3`p0Vj@cjOK_v38y z^7;O7^XpvDF3;94f4y%n&aV!ie;%)I*4Mj_U#Huvi|hN3Pks8n zdHsBS(AUlJC)7kdv*I$oU-_O=hfB*e> z@n65~fBp5c)raG|r+)vRSFfLMFPm@Q?;efR-Sx%l`1$#`KKp+6`RBv!?X_8de>&b8 z8PmGEytuu8dVAhnU9b0VzfS9`>zm`p+hKiub^Gx0Y6#A^FK@5M)%kjN|MGdfIJ-GK zzd!A6u2=ilkJFAVJur^_)sNffx0lE5<>lt__3h#2;`;9K<86O^eY1J~`LelLU2k9B zPuuH@o8!yt^X}qe`}q9&d}sXcUp^jJ=hwTZ_h*aldi(Uk?k_G5Z&~cc?c>Wc|FgQ= zKfOKPT;ALr-rf(Zo4d`!>+|8(Q%}#QxMH`iC|a&DH+( zS76c z#|MAk3og9adUJX{Y<736-OKY{^tj`_?m2Q^@9A;9+THITUXEPpP8jj)TfQ>SeEaZp ze}CLu-SL6<2lqWZn(V^E^V9a0%Rat5`0;jodO7luy8|zHFI?;ok59YnTOL(N6Ali? zqqp5`Pp8A-a4Yy6_xJnt&7O-bTukuU@Tw2bg3#UV{`qO|CA-4K-Kq%qa5Mt<_nM=T zJnfO`)rb9FjC*)K?)Mu(=*0hv6Gt(u;B)_c5@a@;B%7FHeF~@z_Z52=~T<&D`H>q(0&h>U?cemY|Pw?XI zW;<4KcXt3(LJ5V)uXz*Sn~kb%zcs9p}Ju5%# zjrhUe!7xwV!yA6yvC2J2ve^K6Tj0&h4<4rr{svsYAlh`iXPS@ut)aa0vsZ2{l>TK8 zI9X4c4RCFZ`)<#;!i+vXce9s!tMJ|jjEQx(-|cr`*U_EUxvuQ?Gf#U<`cUgVW^c70 z^mM=Vsea!-S_x+E>Y8_JhqrjH+qfOW24eY?ajItv-q~-w3_R5sjRdNop?R2hcmz|p z^W6IbL-J!i0xuu78_NlhG&=RWQSx6Os6|Z29DAcV?CILvFddIRzq>s=>L@g2?0m@h z^KMNMY^K@%aQ~p6K6KxxZ}s88fb?m{g6c@aYdG!?+PPt1huwX{$88v;M%@VL z2ue>oAedtpCb(oiRB(bJ%QtU6^C*ExW8T* z(Iq$1r``5$b*oR?{oP7@XH2}Dk8J^+j7^x>?;c+D{Z4E&UpJB)v6Q(SPqM+y)tU`i z%bes%)Y{HGTQ9f3-UG|Ms}X{ld4704n9jrf2?i|ZDX&`@Ve@C`o;>b8W0OK{S6pyy zG~izD|8MUeUl?}NE-Ja)d+g>)aw&peU$QMe%gWIt%lK+_dOvcow=jl9%w=j4gO>GSx36oZDO9;x*z|= z^Xd%8%eA!Rxw0l-n?V*Y<1;)CYS`Zx=PcCZ6=f!jWFxCVW5Vj4cWb1m4`bXJPvM;t z-5>y5p)i)R2SM~mzQ(Q@!vPrHKE0n{<-^kpgT@qy@&M+=_WAV$YTSYt2GU4AzCYbw z!bvZ0R+Tosa1mEmR+ZZ>;8HenbGbe~Kf^oMvg@G6>dvS11Soi8x8@!$l}4D3m!~a| zYvp_D4V=Re!PduTZNIt%k4(?iwUusGuWk-dESP$;e|-m!_^VeYqwNQPeto&x%WIJy zJoM@L{`wN3@C+GV!(#(dvPMZ!D(AH;uemZC-vp-CkTu zah{DMLwaw?d`a_U^~5awc5b@`_<*j%K`YhEO)uOynB3oeYm-VAfI24>&xq% zgvu(A_`bRQd?opK+^r1g%j?Mq-MUShaJ_kad-c>C8SL|3qP3M}c>3C(pZ4-C19{q9 zxjqB<{(OSi?^Y5i11VkDHBD>o=Sg2ySKLxhpJ|%$FXg$FF36Y+WV6hRT>{0>uXF-a za55sd_b;#LpsO{%0lR^MZ||qO%j>PT?AQE_0XJf+jby}tN_ljBeYM&@zddiS479ge znpV-99Oim+dVjs|w$sb=!}`aiPeV_hDtGLyy-iX-IpwXlKXkiBp59&#t4n<`B-fXW z81-E-&vM4E)`N zW%B&`DCv`rdCP^5z3H1Fk(utymqxN&32tc{n|kEn0eV*Oa>(>hE*S;RDyJqELWofC z3F;N$L>V{~WPf;j5@`9xCjfE{89tvxL{LCH7_b}&LfhYO!%?&2)MaBe+Ows~@ zKl4vQR&<^;15kgcYmY_RJid>3$(DA#>4R z*96M-L04S4DZZCilLWeri*Ee+Qh8ZSWkIIfit>^`aiH+)>M{7YZj&^we^1lyG}F~v zmK4bJX^gy{Y8sp8K*3Hciokvv0U`Q;$(@|%i5B+PAnIg?wM)ba5&Fq z)zaq?P%`|JwqqPh7Ijgk%AJ+$d5aM$Hkgb{&=-cE!Aq}8IcKR`Z9p}wZq9u7vy`MUB?@`_Tb>H(9UfTeg0 zSP7=!8RQv8a*}YQipLotW8tq7295-x^D%Fi=14!JRQ=f1$0R@vFks_qRZ0Y0;iK|j zIJ7JU2Db_yT-~RUecW^guizz(oNG@hk@a^EmxY^F0Mpy25mhPt9!!#$E|2qjZ8u_C z(QRF)uOQ^oCw(qS&kA~sr{6=l^Rtfuah|GC2Kx6%L1(>X82`9<#sNC^_eQF&GL8nC zUu%Snm>fqRG5a;90p=AY*TTs%Qu)>yV30A|Vi~C_EAy7x*le>cIo0$@%A_`usY!bD zrMFibK@ctOt{-E3zT6#OJ1iC-FyRE3!bKppmRiVsI%jGfKx=&LI8PCEtuOL{g+Jmv zivwcan&a_tZcfnZI)<&7u{cr7B-&}hiul{L@p#(p;ddHN2zL47Qzk6HWfQm0=SAi4U3MJ%Hupk5ojo`JRdz6MOyg! zVkpEyzBmZO{h>H52p$OH0S9=RYik|U;o*-y9?0O?xeVwHV7lW5Pv9{~v*qqEa{1)b z7RZ3N2Dri~kFrHR`8iY<>E&(KjZVQXxpp7t2G!+EK!8?c4cH>V1V4?PiO>gq@)$Un zZ+>{jnC99|>&?{-EK)1-qM#?&KE7F>US8ZTwCcl+p=#h^b|V)l4@mJmxpq!@qLxMi zi5khD;f%xZUlUNHN~rm*h6GkAGIQyknrjzo{~35@5SGui3s+sU4vuO-O90ov)@Cmo>Qk3t#p|BN-LWB7k#S6*Ho!iX!83x^ z$5?W3Old4whEog%m}MrnpatX3&y^#|eF8?}eAK3qSOP-OMSQnj3IsmZK!#EHUbCu8 z@Kk>u5?DMbtu7FBW!MI4AyT`|(__^++g9P%&y#l)dCg+$LY*Q4wQ)BMjkAETjQ1Eg zXk&cc?uxizp{8jJU6+lFX|WE1hGwl12|Wy25IP6@Ei~*vM{vxaa|zabT?1XFi)G)4 zh?#tGBcKE&__%TB&KjY*$`wp*Z%qrOfjU$(XSu-OJc$6zfT0B=hR1MQBO{L%v|@gA zt++jf10gdQCMvZoPyl%f!!Mj9yji$%iCOswp!x3xY6t`;~&DDj91j> z=m&ASy@=Wf@#I*LAmccc$l75)@~zyN0b9xvrPNlz~Y)i)m2|-r9(P!5ZZ{%Y%jHdUaVCsZSoqL-7AO_^$c?%j<)T7sUx_>eH%x zJOA&kudmU9TO$aNW*mIx_?stu2OnwVWb--lhJq^u z-c1*aoUJYv9B3OyA~8^5@$p$*1L9_xjG$tPpgHoz!Gy&v6K_)tnIu%6=V>*@0D4Sb zt%$jxfys>+yhu67QnsFV3-jrVk4*p;!*IxEKL%)g=b!-?LnBp7mn^Y$uq=64B0nE7 zXP_Ae?^Y@`YjvPVtB)z-Sq~*k*VlWoN~1Ost=&%hUoBMk-WIlpuRVpn}KX zmd|I4D+^#;u+@1|DK-R?cl5YYE8b2#mQdX3I*QWYmsv;7RMVArGYVXSINdyPj%?0t zlPDvWa0wD+L&6H~JRTO8%^)xk9^!WM1O;U2g}mW#JQeb9oiNS9NpV4JlTzgkC2}k| z&t0U9F}fCy7rwmtDNWCkeHuSHf|n_*H9vgn1gWRiPsXBFWq!Dh@v+6UCFM0gL^@o< z_*%=YxM2P!<<*x^Tl$w-Zehd8jEl<}S6)%rUV@kO!&_A}&6e5bYXt)Si_>g1Y9zpu z0}}1W6wRL8HLo~X&Exyq{pI)dV+5bor|@5$nh=A~;xgLgYk9qVzOMiM{qXtg`R?rd zjb&tYo}ceO={NlR{L|{Y{IPod>vey3d3N{u=llNR`_+!zJh|6m)xK1d&KNgtkWzkgdl|NJ=J{rJ9p|A~V8_HFa=^Lc;$y*9pX zuN3w_|9-wXKfm(x)9UPE{rL0Gr`7j!+J(=DtM3E_3e>*G(-l=JVa=l}dgX7l~-_2>KJ)qnlId;jb6aQ@?J z_xks*-M4>V9yI#)?AyiTfByC4x_bIat@E#c-M(tY^&daBuYdh{q#fD3{r#~y`*yzl z{Lgo)kc)>u|9l}LxqAHh>t+4#Z+FksBG>===FgvZfBbQE`1t#6d-46p_OJit{r20x zuAcw?^?3cqAM2Mt4aK(~x3B-Vzwf{O*Ngq@pC8*F-!Atb|M|HiNjd#VEb{G-o71O8 z{PAu3@$>z(`r{mThM^-WG5d$r4~msv=s}bl34{T^d3^ssL38}CG$n)=4)URwSQAX@fdoSIAtjjIoX*S*ULN06hSR@ z^RRdO`m8R2QB*f4QmwmhOzHzId(JI=SS}F#^Dh>N2X7=qPP&(;-TB$h2pn(Du3=^s z8BcrtJaId#JJO!?M~^?>M3WdGp84VmuxH;tjKC`~)Rkz1rn)*`Ma%APE^d&!M`E@0 z6SdjhrGyGs47qGhpRadUl9bcu6Mw$iz5aaOTwVy*WJ*6SB)l)gQkOEJx`-}k8#gpO z?;ob={DP_mk9SV4gyOuE_3=A2I`m(khs%rA-Rb9h40Q4&14(cPl3aYhWq^+xmZ+<` ze6c1Z+A?TslwxIdwSE0m-MApr`*=ysbTCbK=VBHk&R`oLD!tE-#GpYL(_W4PC6G(9Zz@?7A2=R3`V*(Fc9!J?n`*FSFj_^`YD zu|B;KZ=PS=J$=3*u&-|)f4*8xSGUi}`!3BcF28Afem6qr!ovp-ok4$`ZqCl{{CK}U zKQ~g+>>ua%?{6pCwyVRNzFuD3+*8gmrR)9YujA_SQX@Z)OpS%UbCOpF#&W#)PK9YL z(}&%^emre1e_We&SmDRb3)joR+!~=Qbo2D{<8Y;T^8Du;V^E6u^-M$6Vtn47pWRs| zOz#X{eS2Dezs%)6+?-#K`GLC^=ev(jkdgNA6G@-Zyv>rod-(i$xVTbae)JZ`V(Dwl zox%YO!AKsFGFRthOO{O;R1xy#YW+x*1|-n9m7m4o6Hkfy@-%saO7Z*4-Q}ROqCU7A zuD#x!fQZe7t}m72FOW^^^D3Y!J3%V&Pe3$g0VH`5Iq`nTOUoi?VxG$NF+%8DibbK4 zI!Z2tm>39BW@}v#=iENLS<7JwFgNyUp>4OYgsR7l;2(bh^92qRXZw`A3_?+!RQ`*R zMl8U1dr2T&7)E+23=dM&1<+l6SwZ;vYHz#_Xh1M_$=4nMlr8y;ilqAF27RvHk1oWt zVPnYyp6Cb&Gt@aH;U2G?r|GH_qa#2XQk)`66;^R*Ff;`OZp`>m8)FQJ8I;3uWbsF; z9Dw94mhM3w0dU6a`MsB65#RC7tB9)wC@Xa- z4@JtO^uy4BVpQfWXothEhE+NNS|h6z0VOM^ciygSgiTfY?KUHIlu>OI&}6bz1k@LF zLKZGPP`|%Yj-CQqv1+IQvOZ?dIdW4ZZx8CAlRSc_%TtAstE35Ri^$VRnr!Az!6<+n zo)q>~LFAlqk|ix9aU)*adg|t%dYrYbRIIBBC9t#4T*1}C+$4#M*--*hWj$=D4wNOf z7J_AAeSqB3JGlSOTE5rF&EdtGF2e=%E0;b1X8cYE9`t#6w9s zd7JsFa>hE0q`%(Y9dTaO9YFF1JR>_?Q*}I0e^|pxGG$f?VyqG-I{FMa30qQ9dBiER zt!-sJ6-y)-QV~hNR1)H70MTpup?m8oioyD_eiTVOj!5K%UW(X3oE{z);;%#r;XiMg zE{2q%qU=)kI9a3Ql(9W{@0|pIGG?+$IgrQU^=KZfhy$uJ8a?uB9`_)>UK2y9r=pmX z8V&En#rXRce?%CAIE_BnxCo_`81>oX7$J2Au~*(v`6AOdzgYM@4Hr=k8tXFLjfM5V zU92ftko<{#@>>-^&5wb)-8E8{0x=M3zmZA=N*i`O?JianpqwPKD$R)!+UDhju7v^& zKe5HyTNv?nmK~ELdZKT=XTWr=pkNXp!ZHe={FC)`7{ON(uF4dgq35b`kPa!_PDaC~GOnXxrb-*Wj}2%PoxsV1 zNP7|tVN)tY#Es>-RZ#9^T&^0Q$#8>))ok4v0JA2&wwwS>$_bc`3t1xOCD*`&2*L11 zabb7l1*MpUJj;asC9-P>&?p*0U-dW3MB#GSs44==}1K;6f3(>G^2u5 zbk)OXZ7;Xz1OU#Fz>dQD87Fy%V=r7(H&7_lq|7?Ja%GztEOTs4s!Ur>i#tSk9lrf*l8I2NXB4Mq#_lv z>;mmaQ<5rYY8z&`$_lr`6osL(zqCFYgOs861>!Js&PmsFlz$zs6J@>Wg{`3 z30yq2s`p-jWjmx|bsCKTXZ6K(u~1|P$j*yN>!cHtvDzJByq{%K%XG;T7&2dXeOpd> zXBsQ;-&FIMX>6oG5l$^t2N3*Fg1gjX_RB~u$WWI|-$H?{pf^m6MMf`g_k({amI+oo z=%58qFe+^LAdxk87HqmUIos)%?+McH)4DC4rwdZZB6s%7%} zW*3A-sB5u((RbCBo~&hCU|PG<>3HkvVhh*Ha_KKTjfr6{XLSu?%%Pa{V3cdCi+dsf zGx^qXg-8Q!8JQMbJmDAno+vJJwMhkiAt}eCQ8^)=;eKmadWNY?9KxlxY$RGGix(H0 z5?_x=f^uwo32|DgC%HX#T)_a#0bRw%xmtBB*CrKxp-MX!5L2g}Ut>GCElJ9& z2ptS@6bwVQMM)zxsu4mw@JDoEazvo)a@X4BTWv|A7q*OEKT!0%okk!-D79Saz)sfo zjL^#~5;3(IqNj0hWPkyUF+#VbZ!=xPicc*6s7QiY}5XOfq}5GeZS>iQDm$dOe2tn8-zHlhM=&4IMH#kHC%_XLLWAo@@=`KowL zx;(Ykyc>L|F)4()Lf~wr5=o_zq26nZ0qZS+0;y7^DZKxe2uDf0FkQX4jCH8@hG0fW zj^i4aZd&Bgd?k~stUMJhjlu*l+`txakVBdBTO+hgeow9NYXnS}G$4opEac}ax3%ky zDb*;ASgvft(_{~g5Jb*0JvGHvsVRdNz9m?A2-SbSGx>#hTbWH|t1fDk0;LgT;A1;Y z+h{}NHj6C@-<8|oduiX4^)vKr$ux>(II)~2V8g)qp(14U8o!2E(t2`|<20>0Z?p7) zgRbaQo*N`7d9-Nnz@o7!L})-K`2}F(E${78)F<=8vs;Cjw<~|HU}^a@Vi`PzLzR?8 zyrxeUsoQ}D*+Y0Vk%1v=^^M#j6$jHC*@ajqJPAAcW?H3j9DB)rOimL4eTiwTV*)Vb z^7?v^uCaa|QiqCN9Eb1UKtvBn}4NQ~WGnfD+Wvw6%i1MXqF(vJRiU zG>X6o_az4kqK6Jf%^``=$P!px>E#Bzy5~5}*3ocY2#HM9TSu7Ex>-~OrJMmF@?&__ zw1qijN~PE1i*uf)t@V@CWWs&oPL^xBdQfOZ{fF0Q{(Qo0TYXq z+SA6+89ctj%lvt9o~A1_z|=&gBs^x@TaqPlo@nr(VbYxe(}9Vx9YL+yIkHfAVLKW# zi#HPSTB?N2A|GJTX4@*XE|T!HsCDtnqw7J@m7!l z;(%wm`T{Yil4@MkA>eYG5j!YD2!-Zh)Z%g-I0}BE8b^bx_-YLN1UH536_qq5hynm5 zdXgRD>{W|Yg}^J+e&~Rd3K`t?+iD?HWJ80ayA7m0!PP=SX>C-N0K9bt=F*}=^n(h{ zl}rXV-GJsj)%JCHoUO(9Ye4@>dI74m6aN!_s{Dg3uc%aGE-G2c8*uU}EcTh(Qv6XF z=u-I;m^)Y0Lw8@QnY@1*Azgk~M>~^8;J4MF$nQaxGxePhHIi>?Qp!PBN`>!Ah?fco z?@BD^Ka^HJB{8Z-Kb5i+%AOPuuFh;Ew-fvl{8AR(pZ)t1h5x!avjzYC^L2No@~GIl z{^O6^mtWpy5B=+(pSGvlivQP}Vr%8mH-$I>~^@9BTO+_^q}{yeR}e_ubVXS&`ge_T1F;H1lT==+!vJN@~mD#qFE z(=TrE;Bt-+ueo?Z;mRSnY&O-K*K&%`pLISN9+4KuWy3_n*pg zaII1f>X{&rEkJvt(x?B!6M(^FL<6Z{>225P~ zuw|=w2q<_4{Mq0ss0vS`7`72Pu3mYgO=ZKg+F^zAyK^IYRruP>R#1UiCN28sRtceY9?S&uknd*INYo`by{Zgttzi^TKDHZ6~W+}P=tXVlq7CknTxM!IUd z{k@fv5RQZL?Xzp&u+6x_X!0xe)b3*~Y!K>WoF4e+ElKGWed11yDC9I%7w=F9saVq% z!zgCNYMOS9fWP;^Mmq)JEJdp*XjlcLsidQ-*Irl^9ova3X2JB)wUx@!tTRn?ZXL#u z(ok!v$;FOCd2Q@P5(DX2nFRM{LmA3zG|d%x;Ab{Vv_7C+4q#7UnsulRnP~tj5J@Kk zdmU~=v1OrvYq<7FXRzb2qwVV?TjeW$90eD!_eH+P!l3HRl|BIRq{R_ztghbVnawGFupqCPW$cGM;% zWq`BoyX~Z{Gb3S0lJhrPjg*~Nvu8648Jeq+ssg|SY!df+Lp#(F=x;+}eK9XL8wt34 zJu$jHgO-8a#da))wiods7t$t6B(q!>80nylJN~T{`4)OsVTQNLN2cmzq>u(UO)%I# zIw}zf$N}O>>Rz%WHJ0!x1;zBy4mNm&o{tPufO**{kJ4&fbd1&OA)QeGkeSi|gg za<-3={3FyB5~78u+4=XwjFhtz4mPh+(t@FG;pAVn}%axcE0$UB^?Ku~p|Pn^6NkTRnUX zAvl~Tfy~X(h>@LbpTFovh=`5}-SYARXDN4d@=?;F=Hr}>Nzk~y*mUC28uv+qWp-El zH@k>05mXh|JDZ5!DWw+(6RzSwPWLx3;WH%ENFgmP7a2n8Sz@2hSHUGl&(fciORANG zlr33pZHy}qtR|CT%T;HjWXNecc=fdCCmI=2!R@V5wALK+3RvDnF} zs{A89q*}-T$h5)`SY`w(s)L#~>;hD|2D3Wc5BG)hbk35Je-x^hw_Tenz%Y$Ta=8l4 z02nv6$vZBx1pG)k8XjChi0Szm@R>aXlpA@Ngu`@Z&PW&nF}`b3WE85hl?p?wnl-OL zp^>m9&)&fEFdD1Q!Ksedlwn8O92@W)PPbd@GfySjH-jC4w`2-UtAtyiPSy{KBA*v3 zC;~BUwZ4rn7C;by?PL?y9Pm@vpJI8ZhKO~rB5+q+ZxaE}vr)qB)C1>*m;gTt%vc)) zihyp!6M{TIFpdUrJ6DeML7;eR1Qt%oc}yG3;Z$|K-JeI+oTwertY$+nk}d((t>7mH zqHFvJp(5Mp6dGY%1-Pd+Z{Rm3rqDX_k~kv5VrprjwNelp1Z{>|LVXKnoUq-ODF9MI z14zaMcN7u=f8k`!gp`s^sc-93TL-}eAnXfe&%V3%Aa=%rR_be?f?+&0XcT~=Rf0MQ z3EZeL;(s-N)2$EmSI#=Ah)-t@afN(SGQlu5ChI_+V_U zOLA`tASj2sKv)_9`-!nqgtjPZy?24bz`Di)0xhy!AQaD14TL&HA6RHOVB5Q&tF@$E64g>eHavG}Yd#+}}L)JC^C=~%T9fPI>27SH&aGgh;erIORDY3#{-j&y~BP{CL&M0ER|QE@zC`lCZ1r318KK zf^mlkuHo}z+al-MkwSEbN$hkB2&o886EJ&wMC!yT?M&g?M>R2=_e5}V3DYQI&jxMD zY}8*n5fQr5N?|HE0eFEG38U~~j-!Lus`<2qz1n8@P z(rwlODkD%LuO`Q!#VszLBO;|#ova229coN_I1yYD4!&H;ltW4r0QC*sU-<>#HU915 zSQq8|xsQD@wVW?WnKZNgjw6|Ln~>}Gv(bp<%I9T48s+yIR~eX1ExY_CphQl0v`KkO zk)V<_KlT++B1eZ^a9cFNlrETH>%qW|?S~FXM0>l1M zo|;yT( zsy7z+Lmx&k{0uLb<_MBi1FB>+Vj5j-NRVU|Q@CpOD;kKUQ=&+EFk4L;io#OPRUNE~ zp=)c}$Gy$3lNywRr417xD0Jvi)E@=IYI-OSi#!HKBsT_?0Y>LW$kXE{l7lDt1YrnP z?P!7yf@(jE1hY6~zLxTt+(6!$(9ro5=GBO{YY>4iv=aJAzC`l!&l=Z|!5u=YvwJG5 z3DMQ~lw}&K`l8}ts9a^_Y569~@dd1)6BRXrimvTVotH5FEGwA3S)Kxi&z@*bG+A8n zgrmyM(ROLXxWz_FS0^NMuA`ze&Beeac7EXo*_08(8cYmqB0QCw6d=9=MKLhnt<74c zdedI^SO^pH&(C>PnYl1#;vDoe%3D_vH-fB27J3K7h_J3btr4rrBeOR`0)Fg+l9Mh^ z@wCPmDgLby3e(Iq7QLFzO5t34TG{dV8p*Gj%|J>tLE#Mb5rmpX#oEa%J1?+n2R5?R zX_Ur*5q8K66~HK12-^r-p%ASxozVa+y*QNaP$L_7aY@fp;0lflNry1z7h-L9wS3OMh8fs+F15*VH1WzVvwT>>BYe~)6@tmF(5feN> z^VIi%*IZeLAzFf@KGxT894Pf=6`_q~{eVXL+6H`$OEW7-F51dD=4&jTqvOcpIIu>B zjt5d0Lt-$h%50XY5fmagYmWs73zn9pk5wo(F#?OH$~eiwtRqj!AGTGsKDUR?ZcrF! zsr~(4NBTx1KI_P0F9(mRVkI>OBo4M)PpSI&1Zc5er4R3RYzU>aQ)#AT$w!KQOYs*3NDw6Q&fdB7JPw1lTnO{82!fn(fY*L-tsQH*W*D9MUq zQ*qB?gGvjG7)=6i%FyX6;-UtKW#BAyppqjXie3gdaY!RlJ=s%-=>ifLQOGD80%Uw~ zN+8hGaxwl3j0m!3k&So6rQH;uPhMyY!|xfar&Z)`xmY%DR2)n&3vIP^M4B#Vp^Dns&@j7g3|~gb zaxqfTa4dH8cs_2Vg4@b3*$_v=UqQMZ5E9Z|n3k`~`#>WIi%1z|XdQgPZX>GL-CD+P zk~mj^Z=G7N2wj^nvG&$KH$qN*`@<38#5$jf~6~ zxWI_4i_ivN8~5Su(Fo#0ynt)`02dt_@fEea-D+&TOo}&+F%o{%sB#8RTf)m+h1S+h zu3*AUtI#rHOpIloTBF7#ScQNUF!B}mr&wX+{0w{)QVoH(1W^~*u!K^OCMHE_)F|xH zjF?6)uAz@Na)x4Z1A-SG-)*@D`OS=6AFof`ni11D*v1ePLV22{Z&6!?(zHFjCC47fc`LIs@NG>TA3JpBuuhG4-i|H^6;-xT`OS+UBn^dyUMvV40~k zX>3Oo)roO`VrPY}h3*Nz&4f%J;R1~e^>yX`s($)(o6AJ<<}rzoy=5JG4C{dRdNCEQ zs4bKR05{ZEbslV!!rsh;*T6I$hca>EHophlqnF0|`hD}dtKOpzppzLfv;&!XjDHEM zf=nT@5b*$MLmDjf@dyPo6igg=xY%&>3LdH!frX_YVOK+>jm;~Z==Yg;d!Y<1#Fc_i z&;*$(wlY3#Y)rmRVwfHMtq{i7SPTRnMUoW|fVON!l4XL1&zX6K<0$w_J%ozl)3W+! zSwg&i*2N~sye$(lwLueRz0Jri6Vu0y0Atg2Bld++gTC2p^VZ|k*9O0VPA#wrXI4Uh zT0y5>F`@jHD_?J6fxc3HZZ=Vnh>{Dcc*x=LXessdS12NlsM?ReeBde ztM3)V5` z^Pu;jSVGD>Qh~Y$tK@45-rr9*-_B4iuLokF-K%f;aQwjTosfn?#yJB|8|Mt9j9LF6 z;ePvkT2aQ>tN(EQgLIo*CqWIx(w-hC+0Op*`?Udm_RSbK4;%SUydW7ka_mi z7FR#cH{N0>uI}G{zB`%0hU!0^Bk-M8#aqtLR}X*v{do1qxAoiK@1B~5h-}C8`$Li_tPg|ES zj2MBq(hF5jI;g%{fyxSp_4!5^e(Uy=UBYcKuVQoi>`Ot`XYp^ox#asrim}urBhq4P zc0@}dYz8;2)K`hL2x%_*Mh3f;gzS%ZRoUuuO!53$eU$3$+&=4SD(9oWF%NwVFrEVh z2+b~Sq{fY;zZn%AY(zAtQTHgY+fJ1wG_x*7H0N#G*Z0)xDPn9oKGP>OUb=pp@ng{X zmWj3f*T+sVaL|~2)}�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
  • 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 4.0 ) LoopCount = MAXIterations; // skip further iterations for this Pixel - LoopCount++; -} - -// Shader entry point, this is executed per Pixel -void main(void) -{ - XPos = gl_FragCoord.x / SCALINGX - OFFSETX; - YPos = gl_FragCoord.y / SCALINGY - OFFSETY; - XQuad = pow(XPos, 2.0); - YQuad = pow(YPos, 2.0); - TableIndex = -1; - LoopCount = 0; - // the loop is unrolled for SM 2.0 compatibility - if ( LoopCount <= MAXIterations ) Iterate(); // TableIndex==0 - if ( LoopCount > 1 ) discard; // attempt to early-out, will affect ~1/3 of all Pixels - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); - if ( LoopCount <= MAXIterations ) Iterate(); // TableIndex==16 - float FinalTableIndex = float( TableIndex ) / float( MAXIterations ); - - gl_FragColor = texture1D( COLORTABLE, FinalTableIndex ); // lookup texture for output -// gl_FragColor.rgb = vec3(FinalTableIndex); // Debug: output greyscale -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/JuliaSet_SM3_FS.glsl b/Source/Examples/Data/Shaders/JuliaSet_SM3_FS.glsl deleted file mode 100644 index 003068b8..00000000 --- a/Source/Examples/Data/Shaders/JuliaSet_SM3_FS.glsl +++ /dev/null @@ -1,41 +0,0 @@ -#version 120 -// www.OpenTK.net GLSL Julia Set (c) 2008 Christoph Brandtner - -uniform sampler1D COLORTABLE; -uniform float CETX; -uniform float CETY; -uniform float SCALINGX; -uniform float SCALINGY; -uniform float OFFSETX; -uniform float OFFSETY; - -const int MAXIterations = 32; // *must* be > 0 - -void main(void) -{ - float XPos = gl_FragCoord.x / SCALINGX - OFFSETX; - float YPos = gl_FragCoord.y / SCALINGY - OFFSETY; - float XQuad = pow( XPos, 2.0 ); - float YQuad = pow( YPos, 2.0 ); - int TableIndex = -1; - int LoopCount = 0; - while ( LoopCount <= MAXIterations ) - { - YPos = 2.0 * XPos * YPos + CETY; - XPos = XQuad - YQuad + CETX; - XQuad = pow( XPos, 2.0 ); - YQuad = pow( YPos, 2.0 ); - TableIndex++; - if ( (XQuad + YQuad) > 4.0 ) - { - if (TableIndex == 0) - discard; - LoopCount = MAXIterations; - } - LoopCount++; - } - float FinalTableIndex = float( TableIndex ) / float( MAXIterations ); - - gl_FragColor = texture1D( COLORTABLE, FinalTableIndex ); // lookup texture for output - // gl_FragColor.rgb = vec3( FinalTableIndex ); // Debug: output greyscale -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/JuliaSet_VS.glsl b/Source/Examples/Data/Shaders/JuliaSet_VS.glsl deleted file mode 100644 index cbee9423..00000000 --- a/Source/Examples/Data/Shaders/JuliaSet_VS.glsl +++ /dev/null @@ -1,4 +0,0 @@ -void main(void) -{ - gl_Position = ftransform(); // gl_ModelViewProjectionMatrix * gl_Vertex; -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/Parallax_FS.glsl b/Source/Examples/Data/Shaders/Parallax_FS.glsl deleted file mode 100644 index ea259a47..00000000 --- a/Source/Examples/Data/Shaders/Parallax_FS.glsl +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2008 the OpenTK Team. See license.txt for legal bla - -// Material uniforms -uniform sampler2D Material_DiffuseAndHeight; -uniform sampler2D Material_NormalAndGloss; -uniform vec3 Material_ScaleBiasShininess; // x=Scale, y=Bias, z=Shininess - -// Light uniforms -uniform vec3 Light_DiffuseColor; -uniform vec3 Light_SpecularColor; - -// from VS -varying vec3 VaryingLightVector; -varying vec3 VaryingEyeVector; - -vec3 normal; - -void main() -{ - vec3 lightVector = normalize( VaryingLightVector ); - vec3 eyeVector = normalize( VaryingEyeVector ); - - // first, find the parallax displacement by reading only the height map - float parallaxOffset = texture2D( Material_DiffuseAndHeight, gl_TexCoord[0].st ).a * - Material_ScaleBiasShininess.x - Material_ScaleBiasShininess.y; - vec2 newTexCoords = gl_TexCoord[0].st + ( parallaxOffset * eyeVector.xy ); // displace texcoords according to viewer - - // knowing the displacement, read RGB, Normal and Gloss - vec3 diffuseColor = texture2D( Material_DiffuseAndHeight, newTexCoords.st ).rgb; - vec4 temp = texture2D( Material_NormalAndGloss, newTexCoords.st ); - - // build a usable normal vector - normal.xy = temp.ag * 2.0 - 1.0; // swizzle alpha and green to x/y and scale to [-1..+1] - normal.z = sqrt( 1.0 - normal.x*normal.x - normal.y*normal.y ); // z = sqrt(1-x^2-y^2) - - // move other properties to be better readable - float gloss = temp.r; - -// float alpha = temp.b; -// if ( alpha < 0.2 ) // optimization: should move this test before reading RGB texture -// discard; - - // tweaked phong lighting - float lambert = max( dot( lightVector, normal ), 0.0 ); - - gl_FragColor = vec4( Light_DiffuseColor * diffuseColor, 1.0 ) * - lambert; - - if ( lambert > 0.0 ) - { - float specular = pow( - clamp( dot( reflect( -lightVector, normal ), eyeVector ), 0.0, 1.0 ), - Material_ScaleBiasShininess.z ); - - gl_FragColor += vec4( Light_SpecularColor * diffuseColor, 1.0 ) * ( specular * gloss ); - } -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/Parallax_VS.glsl b/Source/Examples/Data/Shaders/Parallax_VS.glsl deleted file mode 100644 index 49268be8..00000000 --- a/Source/Examples/Data/Shaders/Parallax_VS.glsl +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2008 the OpenTK Team. See license.txt for legal bla - -// custom vertex attribute -attribute vec3 AttributeTangent; - -// world uniforms -uniform vec3 Light_Position; -uniform vec3 Camera_Position; - -// MUST be written to for FS -varying vec3 VaryingLightVector; -varying vec3 VaryingEyeVector; - -void main() -{ - gl_Position = ftransform(); - gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - - vec3 nor = normalize( gl_NormalMatrix * gl_Normal ); - vec3 tan = normalize( gl_NormalMatrix * AttributeTangent ); - vec3 bi = cross(nor, tan); - - // need positions in tangent space - vec3 vertex = vec3( gl_ModelViewMatrix * gl_Vertex ); - - vec3 temp = Light_Position - vertex; - VaryingLightVector.x = dot(temp, tan); // optimization, calculate dot products rather than building TBN matrix - VaryingLightVector.y = dot(temp, bi); - VaryingLightVector.z = dot(temp, nor); - - temp = Camera_Position - vertex; - VaryingEyeVector.x = dot(temp, tan); - VaryingEyeVector.y = dot(temp, bi); - VaryingEyeVector.z = dot(temp, nor); -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/Picking_FS.glsl b/Source/Examples/Data/Shaders/Picking_FS.glsl deleted file mode 100644 index f4e2af63..00000000 --- a/Source/Examples/Data/Shaders/Picking_FS.glsl +++ /dev/null @@ -1,8 +0,0 @@ -#version 120 - -flat varying vec4 vColor; - -void main(void) -{ - gl_FragColor = vColor; -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/Picking_VS.glsl b/Source/Examples/Data/Shaders/Picking_VS.glsl deleted file mode 100644 index 0deb5328..00000000 --- a/Source/Examples/Data/Shaders/Picking_VS.glsl +++ /dev/null @@ -1,9 +0,0 @@ -#version 120 - -flat varying vec4 vColor; // must be flat, cannot have this interpolated in any way - -void main(void) -{ - vColor = gl_Color; - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // ftransform(); -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/Simple_FS.glsl b/Source/Examples/Data/Shaders/Simple_FS.glsl deleted file mode 100644 index 85e2a856..00000000 --- a/Source/Examples/Data/Shaders/Simple_FS.glsl +++ /dev/null @@ -1,5 +0,0 @@ -/* Copies incoming fragment color without change. */ -void main() -{ - gl_FragColor = gl_Color; -} \ No newline at end of file diff --git a/Source/Examples/Data/Shaders/Simple_VS.glsl b/Source/Examples/Data/Shaders/Simple_VS.glsl deleted file mode 100644 index b0fc2a6f..00000000 --- a/Source/Examples/Data/Shaders/Simple_VS.glsl +++ /dev/null @@ -1,8 +0,0 @@ -/* Copies incoming vertex color without change. - * Applies the transformation matrix to vertex position. - */ -void main() -{ - gl_FrontColor = gl_Color; - gl_Position = ftransform(); -} \ No newline at end of file diff --git a/Source/Examples/Data/Textures/JuliaColorTable.bmp b/Source/Examples/Data/Textures/JuliaColorTable.bmp deleted file mode 100644 index d99204f99e5121ab93f0b22ccc56293e622b1eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmZ?r&0v54Ga#h_!~#If2*wgX5(0#{85lqq2BvWZtd#USWaM`{IPhJ0$oDC}Usu|_ j-J$d3i2S{a@{jHty?PV!`FripKg<67JM-`V3kC)NSuh|N diff --git a/Source/Examples/Data/Textures/Swizzled Textures License.txt b/Source/Examples/Data/Textures/Swizzled Textures License.txt deleted file mode 100644 index 59a5c554..00000000 --- a/Source/Examples/Data/Textures/Swizzled Textures License.txt +++ /dev/null @@ -1,18 +0,0 @@ -The files named "Swizzled *.dds" for the Parallax mapping demo originate from -http://www.TyphoonLabs.com ShaderDesigner application. Used with permission. - -The Textures have been altered from the layout: - -Diffuse R, Diffuse G, Diffuse B, Gloss -Normal X, Normal Y, Normal Z, Height - -to - -Diffuse R, Diffuse G, Diffuse B, Height -Gloss, Normal Y, Gloss, Normal X - -Additionally, the Textures in this folder have been compressed with a lossy -algorithm (S3TC) and do not reflect the quality of the source Textures. - -Please refer to the above website for unaltered versions of the textures, -or licensing information. diff --git a/Source/Examples/Data/Textures/cursor.png b/Source/Examples/Data/Textures/cursor.png deleted file mode 100644 index 5c7de625ba1a6d3df700731ec449e3b6703e3079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmV~nvf*Z2GTeSbfG@SkHj z#J4J72b@42Ai%G5ev)qCCxG+772p;M?@)Pi$fov;uVUj)cafg`97ZyUDt6s zos?ZJ1L10>XJ9w{j=$CK@cDc!EG%HR+c6A-uI{cl!o5ruuqSR9#vi=naYth3=Z+Ux z+HV0$I(S>4%~4lZhpy|`Y&LXVr@f;+g?~86P$>t+J42lguh)xV7&sgb=H})IJ_@FV z@3jTH;=NCM9ksQ!L?RJ1O(PPC917phId1}n6jj+A92}IDl@%Es9hKSHSqTP%l4s3} z0~fP($ut2&szu!#9)2mYSX9Qx!!kcVFFidyS-};+1zh_Z9~&E!wY4uYIXNMVi;FTa z(4Q3?zyVwW?gKAWi@G^6@kSDfxJ*yKmF4A6GBWZ?tTt;_a0_q-xC?|(_!bU_Wn*JQ zW@ct28eNsCsi~~ssZ(GF&I0Fv^5*8|0uf

    7$gCln{%>sQ1+;wzsx3I_;^>Ex;+D z6ex9RuG{_3`j45W$@==bqN)lvYibf(-?uW3r&hq49KJ%}LLd-unx=`(X2W=IP*GXA znk_sPTk^tbbeFiLudh!+p~q5mx+tDJ4fdmWV7LHxb#?U*kH;gxLm>Ys--c>&aj{*~ lwByMY$t9Oua>?b$@*7iR1I~V|6jlHL002ovPDHLkV1f!}P0#=U diff --git a/Source/Examples/Data/Textures/earth-cubemap.dds b/Source/Examples/Data/Textures/earth-cubemap.dds deleted file mode 100644 index 5f884de571ad65988f4119c611508e3b8b55464d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786560 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

    ldPvc>RVZ_eK9gB)}{F7k;Uv3ko&ivGl!8| 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 z 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%0ALq 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Ð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

    KhbB>@ojHX(V zVS4=RW2ern$kZ(2E$p#fmb5)SB5hTNWJnf${8#D%!V8I42;rdg(y}Id6Cc&tkhHd* zLiK(UQWk3Q(oSiv_+u|#+9AC@PCAOfZ|_&7FO;GBT{>o>5Au6S6Pv8yw;!sw);A{N zXy%rV^{RAG|3~&)SsQ}``G7gJ1U|Co*DbWtA>LnCJt_u&09^OHt5?DSz2O$Q#pKk^$@G_=O-~8Tbec(Us{HdRvX}hWtdFTx-qjZT%{&+ z+cVndkqpdwEK`%ruu>NWL>hsrb#(8F4E3T5%AT_!fFC?t#B1tBmzE_!f1Q8_I7}0swAwIEQGVZ3FtAGz^@_0NP$oJX8b65fHrL@|Y z-%SI!=UME+RS?I!KX>aZg%H=vOlb0g{a!b&ws@+LzON^HDcBdaWup^Z@C()x-niGR zEF9DN51#nf^nIOgl)LvDIs3X^BZOl{$VdDJlbc{)=#1Y@P&V5aUBB7q?+%@fGv zVan|K-ktTGxvs~;SK%qJ;H{8f64K=m`N@?ygT{2WXBOaCtz5VQ?Bdt~f@p_4l&Fqf zCHTSBU7)CT;2)U4N3??-5ubD!3TK0d+cJ1sKWjY}RxvGLxk6 zvTUvZ!+A}YWpyH6Ztm7NO`U`p&$jQV;b`LRgtHOi{TV#R_aPsMo`1GfDm4vi&&tP< zf3Tj$Ok_j;5EGf$e}z2EwS4q}9px*s*ex{M$@VIX&Es^=T$kDFujl;DTxaB`j_S$J zygz&Wwe5$$UUeW|;CAa?fN#QE0G{W7UJ=3bMu2lB-$}FqzQ9_PL%zu&!YlPF~;L3CR>p>-{p%*>TRo`Mpe+zv=Ud_yPwk&}9kW0pJVbN(*pfFv{~)FIiG16n0zc z|Nr)`UIjrYjJgz;B5LUY976h$sI93jngw6Lz`?b>gutb_so5bfZaKE)Blrl~6F8=Q zB@IGDO~Lg%fp|RU-0#;LgQR9>L zl#Fq{*^2w#zxgF_0A3=;xu$HgH0T}{>rhsG&K0@`m^C~O-h=ld^B(*z`2DO8%;`gi zn$u~jsa{`QXM-$Hfe-W#{fiv`m-+qlft=?4TrKRJXdwvtFXIC|fQQI_`0f+9n!^Gb w00Q5^caixHet+h7Z~EGYhW=6iNBy4+uxdUL)7}G(2|)kQKlEQg{lES00Z2)mz5oCK diff --git a/Source/Examples/Data/Textures/logo-dark.jpg b/Source/Examples/Data/Textures/logo-dark.jpg deleted file mode 100644 index 38758e3137a583b8d25a9c4ab0c4eb2ef66bdffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28974 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 ed_$N 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 TO-$73g=&BRm!c8)&+PvIb&dSF diff --git a/Source/Examples/Data/Textures/metal.jpg b/Source/Examples/Data/Textures/metal.jpg deleted file mode 100644 index 9d16ad0591ee0047082be997760124ffbc7e16b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101340 zcmeFa2Ut|gvM9V}1{g9DL?jML6eZ_4AXz{ph={1bFyx$rFa$+Kl%yy~P{4!&Dp61o zM55%JGe}0Fq?v!sAj;lnpL@@_?|bKe?|XaUtW{lI)m>fPtGiZLcZ=)74FLyEscWeN z5C{a&1pffsF#mHkUps36(A5R_0RSKcC?V7U6oe39AQM7EfSEwJ7IJ_9Q-kmbgbsj# zG!XC)fG`8Z1Q;M)gs}XAe?X4@qybZdh!A*%0DugDh!S815Eh2g|E9Ta2N3P1L#8^- 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%0Ad>N> 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

    S)Aq&8_ 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 |=1<1^TayrP(JfWK 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 K1uAANLzSeoz^_%A?w{f7SVFczyK zaP-%@y1=|U1^OcljzbW7tcChFt!y{w1+p;lTAkM+J{hG0KE*PQDz+%-{2y{YX2CDC z9`?Vvo#M;12Z4t3;0J6O$9HW0^y&x=@Oq=5hh;{ZJd!8=YZcUcBR$5a+5hOG&}}o{ zt3`cut4XiYiHp(AWY~D$-kb&X&*ik!%vIZ1IcWCd3o-gfp?^3HdakhV^X>^-?w1y> z!hWHI&8!)SLgLqq{XUpqzEzk#Zp9<`z+uSO$4R4#Tw>lS$OndLy$D`3VG*OG)Sa)~ zLBbw|d>Yrv#7l&4 z2tlZ%YLV)mA(j-Qmn-(1C8{S2lLcA5!@iZe@z_@JZyVOSLVYaLrRSIsqm)>(4fr?0 z?}L8fE+Qei;&)RxUixInw2jdlCa_-px)bFJ``O;twmG_vMA55Y^IJY?FjBdWf1tZp z?CllzGdc()nSucypr=nv5&ZWTVZZ%J$7IO2n+JdMb&oqMNs>7|OH80_-)tf#)^dC^ zgVIVCB}&e(dS*o_yypS%df?BIF1l~~HIYbo?t=QEd8)_0l}EBdsR-VGf2~(P2l|8S zvW{2*IgapeRB-daA{+Fc|Koi7vHDUV{yr{*-NI>T=?npF?X=wqEZ6)%Um7bW z@Ng*F@5tkSLw%MX5=z*Na#KM+ud*OlndGtv1oib#10`IxRX#jlL}*BnBYghe8c&Rq zbF6NPtp`Kn1bm+4B*xG5Roj-bV~A*DuA1c8zg%?Us%?qjFS5o~mvn@yhB`q$vaORi zHh5k;GpKAfOY)4NzAYeB`PKinqT&8i0Y0f)PtAhh@RuRvKe#^DW&LKQKSv0O+5UgW z%pbPpShf-}jn@j3Raw13^d3Evx61H``{41Stc9Bl_08FT=CwZ9Py68+S7nTgi^o?U zARc>ecMG{54fkZNHnV)RmS-+bqF8epkx2_<5D!-YQW0-`B?;(D$ zvkbYM->p!JVZz?~Acnmb_yLR@-JmdH(dk`DpBHL8UCxtx^t-(|W+!*j`i-Xy65&{{ z)yrG{qZuvL&?!gr7&%9mk0V68nka7>3J$6rCmU?8QM9rz7&s*_T-mRA9h^ch_;~~D z(P#7rrYc9D>}#6JOJ*BgTuacS{F4teGyTG5S4R|&DE(!X1h(A}MzrDeV zp5R}B_+vN>`&K#yZEc=c8V>Q^D8088{HJI3dGU(>3-JtIAG!aEA{Hvz)3%<8f2h~8 zvHBPpWo~}G>_kiz%+pkeepj9*_Q|tfzT}Hj%;@fkZy&p@9M4H_(ii0#Bh2N;(-%qr zPY{^5?>pA-@Ho`Z9pKMCw|(c1d_OooKW~iqxvScy&T^N3e;)RGbaKLs7lHpH@_h65 zVGV=sl`NH*vk%#yE*ds5{%{_wh!#EB5B>sI5Pum*(-<_zy9D`tnD=es({$0OJXy&J zxc&mOz%RPiJ-d`jc=QuI4)fV{S^c(VsOaciKF}PszB)hCLNFNNg~Yo+EGilFecqxl z1fSJTlM*<#t{#c?o(v;;V1VDx);h}I{Em+X0ioksFg)dIIn~E*xAmO5rmuS##DzjD{V1WkJ=EtH8HcSxz40_1)Zi^cCwy=a{iWXU z;HbtbLud}U|5&-ksc-gfCCvP=2A3uY-LIAi@r6Lhi?!bvGoe~i_pfn>_^{wU_#EBVNQDL_0OEg=jm;DCKe~~g1(+E4K4tKICsG`@iFxS3m<=^5NuVYwpYp?I z%%GnldFO0&nUOK@y9_tSj}tHtt&w8s^ za>gpqzh2`=$fIQsUq|$WR)K!~7==n>p(nGz&ki0({90T2OSG9x)e(e`K?FUr3jvie zeaTLh2!Hr8_(8Q!J<(SD_hd72ypjKeLKs(|2hRb281P6N`8%Ac-7J*kAm}}8(R3(o zI1c+#Rs8E+%kk7{PZq|5IIb%0b%yyD?7MbnDcp^)3F`gK!ur5ls~y~`$EgC=QkyhM zdA|_&LMiN@>q?5~+v?^L+X1yVxt1)06cj(^Jl+

    Uoihb^w46| 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

    NHhZ``^!g^3|ol-^}Ebh0Vfwz*jJjNxZlyKVQ7R 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

    o`G0{1m{S_){$R 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 diff --git a/Source/Examples/Data/Textures/swizzled-rock-normal-gloss.dds b/Source/Examples/Data/Textures/swizzled-rock-normal-gloss.dds deleted file mode 100644 index 5ca89a84e847d9056c8c11fc431140ae1809cef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87536 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

    c{q@i?b*LUm z2(Rvmcz#n2_?xFOvYHVo0bL3Bcc66l`umTO%|TrGanzjON76p_4&yAcq{R>!v~@4ud^vLM!gw-0ek;Z9+{b2 zH0DU3IzF{mS1q(9`1*Ya40}2Fxof_8i9Cgy*_Z!xWT)lRno!*O^WNMf_=h7WonSHW z$^`p;iLZXl;OKGLN8Q42ru>Kt5mrq}&$BrURz`*2EHmpBlEO9wcV?}0eu43h0-x1& zQt0ujod-4y!1r6ErW# zW@eVAWRap|JWzV=oSuop+Dq}htM0Rs%qhNdY+42M<)gx%ku|@O8?*qgfv;L4M*@F$ zwFtq-dPRKYaTxGJMh|Z!^*=AwTFL363_AsnstD+g2=qs61-v-Mcb_Bye7B&N{iu6f zfs0E?DLvxmrMsEA_ih5-n6r@$_6Q@<*W4}qR@y;7rfY;b*novg3Pv7alW#nc)! z!7uO4V!FxeJjS}7taYxBvTxcy4_U31eSi;bLyP^B7B2*)n6p+6-bW~F^n5?Rm`A&R z%dhh#Qe(`_*0zwXyReLK>=dZTj1wit5^Bjb$3hr`^}qANZ{oj zG@~geZ%!DErlV^x+8N~YAk~^r7--J~r z@ryBM>UZr(0lIXX)iuH=nY?&e?~7f4=c)!k@%ikl++8OvR;Lm@AwPold8_;JH1hfk zjQ(^2d7nf|KCJ)Zpr6chNZi(_-&S(zl(plc4o9Dn=oeIKjqMvX5 z{4(aLICNYbx{LJ|71jM$@4;{(whLkV@7sHCeLE*wyH%~Gcq``5G>h9wd%wr;dVbJu zE66iab0sMcQrra%jmQ&wQBGvC`K*fTyrtyc-{E@a=-{wlH&!v_9^`eejb#&ua0l|r zamFUAb(Jw~D{mAD{%5w{p<3Rr4-$@!om3$*tB?#YwUz}Z6~*=V9t)3*`?FX9?^4)5 zrgB;f;g#brr_ff!Wmgjgh^-J+?72>63bxyifgnzWQY-{I9(@{G3*0&R~llFm?9`J|U|_T%+ZhBoR`d%GE|| z?%oRJowS=lNi&we^BbQZjD-F{@I^LNY_hoz{Z2>}aRYo2jSX9vJ}fWyb5*L3CD_s#vMczg$CvkE=vc#Uvc?ZolBk%|s<2&hEa3-qOI z50lG!#0T|3Ec^|pr^=tpcHVga`rMF-tlnU`Us@wr{t{1D+{^F=z{^vo+`XdmqFQXJo%R~FFN>U!}Bv=3!X7zF%Wn)oHb zD(BApvqeq^_NNFMcGIk^L)Y+Ow7&JY9JHTW zr~a~iK;%fw_fyjHt5y`;W8;TYL-jxS4ivG&e5iu98&z2Z_{Eea1-@}_qaoHUhGQ}} zEIqy{oMV^8A)e^_u>V&6cJA!HDq$~99Y$G28b)dX9}gg-LdDy0oOF~Ls^oKI&4_#V zR)}}Pb~apXe3t?Bb6}ShZYv$-#KpTweLCdq>YjG<`Cfp#AnDGAs0sgFQcB`~@|fMO zZP`Lk-BT*9!Y;9n2X@Pvj4*uVsN@0hKopM@TSe~s-eY)h@fGl$(x}vslM=%O@E2D` zp*|4`=HmnI6o8(m55$-AVY);Hwz04KpZ(o-0#;^F;G>@7xk1o#!^)`RQ6>mBUJnR7 zl;zgdusY>(0XrY`Q_^;Eh#p#-)wiryfCzY)>IOb3!c*Xn>w$m}9KTy2<(1kYHg}*j z7$O>xVb5MwTQXF|=9JtZJ`3kl6QoK>sbX^~p>)g+ebYz!g6X4VHCMy$uaU)q^;?(f z#O4B;t*B7{5h!)vYw9i^R$u2wgZyCd;_A21`0^%3^bxF{HQlMC^U*BV3sca`!16D% zm&Cq~$gX|u&ePd~S_cL`<||6p`;nO%(0o<09umNj+HZF8e?mC&N9UVwaVS-}rb|C} z7VR?@1%H=G<7BI*$hzE`_&s4c%9kE&GhErJOCAwwd14*V#4be)9)3Ky=|QyFnQIr^ zeL$}i_(JcQ1sok5-qUbDSJ_Vq1XS)jiY+8I{9H*dPRm~y9wt&<#V*j4J&w?CR~*6m zYf9x;I%ngUUVRmZQ6DXGcnkS_6sDiI)IG9A8vK1qc&)8SgDo3YZ-fclM23w$y{FX2 z2l2lFm&cDEzY^9}DEP?H>=F8vZ`Xr?fdW5Q+Mo^h>gU&ukKl8)CYztX->@gz`{t}r z2OS71!z{!v*rwyvc7nbilk8#_=cGgjzAuO`wM@|`hXX(CVAqwqsw>~$EhPp1t<~{J zr(zk`dor6(tWII^THoj~Q$3)#!|)f4Sv5Ec=vlSbZiRZubv*;n+f}viX5aFj1^W|P zRgEZ-E z6muQ0{N(aLePbo^+f()CsCxLQz3BG3b^n~NC>?+65BJXLabRbI`Z&+q8kvz>mgg{2^a5s>n9M zXurUjXx|$#4`$*b`K8s=)pN;I&fxcsrw=_-yUkjw;wZFC=*+(tSO4!`1~6E0Fk`Kp zl3GbQjXAH?oA9(B_-`(YbAoLtBEqk)DS84yYd9B(J;{3F*hCk*ARcH#A#)_}(n$q9 zlK<()VR}-M4YrK`(}!^Rv(w~g$8pWEed#441Nr&+_dG1#)mDHQc1!Pl>!)8?Szb#~ zOWp*Zi(R1qMDJt88|2;B$YtyA@1|EF3R?7hr;+XM5(}LxqrSxuUq$KL({<%KbQM3u z?dBgC7&N_VAe_tr@rRw$cYL7#R-^o#VsETlwk4Wi0~NUyaqzH*c@bJVf~H> zW!FfR`kX8__csmmzhV6DY(MD6fZZx&Cvhzi;pL=HQfyF9yE0lyr7^FQZ!LPWl6kS` z!3d_V22tbIoSJLJu=P~|362OFJ7qW~z@6132Ka8278g!flf4pV2m7&ZxL;Uw5Wn6n zHm<#cvqJ6I`kCynvi$4L->+Y$Fg+A1`H!Zu%TqBc`M#$19Wb7Wd3-8aDVtntKRvBD z%)z0=%r;2XixJPY+tI@Z=STY8J|(T+YofLHQ8(t#R}$}?E4!dqo{kq8;EkeCB7gRn z8ZmjbMtCoF>044FBZH^5zf2f-nJ{!W3dgUmp4C@CkU9q;A^yWXA7T+4r&5{saFmR< zGV4?OzdGwBJQ8&AAZoJGv!#i#)PuHFB7NZxy+j&kc8HF_eggi&_t)~WsSa~4v{Nv? zD<#mIM%biyK`-S0-aob6Pi}^2Z4`geZNA}VY^>Dc0#X17W|bdg!U5XY<$KV zbYxU_gTKOLy;Jjj;_siAC8I74@nRgV@092HdGe2J6*6Um^%NpkcCxYWc{Ufp&GC#5 z9SG>lLxOeJiZ0z&wEd3ZIho|sRT~o?Z#&>OLz{domrK<5= z&DAFm*NgUI6ns6JYAY?sqgv6BnzCuVe^M?o8g$Zk?DYh^D-HIKe=c{JES9Y@#-UyX zj}VD@CkcK1eETB^1e_oRsYgd;*!6}5&VQBHr~Ky^y70hLro_okFkLUv_X#(u1b9iS zh|q>sMrO`ycF@R$__E(gbFYajfL8!M1#oBzbh#R{_NYPr=Z#xf91i)WC^je|dQal5 zx9t`b;(;m3h3Qzl=5WurVhblHXPUp$!*su}zWlN70szEh z4fw!Zfxs$He3>z*RsBbY^)~hL%(q|>rD-duM`Bjtk!+GZ*Wh{G3Gy=J!=`8p)xotk ziC0Jr&AEGN!Qc-^UpP~lrx0x*GN5+>^FNY2kGrM<|HH$s$#s7wu!NUQG4cV&(#M`s zs8+`P@F^Q8R?d!WY~C$^<^O<>npb}@*(j&0R1*6>W6;@$J>0Lpas*@cIYJJ z56m<^ko6UYhL-Q=qD&e!hWMb=^8PdLm9IBWV)&RJ{L+?ROV2A1^vV<$Y^>_zB~<4P z2OYS>rVRb6A)a3xvRKH_`o<6Z!(S=D7n@+mFJ(Jf-n?`A(MM{HlFCgNKQ9wiKmO3M zfzeAXw1t6v{QD#X_DPJ22sUHuX_CxHy5X&4{K{zA9*EZ}#f8OuX}cG5PYdcfVfr9P z`wncZ6*4$t4eK?y(^iSTJrj74oWBY6@x+A%W}I(-By)ERNdxeKkMO|?nNEwIMh9PH z9`3o=1^A1>;V|-_6GrKxtpBg1E02fj``_1SVJz`UBxKJ{8&ZlywvzO@#x};zU~E|v zhHqqF#=eiSlslm)$}U=|PhpTDWJCrnsAQSnnSS%%dCk1;%)N8Y`@GNde%{Zssc3iu zylREf@s_8OTHb^Hc0lKRluFTKDVr%&kgKU!vKWH>do98A@W1a7{=QsDfQ7rdDC zyy;DG`DW=78R(a$T|ac@sC^f$Y&B|$2lyivU5_YC7xtTp0Ei}(_o9?V7h%5^_~Py|_l1;Ry#DbgGz+$h9v*{JGRmLLj`>r4rmG-}&MwB5gmLhCiuk z#$#^{)M@<+K0W;VX#)_jM7+WRJV8rz`>ai$!6H#zY)L88KqK!9NtxaaJRKMyncob_NSOT@iaoMWL{$@ z!0*Z3Xtf+48_ML(TF|c{K8Nlc-L43D71c88{c`(97G{xwwVMk_I@y_4eAr|6AykqoE8238wV#Sfqsau40L051vd}q=gtYGUy{C85AfaI zgMaZUd|GL{-wS?SM$KP6xQwvxPH1_h5wQtyeQ=&D3whWd8J)FXbO7|9fpK~GlE%q@ z{x@FdQ|CqAfl(v2J2QJjJ*Ir!k}UyTi41GJPMiAiW_(t(f)@xn!pT<%Hl8X^xS0;0 zkD^&Hu@w7>?;Js|>0zZl2e=+9JuKDJN;E`7s0u7TFwTs2bBv!&ysUZeuYMeh5~elo zrP=?J&-Z_9zMpcfyHb|$iVt1kth*wB*Pxf@1yG8^4viN?IrtY5GMp;+UVxxbo3&sl z&5bnB!fQg#ZC=q9j06JYqJZuSm)N|uXQ}Y1X}1Bs6SzR>1=aIGlLyguL&m4s_qQl+ z$vZdRHBzG`CylV8P_>tj75Z;X2Q9e)yfO|}yyJ&2t(ExPJmB%gWDy5LwYX(#Zw8mV zs8pv5C;8dhzJ`Lg3@VE8I;J{phM`lF)>`yNHC7FQsd5D6q9uan*cz{?Zu=VbU zPw;dD^5oJ;SX=L5TJ$uz2(K_g`uX+67qkDb$CidZ*_?`)7kXtH3-qyANG~ouBLBbn zT?(f!NTT6Q<#7==mA2n01@X$x`=)VS2q^$3=BI95uhler7zAikq8s-NUTN5Q9YKj~ zgMeOqeXMK4VfCl}-pfAh{W{LQzx$q+SrXR;sl7We6?zc%=<5$@(vS4(VE+LDEY|T6 zBe7zH8_XXt26$Yk!u(aQ_8p-r;$DzWKpFnNO^xz>rnyv^zxquij}_N8EqEU|e<`r_ zni>KhgzOEqzMYi<^q>|YXpTRKXUZ$}xtwg}VO(S!xgn}6GF>4D;7L;8dI)sun!wTh z{d%05xe6#FsO^oR#f+Z=qe_AOeFZ)nU1y2v%XY&+KMC++1BAlrI)IqB4>kvJ&37H|jHPqm<2Wfug;pZx=QcxK3^8GT_l2h!o~Jnx+(b zuJj8VKaU}{23kzt*}>la8oA^w1@sI@4<#oRyyPyfH8DO1{1ec%5q?d_-dQ~rpAj8k z*Nc)ocX@gBxCKr9-WXu}D+I+m-K};QYTjPRsbY`Ioe1{%dbwPV-*c%jtqb7uLKnT) z*Dl3uwEWdqNhE~6pgpBjlyBT%>vcnM__25BW6zT$H*Wsbt04sz-#6WU7a+N@4fuYg ztkL_rHX9328fxp_>A)|vVvM(ItL!@w@Er?W0eD^~;I9YHs~U<<4yl3NsQ2{KeldTd z*8u$%PW0Yzy1vTWSpKJM4FLp)8b7sptM9`91LxBpEGjXa5>(Y3N6owbXHXlopW_^d zg|d$;?bjtPxx4(sWJNC!C4sqvhprLs7HFnO)wdW zpdN$wI_Vi{nSDG5B?##GaIrUqZ^I#bWT^Oy38?qN8H6*0cO_{$T|1qtzo|ek(34-W z$$_xgwf%ARt|HJI4XWM<`RK_2c*+a*`dRuX@^-L{dAxs&j~zM&6x+P(TZVUL4sI_U zOKq3IYLw%%B;MS7kbSCmwG>8=Kh5zhRv6++BIQtiK~r^}GnVC#qF+l!sG-9z=tE@9e20MJXraHcCwCe-IpTqOWLPW3Mw z-*eS1-=vh8WCrRH=rM8evocE)xh)-^k9}mq=wf@7_@)8tn6bXU`xUv$Z#Cnj`Qqc? zDp^qwuc6^{YMTk!SAb^W#AO31brPn!EZ03m5Ls@ANoU&w|lyZfz#}S0Zk=ecXE{1~h0rlXiUl zQO*a&#KtR9e@#QVXG%`p&psG8RCvh)0M>Adr?_!|`ySsPd09z2G#Jewu%ceXY)g`| z8ln+pA}#0W?1rCKb3(B+Wliwo6nTN^=VUA^aT08dTfS0Q8>4< zNQ8?O0uO|`Yx7xUy}U@JqTozV7lk^5Ykoz83r1*A4w(pw_%5EbF~2$PD(2+m1()rM z4aL7OG_6)CnYFgIfeJBFZ6TjespGbUC~UxM-m!DWzB#{ZC>Fo4C-Sbev&;;F+Vp)wP-baf_`Y= zzwRPxZ#m4Ujht|kgBt+ey4&i^ts$MlWp8imfa*>p-8)t@PtFwJmsBhc#A{MymGc?% zr5A_SzFYy@3H0$`<>gz3CRMrA%EP&;ii$aoHoEb-|EB6~hSbAoG?WuiexIf}o4)g- zhz1iCk=7uk8|og>ce*z3C&YmHJ1WP}V;By^=eOOGhqX%{=Xm{eNXrvI-<&-L;yoEn z2|p>&^tOLUclO0OFyFaqu}ndNQfbTYr?nP*7)WYJ-N0mB&4I*ayyrMQG6a?Cx%T;* z1sd?V2J^sn1*Zg;jti%qcyTn2&!0VR3{5IO^Ixe%8=V2_i!`_lUUH~+6+PVX#hD-A zGnltlbyGjpgW9OL*H>9!z9RV0N&1ydp3_6b-JsuOJr>ZIxw;{vsZEA7yIw#$L&NqB zU1(f#2K^e8>0A<)VN%Cwkh-(V!2|qw;UceEUS( z5Dr-n&SG!8+;5t`5{wd@4zGqPJ*4y0LuQMDa`2{5ZZuTpQ@tKJ?@NT(2FC@<34*~%*goGD=ULmJ){3he|RnX4_m;Gzr6C`_Q z<;=uO1MqiEeR6&4Y`hbJi5TccEp&I^$T*M{;9V}{v^Co+2I#3B=>Zl;MHs`T4s$xM z+4={-5AF_SS?J1#eq&unV2C}bYVS}5+q4U&NbOlyS4Z0HD_q;UBE(vUYmT$?cc$f<_K~e)&|+K*qMehj$(K&8gD5!dKFHJ~yoM_NfrC9?ET152mZW zYMka6>m!1AI$L*YG+mgX?8@?HjC+FbyjC4D$`bJH zh8J(unka()&@NWVrJ_Bz8N4mR56p4X>j-t4!1{X8BVg~=th^ei{}Qt#28GPdJ%@@X zP(tt*ZthaNcF%T+cz*O6@QVQpZbsI3QcZnO2BfCKD)67_HiPBIgGVo96uzp_MB-TR zxPY96%)~^!KtkoA8+LOO?6MCFB$hH*{HPh>bW9W-?>(SEyvQ=<$Q9PnFh|@*bo=KR!N+S1hu|zRJR;37sh9 z^=t*}>4Rq{bE-?Scda@joZZfosza~h{)ggM6A|e`a)VaB`AGK{l``oQ z{$v!nD)2$i@x?bEG40xICG*O0V_GID50l$~Tez&ayn=$lZC4XbD=UQqW4$5w_VIAm zOiB!6s|-ydPW4ra32A97l)2g6{pb<(;mN?p>pIG2SEl>SFy95uZTfh4AG}P2zX;zO zlaV)&86S!ha&Za>NHGum5WC+4ugmD!#{>57;hP&J`Z}4G=hph<*m!sHfjpt}l5VCF zO9n!moSdk%Q2&{{6rB+qs0WO8d~R&@&~~A&I8e{??yR!=ITK71giM8nAkg1;iJOCi zBRhEIqq@ZLH|N0lKBhtWQ$&++KmvknuPkiFc#BLDJq-ZOL<*k%T2Wv$KoO#|A zjNy{q@(Nz*iq5ys0zG($bCjm5c9n9#>Q(gWGi9d$8^`1$`9ha--FVL~WyXTX(~%Jx zGTC}h%s_GroR2|0`A101wtdXEn;<@M0J{V@RdUZaj*2yaXZ0T9xP#Qo*tHJ6g=to^*MqSG_X*Bn)AZyEX3W&f4de>8j5D(d_pd zy-d9GyX@(MS+a-sVHS}>3$G(~Vw(T>g(~Xf*yjs3OYbX>=rPvKt_QIYvek#-QYVrYeh_Zl9-)S^%+Sn2oJF)pB=)h7q~HK5r;zOSD2sobjbOLgAc`n4;G zP81NXshiYNRBJ*X>6%(;G_b7dRD^*3-kj^0)9D+ij7j+(OMp_m)zQ<19-SDGM=uLuG$0E z>&_|*hq;n)vpTD@fyJ-4)jo?x7Gnak&p%6JysVpCiloPZgmzBxqFvRqj`gA;m;G8= zS}jz&rPD>erP2-z!DKEpIkMwg@MJXXCLuPN*K{R32Ah8&{@)9mRSw~OhO*pzeDa01 z8fu*jbu~{0teaGtQJr68jO?l%URMi0L=Ol2KxSebaaW}|{J!JmyrY7l79>r$38 z9X2$(#q0cB6AHnxyz(a-ui9aDzfU|-&i+4I&A$!OaxOPtE3Q`O1qoWQr~Fgldx0d2 zz!XQ2-XKhA57Q11Pw*x{?*?vQm6+a;be6b7x?WDo!Vp=k1rcBK!3iswB@a~>c$5;; zqJLpUm@$0SiUj&S;k!r)-m_5ed>3y-zy59rhd_gu!UvkaF4M0SvGvi(sQNQTuZuiJ z{w*As;ohfSzg}iBaWThGuWyo>>I^9=!|nbJMfKWdfNx!`G(FvoxqUic2oe+k`~Zp| zijxXwddohu)47^{SAT03%m*mX+eg1h&W`+{AK-=H{86cW;bgl|*P!r2ebnQE@emSV zhUD?T%{sdjC&)hUX59Ggc;a(38oSgD!WYnM^Hun-^`ha=Snh*;Y=HmA!HZ@cl>TwQ zU^0i|zE1mWHxF!$k-@!@rd=R^B*QX4?C;dK{y)(nr ze&xpC^ltF@$>olhUIjNa>xcJD@4+-Qpz?e*#2c&dd5+%!-n0n(DjmOmwjzj@w0!{h z5g2EB&wQi!>6Atb*&(SNG~|rukt2L8|Y>+$EWk0n^SO zt`hK{@SParv7^vlfdiyGu@7K+R%Zw6;#xv5h7yaL6EqeJwW1K7(qfX7-*8h#kj#(9 z6nLju51w55vszpwB?anD>7JjCX1iRgzA*^&ED-ei9Vz=`F2yo_HX#0LSVB|z!J5Sp z3oGqWOXj$)Z3t6fPB$~93z)UhFL`#skag!p_l4y-1CgsKT*mvbQt-@qKer)O!M3KN zFBT{of+;w!F(2@sT~13Y@S6ttPMWXE;)7Z7;%#PvHb}?d&(5sv&bJwxQ=34Kg#uFx zJY9WcOD3K~uU5)dXmMASyE#FxQloxBC;D~srC%L|903F!6PcY!Qkt=cK79*iXA@oTz%4 z36BS225R~3bBYkmMd{PveR6Nk@l(Wr6bBcM_&YFHwlMc{QeBnwO$H1$ph^=yO_H2( zs^pfuN(~GpW_VpR9dxw4wKY2p)+3nlzLztF#m|mM^mFW^brWH-XHS1C-kdryJHrp^ zVB6dUWC=AhmG8kgd^^s=$e3it~{doa)qsKoF3 zs~r=1>z^Uw9+)@<^taM8em){>7WB#;83m5#438@-zt;E7W7__Aco_;pA8MCTB8d&f zW*73{un1=>!{x`m%?{Vie=ECp*P`kY%iwpqjb$bYU7Ln-@FFa*=CiSGyNQv&*wgc6Q5C%foO~?Oxd7M%wHWBxa%DPK;&80Uw zVgP^GX1X4#3PVBnPVH(TiJl3T+%}XZ!p!aFi*gtKIa1hIH2hM(8vxkv)!bhN`P$@! z_q|Vq!^qH>`O4TMY;s=7Ea3CP_c^Ehe#fxBUEm2dxyQaC*vi|*k)Ix_6?&4+${^x?;K6QkoF|#{x=#9GlllC!WD_gp%eUl!L&DXI%3pYAxe!&+=1n?zH^d1=WJ!>u2!c|k z6SEwA5Et`Bxm0%ZWxhz~^=cb51n@PQG8OUXtiXx<41*Yal{2i6+lju47rvLzM9$9voNhx>ULM zS$+|}FQ*<>Cz&X3Q+4K#SeQ0mG;LY0MXVbV?_%qXfY-XwE8B-v@rrjN4of9P?Fs-B b13I^MqU6UKixm|O2H=%++4JlUkc$03K_FCX diff --git a/Source/Examples/DependencyLoader.cs b/Source/Examples/DependencyLoader.cs deleted file mode 100644 index 99bfac77..00000000 --- a/Source/Examples/DependencyLoader.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using OpenTK; - -namespace Examples -{ - class DependencyLoader : IDisposable - { - bool disposed; - readonly List LoadedLibraries = new List(); - - enum TargetCpu - { - x86, - x86_64, - } - - static readonly TargetCpu Cpu = IntPtr.Size == 4 ? TargetCpu.x86 : TargetCpu.x86_64; - - public void LoadDependencies() - { - string path = Path.Combine("Dependencies", Cpu == TargetCpu.x86 ? "x86" : "x64"); - - if (Directory.Exists(path)) - { - if (Configuration.RunningOnWindows) - { - foreach (var file in Directory.GetFiles(path, "*.dll")) - { - IntPtr lib = NativeMethods.LoadLibrary(file); - if (lib == IntPtr.Zero) - { - Debug.Print("Failed to load dependency {0} with {1}", file, - Marshal.GetLastWin32Error()); - } - else - { - LoadedLibraries.Add(lib); - Debug.Print("Loaded dependency {0}", file); - } - } - } - } - } - - static class NativeMethods - { - [DllImport("kernel32.dll", SetLastError = true)] - internal static extern IntPtr LoadLibrary(string dllName); - - [DllImport("kernel32.dll", SetLastError = true)] - internal static extern int FreeLibrary(IntPtr dll); - } - - #region IDisposable Members - - void Dispose(bool manual) - { - if (!disposed) - { - if (manual) - { - foreach (var lib in LoadedLibraries) - { - NativeMethods.FreeLibrary(lib); - } - } - - disposed = true; - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - ~DependencyLoader() - { - Dispose(false); - } - - #endregion - } -} diff --git a/Source/Examples/ExampleAttribute.cs b/Source/Examples/ExampleAttribute.cs deleted file mode 100644 index 00fbb190..00000000 --- a/Source/Examples/ExampleAttribute.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006-2008 the OpenTK team - * See license.txt for licensing details - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Examples -{ - [AttributeUsage(AttributeTargets.Class)] - public class ExampleAttribute : System.Attribute - { - string title; - bool visible = true; - public string Title { get { return title; } internal set { title = value; } } - public readonly ExampleCategory Category; - public readonly string Subcategory; - public int Difficulty; - public string Documentation; - public bool Visible { get { return visible; } set { visible = value; } } - - public ExampleAttribute(string title, ExampleCategory category, string subcategory) - : this(title, category, subcategory, Int32.MaxValue, true) { } - - public ExampleAttribute(string title, ExampleCategory category, string subcategory, int difficulty) - : this(title, category, subcategory, difficulty, true) { } - - public ExampleAttribute(string title, ExampleCategory category, string subcategory, bool visible) - : this(title, category, subcategory, Int32.MaxValue, visible) { } - - public ExampleAttribute(string title, ExampleCategory category, string subcategory, int difficulty, bool visible) - { - this.Title = title; - this.Category = category; - this.Subcategory = subcategory; - this.Difficulty = difficulty; - this.Visible = visible; - } - - public override string ToString() - { - if (Difficulty != 0) - return String.Format("{0} {1}: {2}", Category, Difficulty, Title); - return String.Format("{0}: {1}", Category, Title); - } - } - - public enum ExampleCategory - { - OpenTK = 0, - OpenGL, - OpenAL, - OpenCL, - OpenGLES - } -} diff --git a/Source/Examples/ExampleBrowser.Designer.cs b/Source/Examples/ExampleBrowser.Designer.cs deleted file mode 100644 index 2f38bd30..00000000 --- a/Source/Examples/ExampleBrowser.Designer.cs +++ /dev/null @@ -1,321 +0,0 @@ -namespace Examples -{ - partial class ExampleBrowser - { - ///

    - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.treeViewSamples = new System.Windows.Forms.TreeView(); - this.contextMenuStripSamples = new System.Windows.Forms.ContextMenuStrip(this.components); - this.runSampleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); - this.viewDescriptionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.viewSourceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.imageListSampleCategories = new System.Windows.Forms.ImageList(this.components); - this.tabControlSample = new System.Windows.Forms.TabControl(); - this.tabDescription = new System.Windows.Forms.TabPage(); - this.richTextBoxDescription = new System.Windows.Forms.RichTextBox(); - this.contextMenuStripDescription = new System.Windows.Forms.ContextMenuStrip(this.components); - this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.tabSource = new System.Windows.Forms.TabPage(); - this.richTextBoxSource = new System.Windows.Forms.RichTextBox(); - this.contextMenuStripSource = new System.Windows.Forms.ContextMenuStrip(this.components); - this.copyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.tabPageOutput = new System.Windows.Forms.TabPage(); - this.textBoxOutput = new System.Windows.Forms.TextBox(); - this.contextMenuStripOutput = new System.Windows.Forms.ContextMenuStrip(this.components); - this.copyToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolTipSamples = new System.Windows.Forms.ToolTip(this.components); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.contextMenuStripSamples.SuspendLayout(); - this.tabControlSample.SuspendLayout(); - this.tabDescription.SuspendLayout(); - this.contextMenuStripDescription.SuspendLayout(); - this.tabSource.SuspendLayout(); - this.contextMenuStripSource.SuspendLayout(); - this.tabPageOutput.SuspendLayout(); - this.contextMenuStripOutput.SuspendLayout(); - this.SuspendLayout(); - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(0, 0); - this.splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.treeViewSamples); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.tabControlSample); - this.splitContainer1.Size = new System.Drawing.Size(784, 564); - this.splitContainer1.SplitterDistance = 261; - this.splitContainer1.TabIndex = 0; - // - // treeViewSamples - // - this.treeViewSamples.ContextMenuStrip = this.contextMenuStripSamples; - this.treeViewSamples.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeViewSamples.FullRowSelect = true; - this.treeViewSamples.HideSelection = false; - this.treeViewSamples.HotTracking = true; - this.treeViewSamples.ImageIndex = 0; - this.treeViewSamples.ImageList = this.imageListSampleCategories; - this.treeViewSamples.Indent = 32; - this.treeViewSamples.Location = new System.Drawing.Point(0, 0); - this.treeViewSamples.Name = "treeViewSamples"; - this.treeViewSamples.SelectedImageIndex = 0; - this.treeViewSamples.Size = new System.Drawing.Size(261, 564); - this.treeViewSamples.TabIndex = 0; - this.toolTipSamples.SetToolTip(this.treeViewSamples, "Right-click a sample for more options."); - this.treeViewSamples.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.treeViewSamples_AfterExpand); - this.treeViewSamples.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewSamples_AfterSelect); - this.treeViewSamples.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewSamples_NodeMouseDoubleClick); - this.treeViewSamples.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewSamples_KeyDown); - this.treeViewSamples.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeViewSamples_MouseDown); - // - // contextMenuStripSamples - // - this.contextMenuStripSamples.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.runSampleToolStripMenuItem, - this.toolStripMenuItem1, - this.viewDescriptionToolStripMenuItem, - this.viewSourceToolStripMenuItem}); - this.contextMenuStripSamples.Name = "contextMenuStripSamples"; - this.contextMenuStripSamples.Size = new System.Drawing.Size(170, 76); - this.contextMenuStripSamples.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStripSamples_ItemClicked); - // - // runSampleToolStripMenuItem - // - this.runSampleToolStripMenuItem.Name = "runSampleToolStripMenuItem"; - this.runSampleToolStripMenuItem.Size = new System.Drawing.Size(169, 22); - this.runSampleToolStripMenuItem.Text = "&Run Sample"; - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(166, 6); - // - // viewDescriptionToolStripMenuItem - // - this.viewDescriptionToolStripMenuItem.Name = "viewDescriptionToolStripMenuItem"; - this.viewDescriptionToolStripMenuItem.Size = new System.Drawing.Size(169, 22); - this.viewDescriptionToolStripMenuItem.Text = "View Description"; - // - // viewSourceToolStripMenuItem - // - this.viewSourceToolStripMenuItem.Name = "viewSourceToolStripMenuItem"; - this.viewSourceToolStripMenuItem.Size = new System.Drawing.Size(169, 22); - this.viewSourceToolStripMenuItem.Text = "View Source Code"; - // - // imageListSampleCategories - // - this.imageListSampleCategories.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; - this.imageListSampleCategories.ImageSize = new System.Drawing.Size(35, 35); - this.imageListSampleCategories.TransparentColor = System.Drawing.Color.Transparent; - // - // tabControlSample - // - this.tabControlSample.Controls.Add(this.tabDescription); - this.tabControlSample.Controls.Add(this.tabSource); - this.tabControlSample.Controls.Add(this.tabPageOutput); - this.tabControlSample.Dock = System.Windows.Forms.DockStyle.Fill; - this.tabControlSample.Location = new System.Drawing.Point(0, 0); - this.tabControlSample.Name = "tabControlSample"; - this.tabControlSample.SelectedIndex = 0; - this.tabControlSample.Size = new System.Drawing.Size(519, 564); - this.tabControlSample.TabIndex = 0; - // - // tabDescription - // - this.tabDescription.Controls.Add(this.richTextBoxDescription); - this.tabDescription.Location = new System.Drawing.Point(4, 22); - this.tabDescription.Name = "tabDescription"; - this.tabDescription.Padding = new System.Windows.Forms.Padding(3); - this.tabDescription.Size = new System.Drawing.Size(511, 538); - this.tabDescription.TabIndex = 0; - this.tabDescription.Text = "Description"; - this.tabDescription.UseVisualStyleBackColor = true; - // - // richTextBoxDescription - // - this.richTextBoxDescription.ContextMenuStrip = this.contextMenuStripDescription; - this.richTextBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; - this.richTextBoxDescription.Location = new System.Drawing.Point(3, 3); - this.richTextBoxDescription.Name = "richTextBoxDescription"; - this.richTextBoxDescription.ReadOnly = true; - this.richTextBoxDescription.Size = new System.Drawing.Size(505, 532); - this.richTextBoxDescription.TabIndex = 0; - this.richTextBoxDescription.Text = ""; - this.richTextBoxDescription.MouseDown += new System.Windows.Forms.MouseEventHandler(this.richTextBoxDescription_MouseDown); - // - // contextMenuStripDescription - // - this.contextMenuStripDescription.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.copyToolStripMenuItem}); - this.contextMenuStripDescription.Name = "contextMenuStripDescription"; - this.contextMenuStripDescription.Size = new System.Drawing.Size(103, 26); - this.contextMenuStripDescription.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStripDescription_ItemClicked); - // - // copyToolStripMenuItem - // - this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; - this.copyToolStripMenuItem.Size = new System.Drawing.Size(102, 22); - this.copyToolStripMenuItem.Text = "&Copy"; - // - // tabSource - // - this.tabSource.Controls.Add(this.richTextBoxSource); - this.tabSource.Location = new System.Drawing.Point(4, 22); - this.tabSource.Name = "tabSource"; - this.tabSource.Padding = new System.Windows.Forms.Padding(3); - this.tabSource.Size = new System.Drawing.Size(511, 538); - this.tabSource.TabIndex = 1; - this.tabSource.Text = "Source Code"; - this.tabSource.UseVisualStyleBackColor = true; - // - // richTextBoxSource - // - this.richTextBoxSource.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(242)))), ((int)(((byte)(240))))); - this.richTextBoxSource.ContextMenuStrip = this.contextMenuStripSource; - this.richTextBoxSource.Dock = System.Windows.Forms.DockStyle.Fill; - this.richTextBoxSource.Location = new System.Drawing.Point(3, 3); - this.richTextBoxSource.Name = "richTextBoxSource"; - this.richTextBoxSource.ReadOnly = true; - this.richTextBoxSource.Size = new System.Drawing.Size(505, 532); - this.richTextBoxSource.TabIndex = 0; - this.richTextBoxSource.Text = ""; - this.richTextBoxSource.MouseDown += new System.Windows.Forms.MouseEventHandler(this.richTextBoxSource_MouseDown); - // - // contextMenuStripSource - // - this.contextMenuStripSource.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.copyToolStripMenuItem1}); - this.contextMenuStripSource.Name = "contextMenuStripSource"; - this.contextMenuStripSource.Size = new System.Drawing.Size(103, 26); - this.contextMenuStripSource.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStripSource_ItemClicked); - // - // copyToolStripMenuItem1 - // - this.copyToolStripMenuItem1.Name = "copyToolStripMenuItem1"; - this.copyToolStripMenuItem1.Size = new System.Drawing.Size(102, 22); - this.copyToolStripMenuItem1.Text = "&Copy"; - // - // tabPageOutput - // - this.tabPageOutput.Controls.Add(this.textBoxOutput); - this.tabPageOutput.Location = new System.Drawing.Point(4, 22); - this.tabPageOutput.Name = "tabPageOutput"; - this.tabPageOutput.Padding = new System.Windows.Forms.Padding(3); - this.tabPageOutput.Size = new System.Drawing.Size(511, 538); - this.tabPageOutput.TabIndex = 2; - this.tabPageOutput.Text = "Output"; - this.tabPageOutput.UseVisualStyleBackColor = true; - // - // textBoxOutput - // - this.textBoxOutput.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(242)))), ((int)(((byte)(240))))); - this.textBoxOutput.ContextMenuStrip = this.contextMenuStripOutput; - this.textBoxOutput.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxOutput.Location = new System.Drawing.Point(3, 3); - this.textBoxOutput.MaxLength = 1048576; - this.textBoxOutput.Multiline = true; - this.textBoxOutput.Name = "textBoxOutput"; - this.textBoxOutput.ReadOnly = true; - this.textBoxOutput.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBoxOutput.Size = new System.Drawing.Size(505, 532); - this.textBoxOutput.TabIndex = 0; - // - // contextMenuStripOutput - // - this.contextMenuStripOutput.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.copyToolStripMenuItem2}); - this.contextMenuStripOutput.Name = "contextMenuStripOutput"; - this.contextMenuStripOutput.Size = new System.Drawing.Size(103, 26); - // - // copyToolStripMenuItem2 - // - this.copyToolStripMenuItem2.Name = "copyToolStripMenuItem2"; - this.copyToolStripMenuItem2.Size = new System.Drawing.Size(102, 22); - this.copyToolStripMenuItem2.Text = "&Copy"; - // - // ExampleBrowser - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(784, 564); - this.Controls.Add(this.splitContainer1); - this.Name = "ExampleBrowser"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "The Open Toolkit Sample Browser"; - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - this.splitContainer1.ResumeLayout(false); - this.contextMenuStripSamples.ResumeLayout(false); - this.tabControlSample.ResumeLayout(false); - this.tabDescription.ResumeLayout(false); - this.contextMenuStripDescription.ResumeLayout(false); - this.tabSource.ResumeLayout(false); - this.contextMenuStripSource.ResumeLayout(false); - this.tabPageOutput.ResumeLayout(false); - this.tabPageOutput.PerformLayout(); - this.contextMenuStripOutput.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.TabControl tabControlSample; - private System.Windows.Forms.TabPage tabDescription; - private System.Windows.Forms.TabPage tabSource; - private System.Windows.Forms.RichTextBox richTextBoxDescription; - private System.Windows.Forms.RichTextBox richTextBoxSource; - private System.Windows.Forms.TreeView treeViewSamples; - private System.Windows.Forms.ImageList imageListSampleCategories; - private System.Windows.Forms.ContextMenuStrip contextMenuStripDescription; - private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuStripSource; - private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem1; - private System.Windows.Forms.ContextMenuStrip contextMenuStripSamples; - private System.Windows.Forms.ToolStripMenuItem runSampleToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem viewDescriptionToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem viewSourceToolStripMenuItem; - private System.Windows.Forms.ToolTip toolTipSamples; - private System.Windows.Forms.TabPage tabPageOutput; - private System.Windows.Forms.TextBox textBoxOutput; - private System.Windows.Forms.ContextMenuStrip contextMenuStripOutput; - private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem2; - } -} \ No newline at end of file diff --git a/Source/Examples/ExampleBrowser.cs b/Source/Examples/ExampleBrowser.cs deleted file mode 100644 index 41f303b7..00000000 --- a/Source/Examples/ExampleBrowser.cs +++ /dev/null @@ -1,447 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2009 the Open Toolkit library. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Text; -using System.Reflection; -using System.Windows.Forms; -using OpenTK.Examples.Properties; -using System.Threading; -using System.IO; - -namespace Examples -{ - public partial class ExampleBrowser : Form - { - #region Fields - - //PrivateFontCollection font_collection = new PrivateFontCollection(); - bool show_warning = true; - readonly string SourcePath; - - #endregion - - #region Constructors - - public ExampleBrowser() - { - SourcePath = - FindSourcePath(Directory.GetCurrentDirectory()) ?? - FindSourcePath(Assembly.GetExecutingAssembly().Location); - - Font = SystemFonts.DialogFont; - - InitializeComponent(); - Icon = Resources.App; - - // Windows 6 (Vista) and higher come with Consolas, a high-quality monospace font. Use that or fallback to - // the generic monospace font on other systems. - if (System.Environment.OSVersion.Platform == PlatformID.Win32NT && - System.Environment.OSVersion.Version.Major >= 6) - { - textBoxOutput.Font = richTextBoxSource.Font = new Font("Consolas", 10.0f, FontStyle.Regular); - } - else - { - textBoxOutput.Font = richTextBoxSource.Font = - new Font(FontFamily.GenericMonospace, 10.0f, FontStyle.Regular); - } - } - - #endregion - - #region Protected Members - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - // Add those by hand, because using the designer results in an empty - // image list when cross-compiling on Mono. - imageListSampleCategories.Images.Add("OpenAL", Resources.OpenAL); - imageListSampleCategories.Images.Add("OpenGL", Resources.OpenGL); - imageListSampleCategories.Images.Add("OpenGLES", Resources.OpenGLES); - imageListSampleCategories.Images.Add("OpenCL", Resources.OpenCL); - imageListSampleCategories.Images.Add("OpenTK", Resources.OpenTK); - imageListSampleCategories.Images.Add("1.x", Resources.v1x); - imageListSampleCategories.Images.Add("2.x", Resources.v2x); - imageListSampleCategories.Images.Add("3.x", Resources.v3x); - imageListSampleCategories.Images.Add("4.x", Resources.v4x); - - treeViewSamples.TreeViewNodeSorter = new SamplesTreeViewSorter(); - - LoadSamplesFromAssembly(Assembly.GetExecutingAssembly()); - } - - protected override void OnShown(EventArgs e) - { - if (show_warning) - { - //MessageBox.Show("The new Sample Browser is not complete. Please report any issues at http://www.opentk.com/project/issues.", - // "Work in Progress", MessageBoxButtons.OK, MessageBoxIcon.Information); - show_warning = false; - } - } - - #endregion - - #region Private Members - - #region Events - - #region TreeView - - private void treeViewSamples_AfterSelect(object sender, TreeViewEventArgs e) - { - const string no_docs = "Documentation has not been entered."; - const string no_source = "Source code has not been entered."; - - if (SourcePath != null && e.Node.Tag != null && - !String.IsNullOrEmpty(((ExampleInfo)e.Node.Tag).Attribute.Documentation)) - { - string docs = null; - string source = null; - - ExampleInfo einfo = (ExampleInfo)e.Node.Tag; - string sample = einfo.Attribute.Documentation; - string category = einfo.Attribute.Category.ToString(); - string subcategory = einfo.Attribute.Subcategory; - - string path = Path.Combine(Path.Combine(Path.Combine(SourcePath, category), subcategory), sample); - string sample_rtf = Path.ChangeExtension(path, "rtf"); - string sample_cs = Path.ChangeExtension(path, "cs"); - - if (File.Exists(sample_rtf)) - { - docs = File.ReadAllText(sample_rtf); - } - - if (File.Exists(sample_cs)) - { - source = File.ReadAllText(sample_cs); - } - - if (String.IsNullOrEmpty(docs)) - richTextBoxDescription.Text = String.Format("File {0} not found.", sample_rtf); - else - richTextBoxDescription.Rtf = docs; - - if (String.IsNullOrEmpty(source)) - richTextBoxSource.Text = String.Format("File {0} not found.", sample_cs); - else - richTextBoxSource.Text = source; - } - else - { - richTextBoxDescription.Text = no_docs; - richTextBoxSource.Text = no_source; - } - } - - private void treeViewSamples_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) - { - if (e.Node.Tag != null) - { - ActivateNode(e.Node); - } - } - - private void treeViewSamples_KeyDown(object sender, KeyEventArgs e) - { - // The enter key activates a node (either expands/collapses or executes its sample). - switch (e.KeyCode) - { - case Keys.Enter: - ActivateNode(treeViewSamples.SelectedNode); - e.Handled = true; - e.SuppressKeyPress = true; - break; - } - } - - private void treeViewSamples_MouseDown(object sender, MouseEventArgs e) - { - // Make sure that right-clicking a new node will select that node before displaying - // the context menu. Without this, right-clicking a node does not select it, which - // is completely disorienting. - // As a bonus, make any mouse button select the underlying node, - TreeNode node = treeViewSamples.HitTest(e.Location).Node; - if (node != null) - treeViewSamples.SelectedNode = node; - - // Middle click selects and activates a node (either expands/collapses or executes its sample). - // Right button displays the context menu. - // All other mouse buttons simply select the underlying node. - switch (e.Button) - { - case MouseButtons.Middle: - ActivateNode(node); - break; - - case MouseButtons.Right: - treeViewSamples.ContextMenuStrip.Show(sender as Control, e.Location); - break; - } - } - - private void treeViewSamples_AfterExpand(object sender, TreeViewEventArgs e) - { - foreach (TreeNode child in e.Node.Nodes) - child.EnsureVisible(); - } - - private void contextMenuStripSamples_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - switch (e.ClickedItem.Text) - { - case "&Run Sample": RunSample(this, (ExampleInfo)treeViewSamples.SelectedNode.Tag); break; - case "View Description": tabControlSample.SelectedTab = tabDescription; break; - case "View Source Code": tabControlSample.SelectedTab = tabSource; break; - } - } - - #endregion - - #region Description - - private void richTextBoxDescription_MouseDown(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - richTextBoxDescription.ContextMenuStrip.Show(sender as Control, e.X, e.Y); - } - } - - private void contextMenuStripDescription_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - if (e.ClickedItem.Text == "&Copy") - { - Clipboard.SetText(richTextBoxDescription.SelectedRtf, TextDataFormat.Rtf); - } - } - - #endregion - - #region Source Code - - private void richTextBoxSource_MouseDown(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - richTextBoxSource.ContextMenuStrip.Show(sender as Control, e.X, e.Y); - } - } - - private void contextMenuStripSource_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - if (e.ClickedItem.Text == "&Copy") - { - Clipboard.SetText(richTextBoxSource.SelectedText, TextDataFormat.Text); - } - } - - #endregion - - #endregion - - #region Actions - - void LoadSamplesFromAssembly(Assembly assembly) - { - if (assembly == null) - throw new ArgumentNullException("assembly"); - - Type[] types = assembly.GetTypes(); - foreach (Type type in types) - { - object[] attributes = type.GetCustomAttributes(false); - ExampleAttribute example = null; - foreach (object attr in attributes) - { - if (attr is ExampleAttribute) - { - example = (ExampleAttribute)attr; - - if (example.Visible) - { - // Add this example to the sample TreeView. - // First check whether the ExampleCategory exists in the tree (and add it if it doesn't). - // Then add the example as a child node on this category. - - if (!treeViewSamples.Nodes.ContainsKey(example.Category.ToString())) - { - int category_index = GetImageIndexForSample(imageListSampleCategories, example.Category.ToString(), String.Empty); - treeViewSamples.Nodes.Add(example.Category.ToString(), String.Format("{0} samples", example.Category), - category_index, category_index); - } - - int image_index = GetImageIndexForSample(imageListSampleCategories, example.Category.ToString(), example.Subcategory); - TreeNode node = new TreeNode(example.Title, image_index, image_index); - node.Name = example.Title; - node.Tag = new ExampleInfo(type, example); - treeViewSamples.Nodes[example.Category.ToString()].Nodes.Add(node); - } - } - } - } - - treeViewSamples.Sort(); - } - - void ActivateNode(TreeNode node) - { - if (node == null) - return; - - if (node.Tag == null) - { - if (node.IsExpanded) - node.Collapse(); - else - node.Expand(); - } - else - { - tabControlSample.SelectedTab = tabPageOutput; - textBoxOutput.Clear(); - RunSample(node.TreeView.TopLevelControl, (ExampleInfo)node.Tag); - } - } - - static int GetImageIndexForSample(ImageList list, string category, string subcategory) - { - if (list == null) - throw new ArgumentNullException("list"); - - foreach (string extension in new string[] { "", ".png", ".jpg" }) - { - string name = subcategory.ToString() + extension; - if (list.Images.ContainsKey(name)) - return list.Images.IndexOfKey(name); - - name = category.ToString() + extension; - if (list.Images.ContainsKey(name)) - return list.Images.IndexOfKey(name); - } - - return -1; - } - - void RunSample(Control parent, ExampleInfo e) - { - if (e == null) - return; - - try - { - if (parent != null) - { - parent.Visible = false; - Application.DoEvents(); - } - Trace.WriteLine(String.Format("Launching sample: \"{0}\"", e.Attribute.Title)); - Trace.WriteLine(String.Empty); - - var info = new ProcessStartInfo - { - FileName = Application.ExecutablePath,//.Replace("vshost.exe", String.Empty), - Arguments = e.Example.ToString() - }; - var process = Process.Start(info); - process.WaitForExit(); - } - finally - { - if (parent != null) - { - try - { - textBoxOutput.Text = File.ReadAllText("debug.log"); - } - catch (Exception ex) - { - Debug.Print(ex.ToString()); - } - parent.Visible = true; - parent.Focus(); - Application.DoEvents(); - } - } - - } - - // Tries to detect the path that contains the source for the examples. - static string FindSourcePath(string guess) - { - guess = Path.GetDirectoryName(guess); - - // Typically, our working directory is either "[opentk]/Binaries/OpenTK/[config]" or "[opentk]". - // The desired source path is "[opentk]/Source/Examples/[ExampleCategory]" - if (CheckPath(ref guess)) - return guess; // We were in [opentk] after all - - for (int i = 0; i < 3; i++) - { - DirectoryInfo dir = Directory.GetParent(guess); - if (dir == null || !dir.Exists) - break; - guess = dir.FullName; - } - - if (CheckPath(ref guess)) - return guess; // We were in [opentk]/Binaries/OpenTK/[config] after all - - return null; - } - - static bool CheckPath(ref string path) - { - string guess = path; - if (Directory.Exists(guess)) - { - guess = Path.Combine(guess, "Source"); - if (Directory.Exists(guess)) - { - guess = Path.Combine(guess, "Examples"); - if (Directory.Exists(guess)) - { - // We are have found [opentk]/Source/Examples - path = guess; - return true; - } - } - } - return false; - } - - #endregion - - #endregion - } -} diff --git a/Source/Examples/ExampleBrowser.resx b/Source/Examples/ExampleBrowser.resx deleted file mode 100644 index 16e620ff..00000000 --- a/Source/Examples/ExampleBrowser.resx +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 616, 17 - - - 17, 17 - - - 810, 17 - - - 219, 17 - - - 430, 17 - - - 945, 17 - - \ No newline at end of file diff --git a/Source/Examples/ExampleInfo.cs b/Source/Examples/ExampleInfo.cs deleted file mode 100644 index a7487710..00000000 --- a/Source/Examples/ExampleInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Examples -{ - /// - /// Contains the information necessary to display and launch an example thorugh the ExampleLauncer. - /// - class ExampleInfo - { - public readonly Type Example; - public readonly ExampleAttribute Attribute; - - public ExampleInfo(Type example, ExampleAttribute attr) - { - Example = example; - Attribute = attr; - } - - public override string ToString() - { - return Attribute.ToString(); - } - } -} diff --git a/Source/Examples/IExample.cs b/Source/Examples/IExample.cs deleted file mode 100644 index 92853529..00000000 --- a/Source/Examples/IExample.cs +++ /dev/null @@ -1,23 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK Team. - * This notice may not be removed from any source distribution. - * See license.txt for licensing details. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Examples -{ - /// - /// This interface is is used by the ExampleLauncher to identify OpenTK examples, - /// your applications do not need to implement or use it. - /// - interface IExample - { - void Launch(); - } -} diff --git a/Source/Examples/Main.cs b/Source/Examples/Main.cs deleted file mode 100644 index 6f63e861..00000000 --- a/Source/Examples/Main.cs +++ /dev/null @@ -1,128 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2010 the Open Toolkit library, except where noted. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.IO; -using System.Reflection; -using System.Text; -using System.Windows.Forms; - -using OpenTK; - -namespace Examples -{ - static class Program - { - static void LaunchExample(string type) - { - try - { - if (File.Exists("debug.log")) - File.Delete("debug.log"); - if (File.Exists("trace.log")) - File.Delete("trace.log"); - } - catch (Exception e) - { - Trace.WriteLine(String.Format("Could not access debug.log", e.ToString())); - } - - ToolkitOptions options = ToolkitOptions.Default; - if (type.Contains("GLControl") || type.Contains("Form")) - { - // SDL does not currently support embedding in foreign windows - // such as GLControl. We need to use a native OpenTK.Platform - // backend in that case. This hack is specific to the example-browser - // architecture - you do not need to do anything like this in your - // own code (it will just work). - options = new ToolkitOptions - { - Backend = PlatformBackend.PreferNative - }; - } - - using (TextWriterTraceListener dbg = new TextWriterTraceListener("debug.log")) - using (Toolkit.Init(options)) - { - Trace.Listeners.Add(dbg); - - try - { - var example = Type.GetType(type); - if (example != null) - { - example.InvokeMember("Main", - BindingFlags.InvokeMethod | BindingFlags.Static | - BindingFlags.Public | BindingFlags.NonPublic, - null, null, null); - } - } - catch (Exception e) - { - Trace.WriteLine(String.Format("Exception occured in example {0}: {1}", - type, e.ToString())); - } - - Trace.Listeners.Remove(dbg); - - dbg.Flush(); - dbg.Close(); - } - } - - [STAThread] - public static void Main(string[] args) - { - if (args.Length > 0) - { - LaunchExample(args[0]); - } - else - { - try - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - - using (Form browser = new ExampleBrowser()) - { - Application.Run(browser); - } - } - catch (System.Security.SecurityException e) - { - MessageBox.Show("The Example Launcher failed to start, due to insufficient permissions. This may happen if you execute the application from a network share.", "OpenTK Example Launcher failed to start.", - MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - Trace.WriteLine(e.ToString()); - } - } - } - } -} diff --git a/Source/Examples/OpenAL/1.1/Parrot.Designer.cs b/Source/Examples/OpenAL/1.1/Parrot.Designer.cs deleted file mode 100644 index b50fdab4..00000000 --- a/Source/Examples/OpenAL/1.1/Parrot.Designer.cs +++ /dev/null @@ -1,283 +0,0 @@ -namespace Examples -{ - partial class Parrot - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.comboBox_RecorderSelection = new System.Windows.Forms.ComboBox(); - this.groupBox_RecorderParameters = new System.Windows.Forms.GroupBox(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.numericUpDown_PlaybackGain = new System.Windows.Forms.NumericUpDown(); - this.label_MONO16BIT = new System.Windows.Forms.Label(); - this.label_RINGBUFFER = new System.Windows.Forms.Label(); - this.label_FREQUENCY = new System.Windows.Forms.Label(); - this.numericUpDown_BufferLength = new System.Windows.Forms.NumericUpDown(); - this.numericUpDown_Frequency = new System.Windows.Forms.NumericUpDown(); - this.groupBox_RecordingControls = new System.Windows.Forms.GroupBox(); - this.label_SamplesConsumed = new System.Windows.Forms.Label(); - this.button_Start = new System.Windows.Forms.Button(); - this.timer_GetSamples = new System.Windows.Forms.Timer(this.components); - this.groupBox_RecorderParameters.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_PlaybackGain)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_BufferLength)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_Frequency)).BeginInit(); - this.groupBox_RecordingControls.SuspendLayout(); - this.SuspendLayout(); - // - // comboBox_RecorderSelection - // - this.comboBox_RecorderSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.comboBox_RecorderSelection.FormattingEnabled = true; - this.comboBox_RecorderSelection.Location = new System.Drawing.Point(6, 19); - this.comboBox_RecorderSelection.Name = "comboBox_RecorderSelection"; - this.comboBox_RecorderSelection.Size = new System.Drawing.Size(216, 21); - this.comboBox_RecorderSelection.TabIndex = 0; - // - // groupBox_RecorderParameters - // - this.groupBox_RecorderParameters.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox_RecorderParameters.Controls.Add(this.label2); - this.groupBox_RecorderParameters.Controls.Add(this.label1); - this.groupBox_RecorderParameters.Controls.Add(this.numericUpDown_PlaybackGain); - this.groupBox_RecorderParameters.Controls.Add(this.label_MONO16BIT); - this.groupBox_RecorderParameters.Controls.Add(this.label_RINGBUFFER); - this.groupBox_RecorderParameters.Controls.Add(this.label_FREQUENCY); - this.groupBox_RecorderParameters.Controls.Add(this.numericUpDown_BufferLength); - this.groupBox_RecorderParameters.Controls.Add(this.numericUpDown_Frequency); - this.groupBox_RecorderParameters.Controls.Add(this.comboBox_RecorderSelection); - this.groupBox_RecorderParameters.Location = new System.Drawing.Point(12, 12); - this.groupBox_RecorderParameters.Name = "groupBox_RecorderParameters"; - this.groupBox_RecorderParameters.Size = new System.Drawing.Size(228, 168); - this.groupBox_RecorderParameters.TabIndex = 2; - this.groupBox_RecorderParameters.TabStop = false; - this.groupBox_RecorderParameters.Text = "Recording Device Setup"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(6, 132); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(74, 13); - this.label2.TabIndex = 105; - this.label2.Text = "Sample format"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(6, 102); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(96, 13); - this.label1.TabIndex = 104; - this.label1.Text = "Playback gain (dB)"; - // - // numericUpDown_PlaybackGain - // - this.numericUpDown_PlaybackGain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.numericUpDown_PlaybackGain.Location = new System.Drawing.Point(145, 100); - this.numericUpDown_PlaybackGain.Maximum = new decimal(new int[] { - 64, - 0, - 0, - 0}); - this.numericUpDown_PlaybackGain.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 65536}); - this.numericUpDown_PlaybackGain.Name = "numericUpDown_PlaybackGain"; - this.numericUpDown_PlaybackGain.Size = new System.Drawing.Size(76, 20); - this.numericUpDown_PlaybackGain.TabIndex = 103; - this.numericUpDown_PlaybackGain.ThousandsSeparator = true; - this.numericUpDown_PlaybackGain.Value = new decimal(new int[] { - 4, - 0, - 0, - 0}); - // - // label_MONO16BIT - // - this.label_MONO16BIT.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label_MONO16BIT.AutoSize = true; - this.label_MONO16BIT.Location = new System.Drawing.Point(142, 132); - this.label_MONO16BIT.Name = "label_MONO16BIT"; - this.label_MONO16BIT.Size = new System.Drawing.Size(64, 13); - this.label_MONO16BIT.TabIndex = 102; - this.label_MONO16BIT.Text = "Mono 16-bit"; - // - // label_RINGBUFFER - // - this.label_RINGBUFFER.AutoSize = true; - this.label_RINGBUFFER.Location = new System.Drawing.Point(6, 76); - this.label_RINGBUFFER.Name = "label_RINGBUFFER"; - this.label_RINGBUFFER.Size = new System.Drawing.Size(89, 13); - this.label_RINGBUFFER.TabIndex = 101; - this.label_RINGBUFFER.Text = "Buffer length (ms)"; - // - // label_FREQUENCY - // - this.label_FREQUENCY.AutoSize = true; - this.label_FREQUENCY.Location = new System.Drawing.Point(6, 50); - this.label_FREQUENCY.Name = "label_FREQUENCY"; - this.label_FREQUENCY.Size = new System.Drawing.Size(85, 13); - this.label_FREQUENCY.TabIndex = 100; - this.label_FREQUENCY.Text = "Sample rate (Hz)"; - // - // numericUpDown_BufferLength - // - this.numericUpDown_BufferLength.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.numericUpDown_BufferLength.Location = new System.Drawing.Point(145, 74); - this.numericUpDown_BufferLength.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.numericUpDown_BufferLength.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDown_BufferLength.Name = "numericUpDown_BufferLength"; - this.numericUpDown_BufferLength.Size = new System.Drawing.Size(76, 20); - this.numericUpDown_BufferLength.TabIndex = 2; - this.numericUpDown_BufferLength.ThousandsSeparator = true; - this.numericUpDown_BufferLength.Value = new decimal(new int[] { - 50, - 0, - 0, - 0}); - // - // numericUpDown_Frequency - // - this.numericUpDown_Frequency.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.numericUpDown_Frequency.Location = new System.Drawing.Point(145, 48); - this.numericUpDown_Frequency.Maximum = new decimal(new int[] { - 100000, - 0, - 0, - 0}); - this.numericUpDown_Frequency.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.numericUpDown_Frequency.Name = "numericUpDown_Frequency"; - this.numericUpDown_Frequency.Size = new System.Drawing.Size(76, 20); - this.numericUpDown_Frequency.TabIndex = 1; - this.numericUpDown_Frequency.ThousandsSeparator = true; - this.numericUpDown_Frequency.Value = new decimal(new int[] { - 16000, - 0, - 0, - 0}); - // - // groupBox_RecordingControls - // - this.groupBox_RecordingControls.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox_RecordingControls.Controls.Add(this.label_SamplesConsumed); - this.groupBox_RecordingControls.Controls.Add(this.button_Start); - this.groupBox_RecordingControls.Location = new System.Drawing.Point(12, 186); - this.groupBox_RecordingControls.Name = "groupBox_RecordingControls"; - this.groupBox_RecordingControls.Size = new System.Drawing.Size(228, 78); - this.groupBox_RecordingControls.TabIndex = 3; - this.groupBox_RecordingControls.TabStop = false; - this.groupBox_RecordingControls.Text = "Talk to the parrot"; - // - // label_SamplesConsumed - // - this.label_SamplesConsumed.AutoSize = true; - this.label_SamplesConsumed.Location = new System.Drawing.Point(6, 52); - this.label_SamplesConsumed.Name = "label_SamplesConsumed"; - this.label_SamplesConsumed.Size = new System.Drawing.Size(108, 13); - this.label_SamplesConsumed.TabIndex = 103; - this.label_SamplesConsumed.Text = "Samples consumed: -"; - // - // button_Start - // - this.button_Start.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.button_Start.Location = new System.Drawing.Point(35, 19); - this.button_Start.Name = "button_Start"; - this.button_Start.Size = new System.Drawing.Size(159, 24); - this.button_Start.TabIndex = 3; - this.button_Start.Text = "Start recording"; - this.button_Start.UseVisualStyleBackColor = true; - this.button_Start.Click += new System.EventHandler(this.button_Start_Click); - // - // timer_GetSamples - // - this.timer_GetSamples.Tick += new System.EventHandler(this.timer_UpdateSamples_Tick); - // - // Parrot - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(252, 276); - this.Controls.Add(this.groupBox_RecordingControls); - this.Controls.Add(this.groupBox_RecorderParameters); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.Name = "Parrot"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "OpenAL Parrot"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Parrot_FormClosing); - this.groupBox_RecorderParameters.ResumeLayout(false); - this.groupBox_RecorderParameters.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_PlaybackGain)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_BufferLength)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown_Frequency)).EndInit(); - this.groupBox_RecordingControls.ResumeLayout(false); - this.groupBox_RecordingControls.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ComboBox comboBox_RecorderSelection; - private System.Windows.Forms.GroupBox groupBox_RecorderParameters; - private System.Windows.Forms.Label label_RINGBUFFER; - private System.Windows.Forms.Label label_FREQUENCY; - private System.Windows.Forms.NumericUpDown numericUpDown_BufferLength; - private System.Windows.Forms.NumericUpDown numericUpDown_Frequency; - private System.Windows.Forms.GroupBox groupBox_RecordingControls; - private System.Windows.Forms.Label label_SamplesConsumed; - private System.Windows.Forms.Button button_Start; - private System.Windows.Forms.Label label_MONO16BIT; - private System.Windows.Forms.Timer timer_GetSamples; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.NumericUpDown numericUpDown_PlaybackGain; - private System.Windows.Forms.Label label2; - - } -} diff --git a/Source/Examples/OpenAL/1.1/Parrot.cs b/Source/Examples/OpenAL/1.1/Parrot.cs deleted file mode 100644 index efceefc7..00000000 --- a/Source/Examples/OpenAL/1.1/Parrot.cs +++ /dev/null @@ -1,239 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2009 the Open Toolkit library. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Runtime.InteropServices; -using System.Threading; - -using OpenTK; -using OpenTK.Audio; -using OpenTK.Audio.OpenAL; - -namespace Examples -{ - [Example("Parrot Audio Capture", ExampleCategory.OpenAL, "1.1", Documentation = "Parrot")] - public partial class Parrot : Form - { - #region Fields - - AudioContext audio_context; - AudioCapture audio_capture; - - int src; - short[] buffer = new short[512]; - const byte SampleToByte = 2; - - #endregion - - #region Constructors - - public Parrot() - { - InitializeComponent(); - - this.Text = "OpenAL Parrot (" + (IntPtr.Size == 4 ? "x86" : "x64") + ")"; - - // Add available capture devices to the combo box. - IList recorders = AudioCapture.AvailableDevices; - for (int i = 0; i < recorders.Count; i++) - { - if (!String.IsNullOrEmpty(recorders[i])) - comboBox_RecorderSelection.Items.Add(recorders[i]); - } - if (comboBox_RecorderSelection.Items.Count > 0) - comboBox_RecorderSelection.SelectedIndex = 0; - } - - #endregion - - #region Events - - private void button_Start_Click(object sender, EventArgs e) - { - if (audio_capture == null || !audio_capture.IsRunning) - { - button_Start.Text = "Stop Recording"; - groupBox_RecorderParameters.Enabled = false; - this.StartRecording(); - } - else - { - button_Start.Text = "Start Recording"; - groupBox_RecorderParameters.Enabled = true; - this.StopRecording(); - } - } - - private void timer_UpdateSamples_Tick(object sender, EventArgs e) - { - this.UpdateSamples(); - } - - private void Parrot_FormClosing(object sender, FormClosingEventArgs e) - { - this.StopRecording(); - } - - #endregion - - #region Private Members - - void StartRecording() - { - try - { - audio_context = new AudioContext(); - } - catch (AudioException ae) - { - MessageBox.Show("Fatal: Cannot continue without a playback device.\nException caught when opening playback device.\n" + ae.Message); - Application.Exit(); - } - - AL.Listener(ALListenerf.Gain, (float)numericUpDown_PlaybackGain.Value); - src = AL.GenSource(); - - int sampling_rate = (int)numericUpDown_Frequency.Value; - double buffer_length_ms = (double)numericUpDown_BufferLength.Value; - int buffer_length_samples = (int)((double)numericUpDown_BufferLength.Value * sampling_rate * 0.001 / BlittableValueType.StrideOf(buffer)); - - try - { - audio_capture = new AudioCapture((string)comboBox_RecorderSelection.SelectedItem, - sampling_rate, ALFormat.Mono16, buffer_length_samples); - } - catch (AudioDeviceException ade) - { - MessageBox.Show("Exception caught when opening recording device.\n" + ade.Message); - audio_capture = null; - } - - if (audio_capture == null) - return; - - audio_capture.Start(); - - timer_GetSamples.Start(); - timer_GetSamples.Interval = (int)(buffer_length_ms / 2 + 0.5); // Tick when half the buffer is full. - } - - void StopRecording() - { - timer_GetSamples.Stop(); - - if (audio_capture != null) - { - audio_capture.Stop(); - audio_capture.Dispose(); - audio_capture = null; - } - - if (audio_context != null) - { - int r; - AL.GetSource(src, ALGetSourcei.BuffersQueued, out r); - ClearBuffers(r); - - AL.DeleteSource(src); - - audio_context.Dispose(); - audio_context = null; - } - } - - void UpdateSamples() - { - if (audio_capture == null) - return; - - int available_samples = audio_capture.AvailableSamples; - - if (available_samples * SampleToByte > buffer.Length * BlittableValueType.StrideOf(buffer)) - { - buffer = new short[MathHelper.NextPowerOfTwo( - (int)(available_samples * SampleToByte / (double)BlittableValueType.StrideOf(buffer) + 0.5))]; - } - - if (available_samples > 0) - { - audio_capture.ReadSamples(buffer, available_samples); - - int buf = AL.GenBuffer(); - AL.BufferData(buf, ALFormat.Mono16, buffer, (int)(available_samples * BlittableValueType.StrideOf(buffer)), audio_capture.SampleFrequency); - AL.SourceQueueBuffer(src, buf); - - label_SamplesConsumed.Text = "Samples consumed: " + available_samples; - - if (AL.GetSourceState(src) != ALSourceState.Playing) - AL.SourcePlay(src); - } - - ClearBuffers(0); - } - - void ClearBuffers(int input) - { - if (audio_context == null || audio_context == null) - return; - - int[] freedbuffers; - if (input == 0) - { - int BuffersProcessed; - AL.GetSource(src, ALGetSourcei.BuffersProcessed, out BuffersProcessed); - if (BuffersProcessed == 0) - return; - freedbuffers = AL.SourceUnqueueBuffers(src, BuffersProcessed); - } - else - { - freedbuffers = AL.SourceUnqueueBuffers(src, input); - } - AL.DeleteBuffers(freedbuffers); - } - - #endregion - - #region Main - - [STAThread] - static void Main() - { - using (Parrot parrot = new Parrot()) - { - parrot.ShowDialog(); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Examples/OpenAL/1.1/Parrot.resx b/Source/Examples/OpenAL/1.1/Parrot.resx deleted file mode 100644 index 46accf4f..00000000 --- a/Source/Examples/OpenAL/1.1/Parrot.resx +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - True - - - 17, 17 - - \ No newline at end of file diff --git a/Source/Examples/OpenAL/1.1/Parrot.rtf b/Source/Examples/OpenAL/1.1/Parrot.rtf deleted file mode 100644 index 1ff4ec2527ed1ef0778d4e70b51f1bbd4f765d59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2007 zcmah~(Qe!}5bU$RV&R9@4s1a>+d&#XIYt2&NRR+=n-{%M)JkH_BNdYJ#WDQvnWf~r zGlI52a5SF4M&y5+7bAM4J$lp2dKW!*Vr>rM|UL{24L z1*7cc)6>CYt-bXD$LO*S+*Ys8>OL^LRaG~3;#GAihhEh^I}R%OKp$e4xHX9`iu0;i z;on91`{h%8Z+LTOTzg(mx~fMN+FAphRj#kfv$MLXySREof4UTWJLzP+s~aGTtCgHS z$RD?Zi4@g(v`j`m*X&XxMKM3o$C2ID`_o26Zb?n8@f2A5&~hl|Ds!9s{Tc)WZ{zY} zuh$>>VYa>tg)iQ$g3y*Koy;J4lDLk*Y0PEK>?$ zpJ$q|6{e$`@5gTevo#uzkucc8Vt(zr+-If=GZu9FFyg4C=qG^D*cQf}#t~Y`M>}t= z-v}M|3Oa~y=}lRdCse)8|E*T#1)k1U`RV+;D$6|8xtzNBPR*21dJPnN_1EfQ+hZ{O zz+ov~(AE5n0CcGU`n89$u~}Jl%U>rMw1Wcgz3eCOxE0a~2r`h2+Lg(efaE{wtfy%7 zi#mJkzMHxZ04=*d4Ro}QFZuNwT2FeQRwYFnV=Xm|spSsfHVm9hqg4-$f)b)AAQp79 zKQ##-E$hHgGhKiBi>9c03^8v&dq@m?EKFHU@ALyorw#nM6G!I#xl=*!{btMS3~bwC zTLR0G-p2jh8)7hvLz$d6KxSs~2tciz^CIOqdYtSOAhPpQKNR$L*2xxMRh~i|Yj_t# z{M#lmx;;$>I+?wUb3&lgS)(6k|9Ds`&;Zk9cP%Va9Q)^LFMV;zYcK_mFDG zvs+~);-4%4xwHgTi!AG%va=c%2Q2%Tqj4dA579O}pCd6h`Z?Eb1=|QLGZO3u!$|^Q z4fo1e)xab>Qs$(?JM26kC+`aSBKaiu<{z@_B+Pi(**+){ z16bFR>yEA@#IKRm{4LEuo_|wgl92YzKa$VzD#(-;$Ue2^!~u!5Yz2;c*uvi9?TSQP zfjR@p(#XMhNl0sP8nX=yZz5Vzb)H%;J!d1!6y0R)33MU>1G{UnD*pCqKZ+KFv77*? hhFNA2FPDW>c3&q(ddih0>tD<(Y;Ucb*ZFkt%MVtA$PWMj diff --git a/Source/Examples/OpenAL/1.1/PlayStatic.cs b/Source/Examples/OpenAL/1.1/PlayStatic.cs deleted file mode 100644 index 122416cd..00000000 --- a/Source/Examples/OpenAL/1.1/PlayStatic.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2006, Creative Labs 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: - * - * * Redistributions of source code must retain the above copyright notice, this list of conditions and - * the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions - * and the following disclaimer in the documentation and/or other materials provided with the distribution. - * * Neither the name of Creative Labs Inc. nor the names of its contributors may be used to endorse or - * promote products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Threading; - -using OpenTK.Audio; - - -namespace Examples -{ -#if false - [Example("PlayStatic Sample", ExampleCategory.OpenAL)] - public partial class PlayStatic - { - public static void Main() - { - AudioContext context = new AudioContext(); - - Sound sound = new Sound("Data\\Audio\\Asterisk.wav"); - uint buffer; - uint source; - int state; - - Trace.WriteLine("PlayStatic Test Application\n"); - - // Generate an AL Buffer - AL.GenBuffers(out buffer); - - // Load Wave file into OpenAL Buffer - AL.BufferData(buffer, sound.ReadToEnd()); - - // Generate a Source to playback the Buffer - AL.GenSources(out source); - - // Attach Source to Buffer - AL.Source(source, ALSourcei.Buffer, (int)buffer); - - // Play Source - AL.SourcePlay(source); - Trace.WriteLine("Playing Source "); - - do - { - Thread.Sleep(100); - Trace.Write("."); - // Get Source State - AL.GetSource(source, ALGetSourcei.SourceState, out state); - } while ((ALSourceState)state == ALSourceState.Playing); - - Trace.WriteLine(); - - // Clean up by deleting Source(s) and Buffer(s) - AL.SourceStop(source); - AL.DeleteSources(ref source); - AL.DeleteBuffers(ref buffer); - - return; - } - } -#endif -} diff --git a/Source/Examples/OpenAL/1.1/Playback.cs b/Source/Examples/OpenAL/1.1/Playback.cs deleted file mode 100644 index ea9a1913..00000000 --- a/Source/Examples/OpenAL/1.1/Playback.cs +++ /dev/null @@ -1,112 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.Threading; -using System.IO; - -using OpenTK.Audio; -using OpenTK.Audio.OpenAL; - -#pragma warning disable 219 // variable assigned but never used, we do that on purpose - -namespace Examples -{ - [Example("Playback", ExampleCategory.OpenAL, "1.1", Documentation="Playback")] - public class Playback - { - static readonly string filename = Path.Combine(Path.Combine("Data", "Audio"), "the_ring_that_fell.wav"); - - // Loads a wave/riff audio file. - public static byte[] LoadWave(Stream stream, out int channels, out int bits, out int rate) - { - if (stream == null) - throw new ArgumentNullException("stream"); - - using (BinaryReader reader = new BinaryReader(stream)) - { - // RIFF header - string signature = new string(reader.ReadChars(4)); - if (signature != "RIFF") - throw new NotSupportedException("Specified stream is not a wave file."); - - int riff_chunck_size = reader.ReadInt32(); - - string format = new string(reader.ReadChars(4)); - if (format != "WAVE") - throw new NotSupportedException("Specified stream is not a wave file."); - - // WAVE header - string format_signature = new string(reader.ReadChars(4)); - if (format_signature != "fmt ") - throw new NotSupportedException("Specified wave file is not supported."); - - int format_chunk_size = reader.ReadInt32(); - int audio_format = reader.ReadInt16(); - int num_channels = reader.ReadInt16(); - int sample_rate = reader.ReadInt32(); - int byte_rate = reader.ReadInt32(); - int block_align = reader.ReadInt16(); - int bits_per_sample = reader.ReadInt16(); - - string data_signature = new string(reader.ReadChars(4)); - if (data_signature != "data") - throw new NotSupportedException("Specified wave file is not supported."); - - int data_chunk_size = reader.ReadInt32(); - - channels = num_channels; - bits = bits_per_sample; - rate = sample_rate; - - return reader.ReadBytes((int)reader.BaseStream.Length); - } - } - - public static ALFormat GetSoundFormat(int channels, int bits) - { - switch (channels) - { - case 1: return bits == 8 ? ALFormat.Mono8 : ALFormat.Mono16; - case 2: return bits == 8 ? ALFormat.Stereo8 : ALFormat.Stereo16; - default: throw new NotSupportedException("The specified sound format is not supported."); - } - } - - public static void Main() - { - using (AudioContext context = new AudioContext()) - { - int buffer = AL.GenBuffer(); - int source = AL.GenSource(); - int state; - - int channels, bits_per_sample, sample_rate; - byte[] sound_data = LoadWave(File.Open(filename, FileMode.Open), out channels, out bits_per_sample, out sample_rate); - AL.BufferData(buffer, GetSoundFormat(channels, bits_per_sample), sound_data, sound_data.Length, sample_rate); - - AL.Source(source, ALSourcei.Buffer, buffer); - AL.SourcePlay(source); - - Trace.Write("Playing"); - - // Query the source to find out when it stops playing. - do - { - Thread.Sleep(250); - Trace.Write("."); - AL.GetSource(source, ALGetSourcei.SourceState, out state); - } - while ((ALSourceState)state == ALSourceState.Playing); - - Trace.WriteLine(""); - - AL.SourceStop(source); - AL.DeleteSource(source); - AL.DeleteBuffer(buffer); - } - } - } -} diff --git a/Source/Examples/OpenAL/1.1/Playback.rtf b/Source/Examples/OpenAL/1.1/Playback.rtf deleted file mode 100644 index 404db1f564fac80fcfb1b6fd31f46b1b57b205f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 803 zcmY+CL66%Y5QTfrub6YyMzNDrt#XQbTB*CeRPBY!7={=v0SkuiuA=<+4mcaRl7$e= zy!Xw+7nRs{3PW~n(bK8x_giJi+Ra7T7?=kyn~k!;d1dv8DHCttm>l}U^}4z!9eqqv z1_zbMbYHgWl!!v#slgZOyF)Gds7@3pA;$!d*)kc&uwU=GbuZt3^X+g|e;vI%yI^*z z=uS|{0;gz-W*37Rge>=ctzNa|*XS~2JWrm$&^d<8;z}8Q zP85zmJ`b45K#nCCm^{7>sGrw!`>fyg-(~U?eZE~ROrBz(TYd93@bPm%X zBXF!E%~8WptfjQT-8K_sMqPWW&s_6=pXen$N01ql_|}K2v+#&q-%hRNeD{~^AKJ9_^PD&aTH`W^=8RfJ~w>*~WlR~{Ti diff --git a/Source/Examples/OpenAL/1.1/StreamingPlayback.cs b/Source/Examples/OpenAL/1.1/StreamingPlayback.cs deleted file mode 100644 index 2333dd3a..00000000 --- a/Source/Examples/OpenAL/1.1/StreamingPlayback.cs +++ /dev/null @@ -1,94 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using System.ComponentModel; - -using OpenTK.Audio; -using OpenTK.Audio.OpenAL; - -namespace Examples.OpenAL -{ - // Not working correctly (sound pops). - - //[Example("Streaming Playback", ExampleCategory.OpenAL)] - public class StreamingPlayback - { - const string filename = "Data\\Audio\\the_ring_that_fell.wav"; - const int buffer_size = (int)(0.5*44100); - const int buffer_count = 4; - - //static object openal_lock = new object(); // Should be global in your app. - - public static void Main() - { - using (AudioContext context = new AudioContext()) - { - int source = AL.GenSource(); - int[] buffers = AL.GenBuffers(buffer_count); - int state; - - Trace.WriteLine("Testing WaveReader({0}).ReadSamples()", filename); - - Trace.Write("Playing"); - - //foreach (int buffer in buffers) - // AL.BufferData(buffer, sound.ReadSamples(buffer_size)); - AL.SourceQueueBuffers(source, buffers.Length, buffers); - AL.SourcePlay(source); - - int processed_count, queued_count; - - do - { - //Trace.Write("."); - - do - { - AL.GetSource(source, ALGetSourcei.BuffersProcessed, out processed_count); - //Thread.Sleep(1); - } - while (processed_count == 0); - - Trace.WriteLine(processed_count); - //while (processed_count > 0) - //{ - // int buffer = AL.SourceUnqueueBuffer(source); - // if (buffer != 0 && !sound.EndOfFile) - // { - // Trace.WriteLine(" " + buffer.ToString()); - // AL.BufferData(buffer, sound.ReadSamples(buffer_size)); - // AL.SourceQueueBuffer(source, buffer); - // } - // --processed_count; - //} - - AL.GetSource(source, ALGetSourcei.BuffersQueued, out queued_count); - if (queued_count > 0) - { - AL.GetSource(source, ALGetSourcei.SourceState, out state); - if ((ALSourceState)state != ALSourceState.Playing) - { - AL.SourcePlay(source); - Trace.WriteLine("r"); - } - } - else - break; - } - while (true); - - AL.SourceStop(source); - AL.DeleteSource(source); - AL.DeleteBuffers(buffers); - } - - Trace.WriteLine(""); - } - } -} diff --git a/Source/Examples/OpenAL/EFX/EFXReverb.cs b/Source/Examples/OpenAL/EFX/EFXReverb.cs deleted file mode 100644 index ef4c087b..00000000 --- a/Source/Examples/OpenAL/EFX/EFXReverb.cs +++ /dev/null @@ -1,98 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2009 the Open Toolkit library. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System; -using System.Diagnostics; -using System.Threading; -using System.IO; -using OpenTK.Audio; -using OpenTK.Audio.OpenAL; - -namespace Examples -{ - [Example("EFX: Reverb", ExampleCategory.OpenAL, "EFX", Documentation="EFXReverb")] - public class ReverbExample - { - static readonly string filename = Path.Combine(Path.Combine("Data", "Audio"), "the_ring_that_fell.wav"); - - public static void Main() - { - using (AudioContext context = new AudioContext()) - { - Trace.WriteLine("Testing WaveReader({0}).ReadToEnd()", filename); - - EffectsExtension efx = new EffectsExtension(); - - int buffer = AL.GenBuffer(); - int source = AL.GenSource(); - int state; - - int effect = efx.GenEffect(); - int slot = efx.GenAuxiliaryEffectSlot(); - - efx.BindEffect(effect, EfxEffectType.Reverb); - efx.Effect(effect, EfxEffectf.ReverbDecayTime, 3.0f); - efx.Effect(effect, EfxEffectf.ReverbDecayHFRatio, 0.91f); - efx.Effect(effect, EfxEffectf.ReverbDensity, 0.7f); - efx.Effect(effect, EfxEffectf.ReverbDiffusion, 0.9f); - efx.Effect(effect, EfxEffectf.ReverbRoomRolloffFactor, 3.1f); - efx.Effect(effect, EfxEffectf.ReverbReflectionsGain, 0.723f); - efx.Effect(effect, EfxEffectf.ReverbReflectionsDelay, 0.03f); - efx.Effect(effect, EfxEffectf.ReverbGain, 0.23f); - - efx.AuxiliaryEffectSlot(slot, EfxAuxiliaryi.EffectslotEffect, effect); - - int channels, bits, rate; - byte[] data = Playback.LoadWave(File.Open(filename, FileMode.Open), out channels, out bits, out rate); - AL.BufferData(buffer, Playback.GetSoundFormat(channels, bits), data, data.Length, rate); - - AL.Source(source, ALSourcef.ConeOuterGain, 1.0f); - AL.Source(source, ALSourcei.Buffer, buffer); - AL.SourcePlay(source); - - Trace.Write("Playing"); - - // Query the source to find out when it stops playing. - do - { - Thread.Sleep(250); - Trace.Write("."); - AL.GetSource(source, ALGetSourcei.SourceState, out state); - } - while ((ALSourceState)state == ALSourceState.Playing); - - Trace.WriteLine(""); - - AL.SourceStop(source); - AL.DeleteSource(source); - AL.DeleteBuffer(buffer); - efx.DeleteEffect(effect); - efx.DeleteAuxiliaryEffectSlot(slot); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenAL/Test/OpenALDiagnostics.cs b/Source/Examples/OpenAL/Test/OpenALDiagnostics.cs deleted file mode 100644 index bf2d0613..00000000 --- a/Source/Examples/OpenAL/Test/OpenALDiagnostics.cs +++ /dev/null @@ -1,632 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2009 the Open Toolkit library. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Threading; -using System.Runtime.InteropServices; - -using OpenTK; -using OpenTK.Audio; -using OpenTK.Audio.OpenAL; - -namespace Examples -{ - /// - /// A text-based diagnosis program for OpenAL. - /// The constructors will call the OpenAL commands, the Print() methods just show the information. - /// - [Example("OpenAL diagnostics", ExampleCategory.OpenAL, "Test", 0, true)] - class OpenALDiagnostics - { - public static void checkForErrors() - { - { - IntPtr device = Alc.GetContextsDevice(Alc.GetCurrentContext()); - AlcError error = Alc.GetError(device); - - if (error != AlcError.NoError) - Trace.WriteLine("ALC ERROR: (" + error + ") " + Alc.GetString(device, (AlcGetString)error)); - } - { - ALError error = AL.GetError(); - if (error != ALError.NoError) - Trace.WriteLine("AL ERROR: (" + error + ") " + AL.GetErrorString(error)); - } - } - - [STAThread] - static void Main() - { - Trace.Listeners.RemoveAt(0); - Trace.Listeners.Add(new ConsoleTraceListener()); - - Trace.WriteLine("This application is currently running as " + (IntPtr.Size == 4 ? "x86" : "x64")); - - DeviceDiagnostic DevDiag = new DeviceDiagnostic(); - DevDiag.Print(); - DevDiag = null; - - using (AudioContext A = new AudioContext()) - { - AlcDiagnostic AlcDiag = new AlcDiagnostic(Alc.GetContextsDevice(Alc.GetCurrentContext())); - checkForErrors(); - AlcDiag.Print(); - AlcDiag = null; - - ALDiagnostic ALdiag = new ALDiagnostic(A); - checkForErrors(); - ALdiag.Print(); - ALdiag = null; - - EfxDiagnostic EfxDiag = new EfxDiagnostic(); - checkForErrors(); - EfxDiag.Print(); - EfxDiag = null; - - XRamDiagnostic XRamDiag = new XRamDiagnostic(); - checkForErrors(); - XRamDiag.Print(); - XRamDiag = null; - - RecorderDiagnostic rec = new RecorderDiagnostic(); - rec.Print(); - rec = null; - } - - // Trace.WriteLine("All done. Press Enter to exit."); - // Console.ReadLine(); - } - } - - class DeviceDiagnostic - { - #region Fields - public readonly IList AllPlaybackDevices; - public readonly IList AllRecordingDevices; - - public readonly string DefaultPlaybackDevice; - public readonly string DefaultRecordingDevice; - #endregion Fields - - public DeviceDiagnostic() - { - Trace.WriteLine("--- Device related errors ---"); - - AllPlaybackDevices = AudioContext.AvailableDevices; - AllRecordingDevices = AudioCapture.AvailableDevices; - - DefaultPlaybackDevice = AudioContext.DefaultDevice; - DefaultRecordingDevice = AudioCapture.DefaultDevice; - } - - public void Print() - { - Trace.WriteLine("--- Device related analysis ---"); - Trace.Indent(); - { - Trace.WriteLine("Default playback device: " + DefaultPlaybackDevice); - Trace.WriteLine("All known playback devices:"); - Trace.Indent(); - { - foreach (string s in AllPlaybackDevices) - Trace.WriteLine(s); - } - Trace.Unindent(); - - Trace.WriteLine("Default recording device: " + DefaultRecordingDevice); - Trace.WriteLine("All known recording devices:"); - Trace.Indent(); - { - foreach (string s in AllRecordingDevices) - Trace.WriteLine(s); - } - Trace.Unindent(); - } - Trace.Unindent(); - } - } - - class AlcDiagnostic - { - #region Fields - private string[] Alc_Extension_C_Names = new string[] - { - "ALC_ENUMERATE_ALL_EXT", - "ALC_ENUMERATION_EXT", - "ALC_EXT_ASA", - "ALC_EXT_ASA_DISTORTION", - "ALC_EXT_ASA_ROGER_BEEP", - "ALC_EXT_BRS_GAME_LICENSE_REQUIRED", - "ALC_EXT_capture", - "ALC_EXT_DEDICATED", - "ALC_EXT_EFX", - }; - - public readonly int MajorVersion; - public readonly int MinorVersion; - public readonly int EfxMajorVersion; - public readonly int EfxMinorVersion; - public readonly int EfxMaxAuxiliarySends; - public readonly string ExtensionString; - public readonly Dictionary Extensions = new Dictionary(); - #endregion Fields - - public AlcDiagnostic(IntPtr dev) - { - Trace.WriteLine("--- Alc related errors ---"); - - Alc.GetInteger(dev, AlcGetInteger.MajorVersion, 1, out MajorVersion); - Alc.GetInteger(dev, AlcGetInteger.MinorVersion, 1, out MinorVersion); - Alc.GetInteger(dev, AlcGetInteger.EfxMajorVersion, 1, out EfxMajorVersion); - Alc.GetInteger(dev, AlcGetInteger.EfxMinorVersion, 1, out EfxMinorVersion); - Alc.GetInteger(dev, AlcGetInteger.EfxMaxAuxiliarySends, 1, out EfxMaxAuxiliarySends); - - ExtensionString = Alc.GetString(dev, AlcGetString.Extensions); - - foreach (string s in Alc_Extension_C_Names) - Extensions.Add(s, Alc.IsExtensionPresent(dev, s)); - } - - public void Print() - { - Trace.WriteLine("--- Alc related analysis ---"); - Trace.Indent(); - { - Trace.WriteLine("Alc Version: " + MajorVersion + "." + MinorVersion); - Trace.WriteLine("Efx Version: " + EfxMajorVersion + "." + EfxMinorVersion); - Trace.WriteLine("Efx max. Auxiliary sends: " + EfxMaxAuxiliarySends); - Trace.WriteLine("Alc Extension string: " + ExtensionString); - - Trace.WriteLine("Confirmed Alc Extensions:"); - Trace.Indent(); - { - foreach (KeyValuePair pair in Extensions) - Trace.WriteLine(pair.Key + ": " + pair.Value); - } - Trace.Unindent(); - } - Trace.Unindent(); - } - } - - class ALDiagnostic - { - #region Fields - private string[] AL_Extension_Names = new string[] - { - "AL_EXT_ALAW", - "AL_EXT_BFORMAT", - "AL_EXT_double", - "AL_EXT_EXPONENT_DISTANCE", - "AL_EXT_float32", - "AL_EXT_FOLDBACK", - "AL_EXT_IMA4", - "AL_EXT_LINEAR_DISTANCE", - "AL_EXT_MCFORMATS", - "AL_EXT_mp3", - "AL_EXT_MULAW", - "AL_EXT_OFFSET", - "AL_EXT_vorbis", - "AL_LOKI_quadriphonic", - "EAX-RAM", - "EAX", - "EAX1.0", - "EAX2.0", - "EAX3.0", - "EAX3.0EMULATED", - "EAX4.0", - "EAX4.0EMULATED", - "EAX5.0" - }; - - public readonly Dictionary Extensions = new Dictionary(); - - public readonly string DeviceName; - public readonly float SpeedOfSound; - public readonly string ExtensionString; - public readonly string Renderer; - public readonly string Vendor; - public readonly string Version; - public readonly ALDistanceModel DistanceModel; - - const uint MaxSourcesLimit = 128; - public readonly uint MaxSources; - #endregion Fields - - public ALDiagnostic(AudioContext ac) - { - Trace.WriteLine("--- AL related errors ---"); - - DeviceName = ac.CurrentDevice; - - ExtensionString = AL.Get(ALGetString.Extensions); - Renderer = AL.Get(ALGetString.Renderer); - Vendor = AL.Get(ALGetString.Vendor); - Version = AL.Get(ALGetString.Version); - - SpeedOfSound = AL.Get(ALGetFloat.SpeedOfSound); - DistanceModel = AL.GetDistanceModel(); - - foreach (string s in AL_Extension_Names) - Extensions.Add(s, AL.IsExtensionPresent(s)); - - AL.GetError(); // clear it, need this for the source counting to work properly - uint[] dummy_sources = new uint[MaxSourcesLimit]; - for (MaxSources = 0; MaxSources < MaxSourcesLimit; MaxSources++) - { - AL.GenSource(out dummy_sources[MaxSources]); - if (AL.GetError() != ALError.NoError) - break; - } - - for (int i = 0; i < MaxSources; i++) - AL.DeleteSource(ref dummy_sources[i]); - } - - public void Print() - { - Trace.WriteLine("--- AL related analysis ---"); - Trace.Indent(); - { - Trace.WriteLine("Used Device: "+DeviceName); - Trace.WriteLine("AL Renderer: " + Renderer); - Trace.WriteLine("AL Vendor: " + Vendor); - Trace.WriteLine("AL Version: " + Version); - - Trace.WriteLine("AL Speed of sound: " + SpeedOfSound); - Trace.WriteLine("AL Distance Model: " + DistanceModel.ToString()); - Trace.WriteLine("AL Maximum simultanous Sources: " + MaxSources); - - Trace.WriteLine("AL Extension string: " + ExtensionString); - Trace.WriteLine("Confirmed AL Extensions:"); - Trace.Indent(); - { - foreach (KeyValuePair pair in Extensions) - Trace.WriteLine(pair.Key + ": " + pair.Value); - } - Trace.Unindent(); - } - Trace.Unindent(); - } - } - - class EfxDiagnostic - { - #region Fields - private EfxEffectType[] EffectNames = new EfxEffectType[] - { - EfxEffectType.Autowah, - EfxEffectType.Chorus, - EfxEffectType.Compressor, - EfxEffectType.Distortion, - EfxEffectType.EaxReverb, - EfxEffectType.Echo, - EfxEffectType.Equalizer, - EfxEffectType.Flanger, - EfxEffectType.FrequencyShifter, - EfxEffectType.PitchShifter, - EfxEffectType.Reverb, - EfxEffectType.RingModulator, - EfxEffectType.VocalMorpher, - }; - - private EfxFilterType[] FilterNames = new EfxFilterType[] - { - EfxFilterType.Bandpass, - EfxFilterType.Highpass, - EfxFilterType.Lowpass, - }; - - public readonly Dictionary Effects = new Dictionary(); - public readonly Dictionary Filters = new Dictionary(); - - const uint MaxAuxiliaryEffectSlotsLimit = 4; - public readonly uint MaxAuxiliaryEffectSlots; - #endregion Fields - - public EfxDiagnostic() - { - Trace.WriteLine("--- Efx related errors ---"); - - EffectsExtension Efx = new EffectsExtension(); - Trace.Assert(Efx.IsInitialized); - - #region Test for available Effects - uint effect; - Efx.GenEffect(out effect); - AL.GetError(); - foreach (EfxEffectType e in EffectNames) - { - Efx.BindEffect(effect, e); - Effects.Add(e.ToString(), AL.GetError() == ALError.NoError); - } - Efx.DeleteEffect(ref effect); - #endregion Test for available Effects - - #region Test for available Filters - uint filter; - Efx.GenFilter(out filter); - AL.GetError(); - foreach (EfxFilterType f in FilterNames) - { - Efx.Filter(filter, EfxFilteri.FilterType, (int)f); - Filters.Add(f.ToString(), AL.GetError() == ALError.NoError); - } - Efx.DeleteFilter(ref filter); - #endregion Test for available Filters - - AL.GetError(); - uint[] dummy_slots = new uint[MaxAuxiliaryEffectSlotsLimit]; - for (MaxAuxiliaryEffectSlots = 0; MaxAuxiliaryEffectSlots < MaxAuxiliaryEffectSlotsLimit; MaxAuxiliaryEffectSlots++) - { - Efx.GenAuxiliaryEffectSlot(out dummy_slots[MaxAuxiliaryEffectSlots]); - if (AL.GetError() != ALError.NoError) - break; - } - for (uint i = 0; i < MaxAuxiliaryEffectSlots; i++) - Efx.DeleteAuxiliaryEffectSlot(ref dummy_slots[i]); - } - - public void Print() - { - Trace.WriteLine("--- Efx related analysis ---"); - Trace.Indent(); - { - Trace.WriteLine("Efx Effects supported:"); - Trace.Indent(); - { - foreach (KeyValuePair pair in Effects) - Trace.WriteLine(pair.Key + ": " + pair.Value); - } - Trace.Unindent(); - - Trace.WriteLine("Efx Filters supported:"); - Trace.Indent(); - { - foreach (KeyValuePair pair in Filters) - Trace.WriteLine(pair.Key + ": " + pair.Value); - } - Trace.Unindent(); - - Trace.WriteLine("Efx max. Auxiliary Effect Slots: " + MaxAuxiliaryEffectSlots); - } - Trace.Unindent(); - } - } - - class XRamDiagnostic - { - #region Fields - private XRamExtension.XRamStorage[] storagemodes = new XRamExtension.XRamStorage[] - { - XRamExtension.XRamStorage.Hardware, - XRamExtension.XRamStorage.Accessible, - XRamExtension.XRamStorage.Automatic, - }; - - public readonly bool XRamFound; - public readonly int RamTotal; - public readonly int RamFree; - public readonly Dictionary BufferModes = new Dictionary(); - #endregion Fields - - public XRamDiagnostic() - { - Trace.WriteLine("--- X-RAM related errors ---"); - - XRamExtension XRam = new XRamExtension(); - if (XRam.IsInitialized) - { - XRamFound = true; - - RamTotal = XRam.GetRamSize; - RamFree = XRam.GetRamFree; - - uint buffer; - AL.GenBuffer(out buffer); - - foreach (XRamExtension.XRamStorage m in storagemodes) - { - XRam.SetBufferMode(1, ref buffer, m); - BufferModes.Add(m.ToString(), m == XRam.GetBufferMode(ref buffer)); - } - - AL.DeleteBuffer(ref buffer); - } - else - XRamFound = false; - } - - public void Print() - { - Trace.WriteLine("--- X-RAM related analysis ---"); - - if (XRamFound) - { - Trace.Indent(); // * - Trace.WriteLine("X-RAM extension found."); - } - else - { - Trace.Indent(); - { - Trace.WriteLine("X-RAM extension is not available, skipping test."); - } - Trace.Unindent(); - return; - } - - Trace.WriteLine("Ram status (free/total) in bytes: " + RamFree + "/" + RamTotal); - - Trace.WriteLine("Available buffer modes:"); - Trace.Indent(); - { - foreach (KeyValuePair pair in BufferModes) - Trace.WriteLine(pair.Key + ": " + pair.Value); - } - Trace.Unindent(); - - Trace.Unindent(); // * - } - } - - class RecorderDiagnostic - { - #region Fields - bool IsDeviceAvailable; - bool BufferContentsAllZero; - short MaxSample = short.MinValue; - short MinSample = short.MaxValue; - - private AudioCapture r; - Dictionary Errorlist = new Dictionary(); - - string DeviceName; - - #endregion Fields - - private void CheckRecorderError(string location) - { - AlcError err = r.CurrentError; - if (err != AlcError.NoError) - Errorlist.Add(location, err); - } - - public RecorderDiagnostic() - { - Trace.WriteLine("--- AudioCapture related errors ---"); - IsDeviceAvailable = false; - - try - { - r = new AudioCapture(AudioCapture.DefaultDevice, 16000, ALFormat.Mono16, 4096); - } - catch (AudioDeviceException ade) - { - Trace.WriteLine("AudioCapture Exception caught: " + ade.Message); - return; - } - IsDeviceAvailable = true; - DeviceName = r.CurrentDevice; - CheckRecorderError("Alc.CaptureOpenDevice"); - - r.Start(); - CheckRecorderError("Alc.CaptureStart"); - Thread.Sleep(100); - r.Stop(); - CheckRecorderError("Alc.CaptureStop"); - - byte[] Buffer = new byte[8192]; - - Thread.Sleep(10); // Wait for a few samples to become available. - int SamplesBefore = r.AvailableSamples; - - CheckRecorderError("Alc.GetInteger(...CaptureSamples...)"); - r.ReadSamples(Buffer, (SamplesBefore > 4096 ? 4096 : SamplesBefore)); - CheckRecorderError("Alc.CaptureSamples"); - - int SamplesCaptured = SamplesBefore - r.AvailableSamples; - - uint ZeroCounter = 0; - for (int i = 0; i < SamplesCaptured * 2; i++) - { - if (Buffer[i] == 0) - ZeroCounter++; - } - - for (int i = 0; i < SamplesCaptured; i++) - { - short sample = BitConverter.ToInt16(Buffer, i * 2); - if (sample > MaxSample) - MaxSample = sample; - if (sample < MinSample) - MinSample = sample; - } - - if (ZeroCounter < SamplesCaptured * 2 && SamplesCaptured > 0) - BufferContentsAllZero = false; - else - BufferContentsAllZero = true; - - r.Dispose(); - CheckRecorderError("Alc.CaptureCloseDevice"); - - // no playback test needed due to Parrot test app. - /* - uint buf; - AL.GenBuffer(out buf); - AL.BufferData(buf, ALFormat.Mono16, BufferPtr, SamplesCaptured * 2, 16000); - uint src; - AL.GenSource(out src); - AL.BindBufferToSource(src, buf); - AL.Listener(ALListenerf.Gain, 16.0f); - AL.SourcePlay(src); - while (AL.GetSourceState(src) == ALSourceState.Playing) - { - Thread.Sleep(0); - } - AL.SourceStop(src); - - AL.DeleteSource(ref src); - AL.DeleteBuffer(ref buf); - */ - } - - public void Print() - { - Trace.WriteLine("--- AudioCapture related analysis ---"); - - if (!IsDeviceAvailable) - { - Trace.WriteLine("Capture Device could not be initlialized (no microphone plugged into the jack?). Skipping test."); - return; - } - - Trace.Indent(); - { - Trace.WriteLine("Using capture device: " + DeviceName); - if (Errorlist.Count > 0) - { - Trace.WriteLine("Found Alc Errors:"); - Trace.Indent(); - { - foreach (KeyValuePair pair in Errorlist) - Trace.WriteLine(pair.Key + ": " + pair.Value); - } - Trace.Unindent(); - - - } - Trace.WriteLine("Buffer contents after capture was all 0's: " + BufferContentsAllZero); - Trace.WriteLine("Sample min/max in recorded data: " + MinSample + " / " + MaxSample); - } - Trace.Unindent(); - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenAL/Test/TestAudioContext.cs b/Source/Examples/OpenAL/Test/TestAudioContext.cs deleted file mode 100644 index 906876cb..00000000 --- a/Source/Examples/OpenAL/Test/TestAudioContext.cs +++ /dev/null @@ -1,203 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK Team. - * This notice may not be removed from any source distribution. - * See license.txt for licensing details. - */ -#endregion - -using System; -using System.Diagnostics; - -using OpenTK.Audio; -using OpenTK.Audio.OpenAL; - -using AlContext = System.IntPtr; -using AlDevice = System.IntPtr; - -namespace Examples -{ - [Example("AudioContext Test", ExampleCategory.OpenTK, "Test", 0, false)] - class TestApp - { - public static void PrintOpenALErrors( IntPtr device ) - { - ALError AlErr = AL.GetError(); - Trace.WriteLine("OpenAL error: {0}"+ AlErr); - } - - public static void Main() - { - AlcUnitTestFunc(); - } - - public static void AlcUnitTestFunc() - { - AudioContext context = new AudioContext(); - - Trace.WriteLine("Testing AudioContext functions."); - Trace.Indent(); - -// Trace.WriteLine("Suspend()..."); -// context.Suspend(); -// Trace.Assert(!context.IsProcessing); -// -// Trace.WriteLine("Process()..."); -// context.Process(); -// Trace.Assert(context.IsProcessing); - - //Trace.WriteLine("MakeCurrent()..."); - //context.MakeCurrent(); - //Trace.Assert(context.IsCurrent); - - //Trace.WriteLine("IsCurrent = false..."); - //context.IsCurrent = false; - //Trace.Assert(!context.IsCurrent); - - //Trace.WriteLine("IsCurrent = true..."); - //context.IsCurrent = true; - //Trace.Assert(context.IsCurrent); - - Trace.WriteLine("AudioContext.CurrentContext..."); - Trace.Assert(AudioContext.CurrentContext == context); - - #region Get Attribs - - //int AttribCount; - //Alc.GetInteger(context.Device, AlcGetInteger.AttributesSize, sizeof(int), out AttribCount); - //Trace.WriteLine("AttributeSize: " + AttribCount); - - //if (AttribCount > 0) - //{ - // int[] Attribs = new int[AttribCount]; - // Alc.GetInteger(context.Device, AlcGetInteger.AllAttributes, AttribCount, out Attribs[0]); - // for (int i = 0; i < Attribs.Length; i++) - // { - // Trace.Write(Attribs[i]); - // Trace.Write(" "); - // } - // Trace.WriteLine(); - //} - - #endregion Get Attribs - -#if false - AlDevice MyDevice; - AlContext MyContext; - - // Initialize Open AL - MyDevice = Alc.OpenDevice( null );// open default device - if ( MyDevice != Al.Null ) - { - Trace.WriteLine( "Device allocation succeeded." ); - MyContext = Alc.CreateContext( MyDevice, Al.Null ); // create context - if ( MyContext != Al.Null ) - { - Trace.WriteLine( "Context allocation succeeded." ); - GetOpenALErrors( MyDevice ); - - Alc.SuspendContext( MyContext ); // disable context - Alc.ProcessContext( MyContext ); // enable context. The default state of a context created by alcCreateContext is that it is processing. - Al.Bool result = Alc.MakeContextCurrent( MyContext ); // set active context - Trace.WriteLine( "MakeContextCurrent succeeded? " + result ); - GetOpenALErrors( MyDevice ); - - Trace.WriteLine( "Default: " + Alc.GetString( MyDevice, Enums.AlcGetString.DefaultDeviceSpecifier ) ); - Trace.WriteLine( "Device: " + Alc.GetString( MyDevice, Enums.AlcGetString.DeviceSpecifier ) ); - Trace.WriteLine( "Extensions: " + Alc.GetString( MyDevice, Enums.AlcGetString.Extensions ) ); - GetOpenALErrors( MyDevice ); - - #region Get Attribs - int AttribCount; - Alc.GetInteger( MyDevice, Enums.AlcGetInteger.AttributesSize, sizeof( int ), out AttribCount ); - Trace.WriteLine( "AttributeSize: " + AttribCount ); - - if ( AttribCount > 0 ) - { - int[] Attribs = new int[AttribCount]; - Alc.GetInteger( MyDevice, Enums.AlcGetInteger.AttributesSize, AttribCount, out Attribs[0] ); - for ( int i = 0; i < Attribs.Length; i++ ) - Trace.Write( ", " + Attribs[i] ); - Trace.WriteLine( ); - } - #endregion Get Attribs - GetOpenALErrors( MyDevice ); - - AlDevice currdev = Alc.GetContextsDevice( MyContext ); - AlContext currcon = Alc.GetCurrentContext( ); - - if ( MyDevice == currdev ) - Trace.WriteLine( "Devices match." ); - else - Trace.WriteLine( "Error: Devices do not match." ); - - if ( MyContext == currcon ) - Trace.WriteLine( "Context match." ); - else - Trace.WriteLine( "Error: Contexts do not match." ); - - // exit - Alc.MakeContextCurrent( Al.Null ); // results in no context being current - Alc.DestroyContext( MyContext ); - result = Alc.CloseDevice( MyDevice ); - Trace.WriteLine( "Result: " + result ); - Trace.ReadLine( ); - } - else - { - Trace.WriteLine( "Context creation failed." ); - } - } - else - { - Trace.WriteLine( "Failed to find suitable Device." ); - } -#endif - /* -include -include - -int -main (int argc, char **argv) -{ - ALuint helloBuffer, helloSource; - alutInit (&argc, argv); - helloBuffer = alutCreateBufferHelloWorld (); alGenSources (1, &helloSource); - alSourcei (helloSource, AL_Buffer, helloBuffer); - alSourcePlay (helloSource); - alutSleep (1); - alutExit (); - return EXIT_SUCCESS; -}*/ - - /* - - * Processing Loop Example: -// PlaceCamera - places OpenGL camera & updates OpenAL listener buffer -void AVEnvironment::PlaceCamera() -{ -// update OpenGL camera position -glMatrixMode(GL_PROJECTION); -glLoadIdentity(); -glFrustum(-0.1333, 0.1333, -0.1, 0.1, 0.2, 50.0); -gluLookAt(listenerPos[0], listenerPos[1], listenerPos[2], -(listenerPos[0] + sin(listenerAngle)), listenerPos[1], -(listenerPos[2] - cos(listenerAngle)), -0.0, 1.0, 0.0); -// update OpenAL -// place listener at camera -alListener3f(AL_POSITION, listenerPos[0], listenerPos[1], listenerPos[2]); -float directionvect[6]; -directionvect[0] = (float) sin(listenerAngle); -directionvect[1] = 0; -directionvect[2] = (float) cos(listenerAngle); -directionvect[3] = 0; -directionvect[4] = 1; -directionvect[5] = 0; -alListenerfv(AL_ORIENTATION, directionvect); -} - - */ - } - } -} diff --git a/Source/Examples/OpenCL/VectorAdd.cs b/Source/Examples/OpenCL/VectorAdd.cs deleted file mode 100644 index ef0bd215..00000000 --- a/Source/Examples/OpenCL/VectorAdd.cs +++ /dev/null @@ -1,145 +0,0 @@ -#if EXPERIMENTAL - -using System; -using System.Collections.Generic; -using System.Text; -using OpenTK.Compute.CL10; - -namespace Examples -{ - - using cl_context = IntPtr; - using cl_device_id = IntPtr; - using cl_command_queue = IntPtr; - using cl_program = IntPtr; - using cl_kernel = IntPtr; - using cl_mem = IntPtr; - - [Example("Vector Addition", ExampleCategory.OpenCL, "1.0")] - class VectorAdd - { - public static void Main() - { - const int cnBlockSize = 4; - const int cnBlocks = 3; - IntPtr cnDimension = new IntPtr(cnBlocks * cnBlockSize); - string sProgramSource = @" -__kernel void -vectorAdd(__global const float * a, - __global const float * b, - __global float * c) -{ - // Vector element index - int nIndex = get_global_id(0); - c[nIndex] = a[nIndex] + b[nIndex]; -} -"; - - ErrorCode error; - - // create OpenCL device & context - cl_context hContext; - unsafe { hContext = CL.CreateContextFromType((ContextProperties*)null, DeviceTypeFlags.DeviceTypeDefault, IntPtr.Zero, IntPtr.Zero, &error); } - - // query all devices available to the context - IntPtr nContextDescriptorSize; - CL.GetContextInfo(hContext, ContextInfo.ContextDevices, IntPtr.Zero, IntPtr.Zero, out nContextDescriptorSize); - cl_device_id[] aDevices = new cl_device_id[nContextDescriptorSize.ToInt32()]; - unsafe - { - fixed (cl_device_id* ptr = aDevices) - { - IntPtr ret; - CL.GetContextInfo(hContext, ContextInfo.ContextDevices, nContextDescriptorSize, new IntPtr(ptr), out ret); - } - } - - - // create a command queue for first device the context reported - cl_command_queue hCmdQueue = CL.CreateCommandQueue(hContext, aDevices[0], (CommandQueueFlags)0, out error); - // create & compile program - cl_program hProgram; - unsafe { hProgram = CL.CreateProgramWithSource(hContext, 1, new string[] { sProgramSource }, null, &error); } - CL.BuildProgram(hProgram, 0, (IntPtr[])null, null, IntPtr.Zero, IntPtr.Zero); - - // create kernel - cl_kernel hKernel = CL.CreateKernel(hProgram, "vectorAdd", out error); - // allocate host vectors - float[] A = new float[cnDimension.ToInt32()]; - float[] B = new float[cnDimension.ToInt32()]; - float[] C = new float[cnDimension.ToInt32()]; - // initialize host memory - Random rand = new Random(); - for (int i = 0; i < A.Length; i++) - { - A[i] = rand.Next() % 256; - B[i] = rand.Next() % 256; - } - - // allocate device memory - unsafe - { - fixed (float* pA = A) - fixed (float* pB = B) - fixed (float* pC = C) - { - cl_mem hDeviceMemA, hDeviceMemB, hDeviceMemC; - hDeviceMemA = CL.CreateBuffer(hContext, - MemFlags.MemReadOnly | MemFlags.MemCopyHostPtr, - new IntPtr(cnDimension.ToInt32() * sizeof(float)), - new IntPtr(pA), - out error); - hDeviceMemB = CL.CreateBuffer(hContext, - MemFlags.MemReadOnly | MemFlags.MemCopyHostPtr, - new IntPtr(cnDimension.ToInt32() * sizeof(float)), - new IntPtr(pA), - out error); - hDeviceMemC = CL.CreateBuffer(hContext, - MemFlags.MemWriteOnly, - new IntPtr(cnDimension.ToInt32() * sizeof(float)), - IntPtr.Zero, - out error); - - // setup parameter values - CL.SetKernelArg(hKernel, 0, new IntPtr(sizeof(cl_mem)), new IntPtr(&hDeviceMemA)); - CL.SetKernelArg(hKernel, 1, new IntPtr(sizeof(cl_mem)), new IntPtr(&hDeviceMemB)); - CL.SetKernelArg(hKernel, 2, new IntPtr(sizeof(cl_mem)), new IntPtr(&hDeviceMemC)); - - // write data from host to device - CL.EnqueueWriteBuffer(hCmdQueue, hDeviceMemA, true, IntPtr.Zero, - new IntPtr(cnDimension.ToInt32() * sizeof(float)), - new IntPtr(pA), 0, null, (IntPtr[])null); - CL.EnqueueWriteBuffer(hCmdQueue, hDeviceMemB, true, IntPtr.Zero, - new IntPtr(cnDimension.ToInt32() * sizeof(float)), - new IntPtr(pB), 0, null, (IntPtr[])null); - - // execute kernel - error = (ErrorCode)CL.EnqueueNDRangeKernel(hCmdQueue, hKernel, 1, null, &cnDimension, null, 0, null, null); - if (error != ErrorCode.Success) - throw new Exception(error.ToString()); - - // copy results from device back to host - IntPtr event_handle = IntPtr.Zero; - error = (ErrorCode)CL.EnqueueReadBuffer(hCmdQueue, hDeviceMemC, true, IntPtr.Zero, - new IntPtr(cnDimension.ToInt32() * sizeof(float)), - new IntPtr(pC), 0, null, (IntPtr[])null); - if (error != ErrorCode.Success) - throw new Exception(error.ToString()); - - CL.Finish(hCmdQueue); - - CL.ReleaseMemObject(hDeviceMemA); - CL.ReleaseMemObject(hDeviceMemB); - CL.ReleaseMemObject(hDeviceMemC); - } - } - - for (int i = 0; i < A.Length; i++) - { - System.Diagnostics.Trace.WriteLine(String.Format("{0} + {1} = {2}", A[i], B[i], C[i])); - } - } - } -} - -#endif \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/Anaglyph.cs b/Source/Examples/OpenGL/1.x/Anaglyph.cs deleted file mode 100644 index 861742d7..00000000 --- a/Source/Examples/OpenGL/1.x/Anaglyph.cs +++ /dev/null @@ -1,209 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Drawing; -using System.Collections.Generic; -using System.Diagnostics; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.Tutorial -{ - [Example( "Anaglyph Stereo", ExampleCategory.OpenGL, "1.x", Documentation = "Anaglyph" )] - - class Anaglyph : GameWindow - { - - Examples.Shapes.DrawableShape Object; - - /// Creates a 800x600 window with the specified title. - public Anaglyph() - : base(800, 600, GraphicsMode.Default, "OpenTK Quick Start Sample", GameWindowFlags.Default, DisplayDevice.Default, 3, 1, GraphicsContextFlags.Default) - { - VSync = VSyncMode.On; - } - - /// Load resources here. - /// Not used. - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - GL.ClearColor(System.Drawing.Color.Black); - GL.Enable(EnableCap.DepthTest); - - GL.Enable( EnableCap.Lighting ); - GL.Enable( EnableCap.Light0 ); - - Object = new Examples.Shapes.MengerSponge(1.0, Shapes.MengerSponge.eSubdivisions.Two, true ); - // Object = new Examples.Shapes.TorusKnot( 256, 32, 0.1, 3, 4, 1, true ); - } - - protected override void OnUnload( EventArgs e ) - { - base.OnUnload( e ); - - Object.Dispose(); - } - - /// - /// Called when your window is resized. Set your viewport here. It is also - /// a good place to set up your projection matrix (which probably changes - /// along when the aspect ratio of your window). - /// - /// Not used. - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(ClientRectangle); - } - - /// - /// Called when it is time to setup the next frame. Add you game logic here. - /// - /// Contains timing information for framerate independent logic. - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Escape]) - Exit(); - } - - struct Camera - { - public Vector3 Position, Direction, Up; - public double NearPlane, FarPlane; - public double EyeSeparation; - public double Aperture; // FOV in degrees - public double FocalLength; - } - - enum Eye - { - left, - right, - } - - void SetupCamera( Eye eye ) - { - Camera camera; - - camera.Position = Vector3.UnitZ; - camera.Up = Vector3.UnitY; - camera.Direction = -Vector3.UnitZ; - camera.NearPlane = 1.0; - camera.FarPlane = 5.0; - camera.FocalLength = 2.0; - camera.EyeSeparation = camera.FocalLength / 30.0; - camera.Aperture = 75.0; - - double left, right, - bottom, top; - - double widthdiv2 = camera.NearPlane * Math.Tan( MathHelper.DegreesToRadians( (float)( camera.Aperture / 2.0 ) ) ); // aperture in radians - double precalc1 = ClientRectangle.Width / (double)ClientRectangle.Height * widthdiv2; - double precalc2 = 0.5 * camera.EyeSeparation * camera.NearPlane / camera.FocalLength; - - Vector3 Right = Vector3.Cross( camera.Direction, camera.Up ); // Each unit vectors - Right.Normalize(); - - Right.X *= (float)( camera.EyeSeparation / 2.0 ); - Right.Y *= (float)( camera.EyeSeparation / 2.0 ); - Right.Z *= (float)( camera.EyeSeparation / 2.0 ); - - // Projection Matrix - top = widthdiv2; - bottom = -widthdiv2; - if ( eye == Eye.right ) - { - left = -precalc1 - precalc2; - right = precalc1 - precalc2; - } - else - { - left = -precalc1 + precalc2; - right = precalc1 + precalc2; - } - - GL.MatrixMode( MatrixMode.Projection ); - GL.LoadIdentity(); - GL.Frustum( left, right, bottom, top, camera.NearPlane, camera.FarPlane ); - - // Modelview Matrix - Matrix4 modelview; - if ( eye == Eye.right ) - { - modelview = Matrix4.LookAt( - new Vector3( camera.Position.X + Right.X, camera.Position.Y + Right.Y, camera.Position.Z + Right.Z ), - new Vector3( camera.Position.X + Right.X + camera.Direction.X, camera.Position.Y + Right.Y + camera.Direction.Y, camera.Position.Z + Right.Z + camera.Direction.Z ), - camera.Up ); - } - else - { - modelview = Matrix4.LookAt( - new Vector3( camera.Position.X - Right.X, camera.Position.Y - Right.Y, camera.Position.Z - Right.Z ), - new Vector3( camera.Position.X - Right.X + camera.Direction.X, camera.Position.Y - Right.Y + camera.Direction.Y, camera.Position.Z - Right.Z + camera.Direction.Z ), - camera.Up ); - } - GL.MatrixMode( MatrixMode.Modelview ); - GL.LoadIdentity(); - GL.MultMatrix( ref modelview ); - - } - - float Angle; - - void Draw() - { - GL.Translate( 0f, 0f, -2f ); - GL.Rotate( Angle, Vector3.UnitY ); - Object.Draw(); - } - - /// - /// Called when it is time to render the next frame. Add your rendering code here. - /// - /// Contains timing information. - protected override void OnRenderFrame( FrameEventArgs e ) - { - Angle += (float)(e.Time *20.0); - - - GL.Clear( ClearBufferMask.DepthBufferBit | ClearBufferMask.ColorBufferBit ); - SetupCamera( Eye.right ); - GL.ColorMask( true, false, false, true ); - Draw(); - - GL.Clear( ClearBufferMask.DepthBufferBit ); // - SetupCamera( Eye.left ); - GL.ColorMask( false, true, true, true ); - Draw(); - - GL.ColorMask( true, true, true, true ); - SwapBuffers(); - } - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // The 'using' idiom guarantees proper resource cleanup. - // We request 30 UpdateFrame events per second, and unlimited - // RenderFrame events (as fast as the computer can handle). - using (Anaglyph game = new Anaglyph()) - { - game.Run(10.0); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/Anaglyph.rtf b/Source/Examples/OpenGL/1.x/Anaglyph.rtf deleted file mode 100644 index ee156c5d02fdab37700f33e9f5aba7bcc691de37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmb_a-EP(}4CVTJ3Tu~K^zT~{@Lf$45)&{Xv>T+{xQWw7%aST~DN|LRowOB$2SAFf z`eA#1Be*%(ARpD&fN!Fgr%fQd;exJeHEWnE8;($UA1 z)8L{KnflFH^@%7nwd(vtO})d_0agdrwwJB)wdyHQLWv2!uoW^+pe?TJqRFSN-d$Gp z!_oZcg1J_cuGNUiD4i*L41Hal&#F_Fo40TmBt7#sur#HY~{ z@DOK)96%x@3WgG3z}`QP1F%q{2qU`0U^B0Y31%ll&NNVhe#QX3M`q#z9)|o$9XlZ~ z#5%c-7$l?45JE>oW)4}D%SDM$a+aX;1^nffx~O6%g66uKYaUqcmD~l z29fc7S^B8a7c=r$Ofwc_rUIw(*Vx4=JyQAPSd-6lp*V4Q=;#xUgVTSWhuHFJU2{Wk u5_?(H)bo-6 diff --git a/Source/Examples/OpenGL/1.x/DisplayLists.cs b/Source/Examples/OpenGL/1.x/DisplayLists.cs deleted file mode 100644 index 62974090..00000000 --- a/Source/Examples/OpenGL/1.x/DisplayLists.cs +++ /dev/null @@ -1,157 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region --- Using Directives --- - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Threading; - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -#endregion --- Using Directives --- - -namespace Examples.Tutorial -{ - [Example("Display Lists", ExampleCategory.OpenGL, "1.x", 2, Documentation = "DisplayLists")] - public class T07_Display_Lists_Flower : GameWindow - { - #region --- Fields --- - - const int num_lists = 13; - int[] lists = new int[num_lists]; - - #endregion - - #region --- Constructor --- - - public T07_Display_Lists_Flower() - : base(800, 600) - { - } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - - // Build some display lists. - int first_list = GL.GenLists(num_lists); - float c = 0; - for (int i = 0; i < num_lists; i++) - { - lists[i] = first_list + i; - GL.NewList(first_list + i, ListMode.Compile); - - GL.Color3(0.3 + 0.7 * c * c, 0.3 + 1.4 * c * c, 0.7 - 0.7 * c * c); - c += 1 / (float)num_lists; - - GL.PushMatrix(); - - GL.Rotate(c * 360.0f, 0.0, 0.0, 1.0); - GL.Translate(5.0, 0.0, 0.0); - - GL.Begin(PrimitiveType.Quads); - - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - - GL.End(); - - GL.PopMatrix(); - - GL.EndList(); - } - } - - #endregion - - #region OnUnload - - protected override void OnUnload(EventArgs e) - { - GL.DeleteLists(lists[0], num_lists); - } - - #endregion - - #region OnResize - - protected override void OnResize(EventArgs e) - { - GL.Viewport(ClientRectangle); - - float aspect = this.ClientSize.Width / (float)this.ClientSize.Height; - - Matrix4 projection_matrix; - Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, aspect, 1, 64, out projection_matrix); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref projection_matrix); - } - - #endregion - - #region OnUpdateFrame - - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - } - } - - #endregion - - #region OnRenderFrame - - protected override void OnRenderFrame(FrameEventArgs e) - { - Matrix4 lookat = Matrix4.LookAt(0, 0, 16, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - GL.CallLists(num_lists, ListNameType.Int, lists); - - SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (T07_Display_Lists_Flower example = new T07_Display_Lists_Flower()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/DisplayLists.rtf b/Source/Examples/OpenGL/1.x/DisplayLists.rtf deleted file mode 100644 index aa6bf63c44e4c63e13f84c842124f5a734952740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmZvbU2EGg6oz-*UvbD)GFlTm>)6QEXuC4V+A_L3-N@2$qE(iRbey!5{P!IxA9dD2 zFgDToc%S#xs|eJTLb_=3Lv_otx||7(O*4HJjdw(~<(H{woUx)&D;Xlv6ut!`?R>jE zdlkxCANUx|ML=DCo{42ZbX6&8+hbME)1i-Ii4KD#AK+(f2(=-&EIyS*#lOqx*ZEeg z4Q`%{)1O4IO3}%nh2rh3bjxx&n~7R9vHAi(90jj?MaDZ(^JcNC(&@AOcwCtXQMR2$ z(AatxiKk)&S|KR!6m|r@fsr<`v+@P3i4;fYuvrb_|(fUp0c zqO=P{E&(MY#z_J9E>H2SCIFY|^S7RLZ!D$lJ;>wWB#*0|^8__Q>$PbNE0gR&nvA@J zqJgvri#!YXd=ez-q*DYL@_!Kfu4CIz7|n_j*x!{|@^<@{JJT|`D~?m}HtsMEoqGrv zBiuxl%9S{F67QdA52q9`zB^*hHvc>H&A4Nyi - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (SimpleFBO example = new SimpleFBO()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/FramebufferObject.rtf b/Source/Examples/OpenGL/1.x/FramebufferObject.rtf deleted file mode 100644 index fff69875577d8130e4a49ae17c9635017522cbd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 zcma)+-D(>#5QTf4rUr)@bd7;CJsxTK_=< z1+!SvXmsY&8NCS~bS0!ElRizisOsy9P^fhozbk1MRXM5m|24+Zo6ydNFkkVXQfS&5 zBB49Ku7z%v(i4UfzIY>7H#-ig4k7tb3JHUF;5&o?`oSiIG<2OOQqt3mDS8UC4f=TeAu8vhx`xN4At2dyD+GnD zvlO@tq%##RtANY9uQM9K#z+WDgxg<_Px>hKDTe{R1mqiZwtyH9op&3f5TpgZN7ERz z0a^@8ryw}!&}-*ga9Uqc!%QuBv5;*7j!=OlK9$G1w@qM91ef;@qXLG#gse%uw>iQ;5KcRb+m|ppk&r zW}j^0$ZLp7dFJkzf*|sdA;@OQfY=q>Ka5Fvxs9l)_gXecDgAr7m;5;7&2uKm-5M{m z={>tC95Us;8neP?h5R&R!^Nx2Hsl1CCOS}!l1d4W&iC|e9a|)|L98R{vMF#84Li_} zrH|98ELyqk6}?ixcHaOBPMRfVX(e~XUZ7k^!@DElq&snsqcheSR6d^hkV%cZ?xiBW Sn4y0LFPuIPheu;~@!>CDx#>v& diff --git a/Source/Examples/OpenGL/1.x/ImmediateMode.cs b/Source/Examples/OpenGL/1.x/ImmediateMode.cs deleted file mode 100644 index 76d8e9f8..00000000 --- a/Source/Examples/OpenGL/1.x/ImmediateMode.cs +++ /dev/null @@ -1,192 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region --- Using Directives --- - -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using System.Threading; -using System.Drawing; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -#endregion - -namespace Examples.Tutorial -{ - /// - /// Demonstrates immediate mode rendering. - /// - [Example("Immediate mode", ExampleCategory.OpenGL, "1.x", 1, Documentation = "ImmediateMode")] - public class T03_Immediate_Mode_Cube : GameWindow - { - #region --- Fields --- - - const float rotation_speed = 180.0f; - float angle; - - #endregion - - #region --- Constructor --- - - public T03_Immediate_Mode_Cube() - : base(800, 600) - { } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - } - - #endregion - - #region OnResize - - /// - /// Called when the user resizes the window. - /// - /// Contains the new width/height of the window. - /// - /// You want the OpenGL viewport to match the window. This is the place to do it! - /// - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(0, 0, Width, Height); - - double aspect_ratio = Width / (double)Height; - - OpenTK.Matrix4 perspective = OpenTK.Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)aspect_ratio, 1, 64); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perspective); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Prepares the next frame for rendering. - /// - /// - /// Place your control logic here. This is the place to respond to user input, - /// update object positions etc. - /// - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - return; - } - } - - #endregion - - #region OnRenderFrame - - /// - /// Place your rendering code here. - /// - protected override void OnRenderFrame(FrameEventArgs e) - { - base.OnRenderFrame(e); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - Matrix4 lookat = Matrix4.LookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - angle += rotation_speed * (float)e.Time; - GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - - DrawCube(); - - this.SwapBuffers(); - Thread.Sleep(1); - } - - #endregion - - #region private void DrawCube() - - private void DrawCube() - { - GL.Begin(PrimitiveType.Quads); - - GL.Color3(Color.Silver); - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, -1.0f); - - GL.Color3(Color.Honeydew); - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - - GL.Color3(Color.Moccasin); - - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - - GL.Color3(Color.IndianRed); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - - GL.Color3(Color.PaleVioletRed); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - - GL.Color3(Color.ForestGreen); - GL.Vertex3(1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - - GL.End(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (T03_Immediate_Mode_Cube example = new T03_Immediate_Mode_Cube()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGL/1.x/ImmediateMode.rtf b/Source/Examples/OpenGL/1.x/ImmediateMode.rtf deleted file mode 100644 index dcf28cd2c65d5492fa1517099794e92955fa1408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmbtU!EW0)5Z!aWVvtj^aAixbi|+cgn+Dxr(>7>>0tI-X$dN>tB2{t}B{1~w9ZGKP zw8sL5JdijuZ{C~7y$Dq0Lb_$MJ`I)W06msPz>2hSLdtsT9l%S#cQ~66uj;g8Sg~NaAQ%V z(`VD;zA+J^Y&(mfvGpzzcf|td0pE0q{a$pdRsT&N37PCqdKUcg|!P_{Kbt=_e zz!>2=s+6vHg59i-^^C0SiM&g!;iI7wTf}or(*v#v%U^o6FU_DGT`8OC2w_spn^8q8}G2e4hlgQ+So!H%0gO zc;$W2aV|P7T!+e3hUIyfl0g#JW-4*2IFEIN$jhD(rp#aDpGH3}_$Nf*d%>X9$;Xw| zhE28q@5|lw$J?9t|HFAh)cw6&4#SXnwg~Mq<=dt9YRQ*K#{?~lW%^Lt<#z)tkKCM( zBbT>2L`!?oTQ+?GzgKb`$LS*Dn*k=9v_9~lZgNBN3h?g$#i$dVPL}PSsd*FRaMhQ5 nMIbd^Lu~vIfgdN9mItpd*nX@J3!qX)ANeZziQBpQc=pFP$Y}aD diff --git a/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs b/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs deleted file mode 100644 index ea3a45b3..00000000 --- a/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.cs +++ /dev/null @@ -1,443 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Drawing; -using System.Collections.Generic; -using System.Diagnostics; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.Tutorial -{ - [Example( "OpenGL Diagnostics", ExampleCategory.OpenGL, "1.x", Documentation = "OpenGLDiagnostics" )] - - class GLDiagnostics : GameWindow - { - /// Creates a 800x600 window with the specified title. - public GLDiagnostics() - : base(80, 60, GraphicsMode.Default, "OpenTK Quick Start Sample", GameWindowFlags.Default, DisplayDevice.Default, 3, 1, GraphicsContextFlags.Default) - { - VSync = VSyncMode.On; - this.Context.ErrorChecking = false; - } - - struct TexFormat - { - public PixelInternalFormat pif; - public PixelFormat pf; - public PixelType pt; - - public TexFormat(PixelInternalFormat _pif, PixelFormat _pf, PixelType _pt) - { - pif = _pif; - pf = _pf; - pt = _pt; - } - } - - TexFormat[] TextureFormats = new TexFormat[] - { - new TexFormat( PixelInternalFormat.Alpha, PixelFormat.Alpha, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Alpha4, PixelFormat.Alpha, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Alpha8, PixelFormat.Alpha, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Alpha12, PixelFormat.Alpha, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Alpha16, PixelFormat.Alpha, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.Alpha16fArb, PixelFormat.Alpha, PixelType.HalfFloat), - new TexFormat( (PixelInternalFormat)All.Alpha32fArb, PixelFormat.Alpha, PixelType.Float), - - new TexFormat( PixelInternalFormat.DepthComponent, PixelFormat.DepthComponent, PixelType.Int), - new TexFormat( PixelInternalFormat.DepthComponent16, PixelFormat.DepthComponent, PixelType.Float), - new TexFormat( PixelInternalFormat.DepthComponent24, PixelFormat.DepthComponent, PixelType.Float), - new TexFormat( PixelInternalFormat.DepthComponent32, PixelFormat.DepthComponent, PixelType.Float), - new TexFormat( PixelInternalFormat.DepthComponent32f, PixelFormat.DepthComponent, PixelType.Float), - new TexFormat( PixelInternalFormat.DepthStencil, PixelFormat.DepthStencil, PixelType.UnsignedInt248), - new TexFormat( PixelInternalFormat.Depth24Stencil8, PixelFormat.DepthStencil, PixelType.UnsignedInt248), - new TexFormat( PixelInternalFormat.Depth32fStencil8, PixelFormat.DepthStencil, PixelType.Float32UnsignedInt248Rev), - - new TexFormat( PixelInternalFormat.One, PixelFormat.Red, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Two, PixelFormat.Rg, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgb, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgba, PixelFormat.Rgba, PixelType.UnsignedByte), - - new TexFormat( PixelInternalFormat.Srgb, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.SrgbAlpha, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Srgb8, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Srgb8Alpha8, PixelFormat.Rgba, PixelType.UnsignedByte), - - new TexFormat( PixelInternalFormat.R16f, PixelFormat.Red, PixelType.HalfFloat), - new TexFormat( PixelInternalFormat.Rg16f, PixelFormat.Rg, PixelType.HalfFloat), - new TexFormat( PixelInternalFormat.Rgb16f, PixelFormat.Rgb, PixelType.HalfFloat), - new TexFormat( PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.HalfFloat), - new TexFormat( PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float), - new TexFormat( PixelInternalFormat.Rg32f, PixelFormat.Rg, PixelType.Float), - new TexFormat( PixelInternalFormat.Rgb32f, PixelFormat.Rgb, PixelType.Float), - new TexFormat( PixelInternalFormat.Rgba32f, PixelFormat.Rgba, PixelType.Float), - - new TexFormat( PixelInternalFormat.R8, PixelFormat.Red, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rg8, PixelFormat.Rg, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgb8, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte), - - new TexFormat( PixelInternalFormat.R8ui, PixelFormat.Red, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rg8ui, PixelFormat.Rg, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgb8ui, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgba8ui, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.R16ui, PixelFormat.Red, PixelType.UnsignedShort), - new TexFormat( PixelInternalFormat.Rg16ui, PixelFormat.Rg, PixelType.UnsignedShort), - new TexFormat( PixelInternalFormat.Rgb16ui, PixelFormat.Rgb, PixelType.UnsignedShort), - new TexFormat( PixelInternalFormat.Rgba16ui, PixelFormat.Rgba, PixelType.UnsignedShort), - new TexFormat( PixelInternalFormat.R32ui, PixelFormat.Red, PixelType.UnsignedInt), - new TexFormat( PixelInternalFormat.Rg32ui, PixelFormat.Rg, PixelType.UnsignedInt), - new TexFormat( PixelInternalFormat.Rgb32ui, PixelFormat.Rgb, PixelType.UnsignedInt), - new TexFormat( PixelInternalFormat.Rgba32ui, PixelFormat.Rgba, PixelType.UnsignedInt), - - new TexFormat( PixelInternalFormat.R8i, PixelFormat.Red, PixelType.Byte), - new TexFormat( PixelInternalFormat.Rg8i, PixelFormat.Rg, PixelType.Byte), - new TexFormat( PixelInternalFormat.Rgb8i, PixelFormat.Rgb, PixelType.Byte), - new TexFormat( PixelInternalFormat.Rgba8i, PixelFormat.Rgba, PixelType.Byte), - new TexFormat( PixelInternalFormat.R16i, PixelFormat.Red, PixelType.Short), - new TexFormat( PixelInternalFormat.Rg16i, PixelFormat.Rg, PixelType.Short), - new TexFormat( PixelInternalFormat.Rgb16i, PixelFormat.Rgb, PixelType.Short), - new TexFormat( PixelInternalFormat.Rgba16i, PixelFormat.Rgba, PixelType.Short), - new TexFormat( PixelInternalFormat.R32i, PixelFormat.Red, PixelType.Int), - new TexFormat( PixelInternalFormat.Rg32i, PixelFormat.Rg, PixelType.Int), - new TexFormat( PixelInternalFormat.Rgb32i, PixelFormat.Rgb, PixelType.Int), - new TexFormat( PixelInternalFormat.Rgba32i, PixelFormat.Rgba, PixelType.Int), - - new TexFormat( PixelInternalFormat.R3G3B2, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgb10A2, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgb5A1, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.Rgb9E5, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.R11fG11fB10f, PixelFormat.Rgb, PixelType.UnsignedByte), - - new TexFormat( PixelInternalFormat.CompressedAlpha, PixelFormat.Alpha, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedIntensity, PixelFormat.Luminance, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedLuminance, PixelFormat.Luminance, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedLuminanceAlpha, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedLuminanceLatc1Ext, PixelFormat.Luminance, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedLuminanceAlphaLatc2Ext, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), - - new TexFormat( PixelInternalFormat.CompressedRed, PixelFormat.Red, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedRedRgtc1, PixelFormat.Red, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedRedGreenRgtc2Ext, PixelFormat.Rg, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedRg, PixelFormat.Rg, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedRgRgtc2, PixelFormat.Rg, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedRgb, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedRgbFxt13Dfx, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedRgba, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedRgbaFxt13Dfx, PixelFormat.Rgba, PixelType.UnsignedByte), - - new TexFormat( (PixelInternalFormat)All.CompressedSignedLuminanceAlphaLatc2Ext, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedSignedLuminanceLatc1Ext, PixelFormat.Luminance, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSignedRedRgtc1, PixelFormat.Red, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSignedRgRgtc2, PixelFormat.Rg, PixelType.UnsignedByte), - - new TexFormat( PixelInternalFormat.CompressedSluminance, PixelFormat.Luminance, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSluminanceAlpha, PixelFormat.LuminanceAlpha, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSrgb, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSrgbAlpha, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSrgbS3tcDxt1Ext, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSrgbAlphaS3tcDxt1Ext, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSrgbAlphaS3tcDxt3Ext, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( PixelInternalFormat.CompressedSrgbAlphaS3tcDxt5Ext, PixelFormat.Rgba, PixelType.UnsignedByte), - - new TexFormat( (PixelInternalFormat)All.CompressedRgbS3tcDxt1Ext, PixelFormat.Rgb, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedRgbaS3tcDxt1Ext, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedRgbaS3tcDxt3Ext, PixelFormat.Rgba, PixelType.UnsignedByte), - new TexFormat( (PixelInternalFormat)All.CompressedRgbaS3tcDxt5Ext, PixelFormat.Rgba, PixelType.UnsignedByte), - - }; - - #region GL.Get* Helper - - public enum eType - { - Boolean, - Int, - IntEnum, - IntArray2, - IntArray4, - Float, - FloatArray2, - FloatArray4, - } - - public void Analyze(GetPName pname, eType type) - { - bool result1b; - int result1i; - int[] result2i = new int[2]; - int[] result4i = new int[4]; - float result1f; - Vector2 result2f; - Vector4 result4f; - string output; - - switch (type) - { - case eType.Boolean: - GL.GetBoolean(pname, out result1b); - output = pname + ": " + result1b; - break; - case eType.Int: - GL.GetInteger(pname, out result1i); - output = pname + ": " + result1i; - break; - case eType.IntEnum: - GL.GetInteger(pname, out result1i); - output = pname + ": " + (All)result1i; - break; - case eType.IntArray2: - GL.GetInteger(pname, result2i); - output = pname + ": ( " + result2i[0] + ", " + result2i[1] + " )"; - break; - case eType.IntArray4: - GL.GetInteger(pname, result4i); - output = pname + ": ( " + result4i[0] + ", " + result4i[1] + " ) ( " + result4i[2] + ", " + result4i[3] + " )"; - break; - case eType.Float: - GL.GetFloat(pname, out result1f); - output = pname + ": " + result1f; - break; - case eType.FloatArray2: - GL.GetFloat(pname, out result2f); - output = pname + ": ( " + result2f.X + ", " + result2f.Y + " )"; - break; - case eType.FloatArray4: - GL.GetFloat(pname, out result4f); - output = pname + ": ( " + result4f.X + ", " + result4f.Y + ", " + result4f.Z + ", " + result4f.W + " )"; - break; - default: throw new NotImplementedException(); - } - - ErrorCode err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("Unsupported Token: " + pname); - else - Trace.WriteLine(output); - - } - - #endregion GL.Get* Helper - - /// Load resources here. - /// Not used. - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - GL.ClearColor(System.Drawing.Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - - // returns 0 formats, driver broken? - /* - int CompressedTextureFormatCount; - GL.GetInteger(GetPName.NumCompressedTextureFormats, out CompressedTextureFormatCount); - if (CompressedTextureFormatCount > 0) - { - int[] CompressedTextureFormats = new int[CompressedTextureFormatCount]; - GL.GetInteger(GetPName.CompressedTextureFormats, CompressedTextureFormats); - Trace.WriteLine("Supported compressed Texture formats:"); - for (int i = 0; i < CompressedTextureFormats.Length; i++) - Trace.Write((All)CompressedTextureFormats[i] + ", "); - } - */ - - string Renderer = GL.GetString(StringName.Renderer); - string GLSLang = GL.GetString(StringName.ShadingLanguageVersion); - string Vendor = GL.GetString(StringName.Vendor); - string Version = GL.GetString(StringName.Version); - - string ExtensionsRaw = GL.GetString(StringName.Extensions); - string[] splitter = new string[] { " " }; - string[] Extensions = ExtensionsRaw.Split(splitter, StringSplitOptions.None); - - Trace.WriteLine("Vendor: " + Vendor); - Trace.WriteLine("Renderer: " + Renderer); - Trace.WriteLine("GL Version: " + Version); - Analyze(GetPName.MajorVersion, eType.Int); - Analyze(GetPName.MinorVersion, eType.Int); - Trace.WriteLine("GLSL Version: " + GLSLang); - Trace.WriteLine("Extensions: "); - for (int i = 0; i < Extensions.Length; i++) - Trace.WriteLine(Extensions[i]); - - Trace.WriteLine("--- Framebuffer ---"); - Analyze(GetPName.Doublebuffer, eType.Boolean); - Analyze(GetPName.MaxColorAttachments, eType.Int); - Analyze(GetPName.MaxDrawBuffers, eType.Int); - Analyze(GetPName.AuxBuffers, eType.Int); - Analyze(GetPName.DrawBuffer, eType.IntEnum); - Analyze(GetPName.MaxSamples, eType.Int); - Analyze(GetPName.MaxViewportDims, eType.IntArray2); - Analyze(GetPName.Viewport, eType.IntArray4); - - Trace.WriteLine("--- Framebuffer channels ---"); - Analyze(GetPName.RedBits, eType.Int); - Analyze(GetPName.GreenBits, eType.Int); - Analyze(GetPName.BlueBits, eType.Int); - Analyze(GetPName.AlphaBits, eType.Int); - Analyze(GetPName.DepthBits, eType.Int); - Analyze(GetPName.StencilBits, eType.Int); - - Analyze(GetPName.AccumRedBits, eType.Int); - Analyze(GetPName.AccumGreenBits, eType.Int); - Analyze(GetPName.AccumBlueBits, eType.Int); - Analyze(GetPName.AccumAlphaBits, eType.Int); - - Trace.WriteLine("--- Textures ---"); - Analyze(GetPName.MaxCombinedTextureImageUnits, eType.Int); - Analyze(GetPName.MaxVertexTextureImageUnits, eType.Int); - Analyze(GetPName.MaxTextureImageUnits, eType.Int); - Analyze(GetPName.MaxTextureUnits, eType.Int); - Analyze(GetPName.MaxTextureSize, eType.Int); - Analyze(GetPName.Max3DTextureSize, eType.Int); - Analyze(GetPName.MaxCubeMapTextureSize, eType.Int); - Analyze(GetPName.MaxRenderbufferSize, eType.Int); - Analyze(GetPName.MaxTextureLodBias, eType.Int); - - Queue Supported = new Queue(); - Queue Unsupported = new Queue(); - - uint DummyTexture; - foreach (TexFormat t in TextureFormats) - { - GL.GenTextures(1, out DummyTexture); - GL.BindTexture(TextureTarget.Texture2D, DummyTexture); - GL.TexImage2D(TextureTarget.Texture2D, 0, t.pif, 4, 4, 0, t.pf, t.pt, IntPtr.Zero); - if (GL.GetError() == ErrorCode.NoError) - Supported.Enqueue(t); - else - Unsupported.Enqueue(t); - GL.DeleteTextures(1, ref DummyTexture); - } - GL.BindTexture(TextureTarget.Texture2D, 0); - - Trace.WriteLine("--- UN-supported Texture formats ---"); - while (Unsupported.Count > 0) - { - TexFormat tex = Unsupported.Dequeue(); - Trace.Write((All)tex.pif+", "); - } - Trace.WriteLine( " " ); - - Trace.WriteLine("--- SUPPORTED Texture formats ---"); - while (Supported.Count > 0) - { - TexFormat tex = Supported.Dequeue(); - Trace.WriteLine((All)tex.pif+" " +tex.pf + " "+tex.pt); - } - Trace.WriteLine(" "); - - Trace.WriteLine("--- Point&Line volumes ---"); - Analyze(GetPName.AliasedPointSizeRange, eType.FloatArray2); - Analyze(GetPName.PointSizeMin, eType.Float); - Analyze(GetPName.PointSizeMax, eType.Float); - Analyze(GetPName.PointSizeGranularity, eType.Float); - Analyze(GetPName.PointSizeRange, eType.FloatArray2); - - Analyze(GetPName.AliasedLineWidthRange, eType.FloatArray2); - Analyze(GetPName.LineWidthGranularity, eType.Float); - Analyze(GetPName.LineWidthRange, eType.FloatArray2); - - Trace.WriteLine("--- VBO ---"); - Analyze(GetPName.MaxElementsIndices, eType.Int); - Analyze(GetPName.MaxElementsVertices, eType.Int); - Analyze(GetPName.MaxVertexAttribs, eType.Int); - - Trace.WriteLine("--- GLSL ---"); - Analyze(GetPName.MaxCombinedFragmentUniformComponents, eType.Int); - Analyze(GetPName.MaxCombinedGeometryUniformComponents, eType.Int); - Analyze(GetPName.MaxCombinedVertexUniformComponents, eType.Int); - Analyze(GetPName.MaxFragmentUniformComponents, eType.Int); - Analyze(GetPName.MaxVertexUniformComponents, eType.Int); - - Analyze(GetPName.MaxCombinedUniformBlocks, eType.Int); - Analyze(GetPName.MaxFragmentUniformBlocks, eType.Int); - Analyze(GetPName.MaxGeometryUniformBlocks, eType.Int); - Analyze(GetPName.MaxVertexUniformBlocks, eType.Int); - Analyze(GetPName.MaxUniformBlockSize, eType.Int); - Analyze(GetPName.MaxUniformBufferBindings, eType.Int); - - Analyze(GetPName.MaxVaryingFloats, eType.Int); - - Trace.WriteLine("--- Transform Feedback ---"); - Analyze(GetPName.MaxTransformFeedbackInterleavedComponents, eType.Int); - Analyze(GetPName.MaxTransformFeedbackSeparateAttribs, eType.Int); - Analyze(GetPName.MaxTransformFeedbackSeparateComponents, eType.Int); - - Trace.WriteLine("--- Fixed-Func Stacks, GL.Push* and GL.Pop* ---"); - Analyze(GetPName.MaxClientAttribStackDepth, eType.Int); - Analyze(GetPName.MaxAttribStackDepth, eType.Int); - Analyze(GetPName.MaxProjectionStackDepth, eType.Int); - Analyze(GetPName.MaxModelviewStackDepth, eType.Int); - Analyze(GetPName.MaxTextureStackDepth, eType.Int); - Analyze(GetPName.MaxNameStackDepth, eType.Int); - - Trace.WriteLine("--- Fixed-Func misc. stuff ---"); - Analyze(GetPName.MaxEvalOrder, eType.Int); - Analyze(GetPName.MaxClipPlanes, eType.Int); - Analyze(GetPName.MaxArrayTextureLayers, eType.Int); - Analyze(GetPName.MaxListNesting, eType.Int); - Analyze(GetPName.MaxLights, eType.Int); - Analyze(GetPName.MaxTextureCoords, eType.Int); - - this.Exit(); - } - - /// - /// Called when your window is resized. Set your viewport here. It is also - /// a good place to set up your projection matrix (which probably changes - /// along when the aspect ratio of your window). - /// - /// Not used. - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(ClientRectangle); - } - - /// - /// Called when it is time to setup the next frame. Add you game logic here. - /// - /// Contains timing information for framerate independent logic. - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Escape]) - Exit(); - } - - /// - /// Called when it is time to render the next frame. Add your rendering code here. - /// - /// Contains timing information. - protected override void OnRenderFrame(FrameEventArgs e) - { - base.OnRenderFrame(e); - } - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // The 'using' idiom guarantees proper resource cleanup. - // We request 30 UpdateFrame events per second, and unlimited - // RenderFrame events (as fast as the computer can handle). - using (GLDiagnostics game = new GLDiagnostics()) - { - game.Run(10.0); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.rtf b/Source/Examples/OpenGL/1.x/OpenGLDiagnostics.rtf deleted file mode 100644 index c97ed1b652e3fee23f039e13ff999776262f1a65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmYk2y>7!W41_!9DL8j9Y$qvNWGXro1^PF1w87EKB3K^vc29(Arh>;_FOvKNx z(B^9Nt6;c;??mD<=GX=q&Fl-_?eqJCOT0iP0jF(VwD_YjAq;53rA(1ioTVIa;b MgV%3aY|g8jKYG%qzW@LL diff --git a/Source/Examples/OpenGL/1.x/Picking.cs b/Source/Examples/OpenGL/1.x/Picking.cs deleted file mode 100644 index deb28812..00000000 --- a/Source/Examples/OpenGL/1.x/Picking.cs +++ /dev/null @@ -1,323 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.IO; -using System.Drawing; -using System.Diagnostics; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -using Examples.Shapes; - -namespace Examples.Tutorial -{ - /// - /// This demo shows over which triangle the cursor is, it does so by assigning all 3 vertices of a triangle the same Ids. - /// Each Id is a uint, split into 4 bytes and used as triangle color. In an extra pass, the screen is cleared to uint.MaxValue, - /// and then the mesh is drawn using color. Using GL.ReadPixels() the value under the mouse cursor is read and can be converted. - /// - [Example("Picking", ExampleCategory.OpenGL, "1.x", Documentation = "Picking")] - class Picking : GameWindow - { - int mouse_x, mouse_y; - - /// Creates a 800x600 window with the specified title. - public Picking() - : base(800, 600, GraphicsMode.Default, "Picking", GameWindowFlags.Default, DisplayDevice.Default, 1, 1, GraphicsContextFlags.Default) - { - VSync = VSyncMode.On; - - MouseMove += (sender, e) => - { - mouse_x = e.X; - mouse_y = e.Y; - }; - } - - struct Byte4 - { - public byte R, G, B, A; - - public Byte4(byte[] input) - { - R = input[0]; - G = input[1]; - B = input[2]; - A = input[3]; - } - - public uint ToUInt32() - { - byte[] temp = new byte[] { this.R, this.G, this.B, this.A }; - return BitConverter.ToUInt32(temp, 0); - } - - public override string ToString() - { - return this.R + ", " + this.G + ", " + this.B + ", " + this.A; - } - } - - struct Vertex - { - public Byte4 Color; // 4 bytes - public Vector3 Position; // 12 bytes - - public const byte SizeInBytes = 16; - } - - const TextureTarget Target = TextureTarget.TextureRectangleArb; - float angle; - PrimitiveType VBO_PrimMode; - Vertex[] VBO_Array; - uint VBO_Handle; - - uint SelectedTriangle; - - // int VertexShaderObject, FragmentShaderObject, ProgramObject; - - /// Load resources here. - /// Not used. - protected override void OnLoad(EventArgs e) - { - GL.Enable(EnableCap.DepthTest); - GL.Enable(EnableCap.CullFace); - - #region prepare data for VBO from procedural object - DrawableShape temp_obj = new SierpinskiTetrahedron(3f, SierpinskiTetrahedron.eSubdivisions.Five, false); - VertexT2fN3fV3f[] temp_VBO; - uint[] temp_IBO; - temp_obj.GetArraysforVBO(out VBO_PrimMode, out temp_VBO, out temp_IBO); - temp_obj.Dispose(); - if (temp_IBO != null) - throw new Exception("Expected data for GL.DrawArrays, but Element Array is not null."); - - // Convert from temp mesh to final object, copy position and add triangle Ids for the color attribute. - VBO_Array = new Vertex[temp_VBO.Length]; - int TriangleCounter = -1; - for (int i = 0; i < temp_VBO.Length; i++) - { - // Position - VBO_Array[i].Position = temp_VBO[i].Position; - - // Index - if (i % 3 == 0) - TriangleCounter++; - VBO_Array[i].Color = new Byte4(BitConverter.GetBytes(TriangleCounter)); - } - #endregion prepare data for VBO from procedural object - - #region Setup VBO for drawing - GL.GenBuffers(1, out VBO_Handle); - GL.BindBuffer(BufferTarget.ArrayBuffer, VBO_Handle); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(VBO_Array.Length * Vertex.SizeInBytes), VBO_Array, BufferUsageHint.StaticDraw); - GL.InterleavedArrays(InterleavedArrayFormat.C4ubV3f, 0, IntPtr.Zero); - - ErrorCode err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("VBO Setup failed (Error: " + err + "). Attempting to continue."); - #endregion Setup VBO for drawing - - #region Shader - /* - // Load&Compile Vertex Shader - - using (StreamReader sr = new StreamReader("Data/Shaders/Picking_VS.glsl")) - { - VertexShaderObject = GL.CreateShader(ShaderType.VertexShader); - GL.ShaderSource(VertexShaderObject, sr.ReadToEnd()); - GL.CompileShader(VertexShaderObject); - } - - err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("Vertex Shader: " + err); - - string LogInfo; - GL.GetShaderInfoLog(VertexShaderObject, out LogInfo); - if (LogInfo.Length > 0 && !LogInfo.Contains("hardware")) - Trace.WriteLine("Vertex Shader failed!\nLog:\n" + LogInfo); - else - Trace.WriteLine("Vertex Shader compiled without complaint."); - - // Load&Compile Fragment Shader - - using (StreamReader sr = new StreamReader("Data/Shaders/Picking_FS.glsl")) - { - FragmentShaderObject = GL.CreateShader(ShaderType.FragmentShader); - GL.ShaderSource(FragmentShaderObject, sr.ReadToEnd()); - GL.CompileShader(FragmentShaderObject); - } - GL.GetShaderInfoLog(FragmentShaderObject, out LogInfo); - - err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("Fragment Shader: " + err); - - if (LogInfo.Length > 0 && !LogInfo.Contains("hardware")) - Trace.WriteLine("Fragment Shader failed!\nLog:\n" + LogInfo); - else - Trace.WriteLine("Fragment Shader compiled without complaint."); - - // Link the Shaders to a usable Program - ProgramObject = GL.CreateProgram(); - GL.AttachShader(ProgramObject, VertexShaderObject); - GL.AttachShader(ProgramObject, FragmentShaderObject); - - // link it all together - GL.LinkProgram(ProgramObject); - - err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("LinkProgram: " + err); - - GL.UseProgram(ProgramObject); - - err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("UseProgram: " + err); - - // flag ShaderObjects for delete when not used anymore - GL.DeleteShader(VertexShaderObject); - GL.DeleteShader(FragmentShaderObject); - - int temp; - GL.GetProgram(ProgramObject, ProgramParameter.LinkStatus, out temp); - Trace.WriteLine("Linking Program (" + ProgramObject + ") " + ((temp == 1) ? "succeeded." : "FAILED!")); - if (temp != 1) - { - GL.GetProgramInfoLog(ProgramObject, out LogInfo); - Trace.WriteLine("Program Log:\n" + LogInfo); - } - - Trace.WriteLine("End of Shader build. GL Error: " + GL.GetError()); - - GL.UseProgram(0); -*/ - #endregion Shader - } - - protected override void OnUnload(EventArgs e) - { - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - GL.DeleteBuffers(1, ref VBO_Handle); - - base.OnUnload(e); - } - - /// - /// Called when your window is resized. Set your viewport here. It is also - /// a good place to set up your projection matrix (which probably changes - /// along when the aspect ratio of your window). - /// - /// Contains information on the new Width and Size of the GameWindow. - protected override void OnResize(EventArgs e) - { - GL.Viewport(ClientRectangle); - - Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, this.Width / (float)this.Height, 0.1f, 10.0f); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref projection); - } - - /// - /// Called when it is time to setup the next frame. Add you game logic here. - /// - /// Contains timing information for framerate independent logic. - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Escape]) - Exit(); - } - - /// - /// Called when it is time to render the next frame. Add your rendering code here. - /// - /// Contains timing information. - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Color3(Color.White); - GL.EnableClientState(ArrayCap.ColorArray); - - #region Pass 1: Draw Object and pick Triangle - GL.ClearColor(1f, 1f, 1f, 1f); // clears to uint.MaxValue - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - Matrix4 modelview = Matrix4.LookAt(Vector3.UnitZ, Vector3.Zero, Vector3.UnitY); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref modelview); - GL.Translate(0f, 0f, -3f); - GL.Rotate(angle, Vector3.UnitX); - GL.Rotate(angle, Vector3.UnitY); - angle += (float)e.Time * 3.0f; - - // You may re-enable the shader, but it works perfectly without and will run on intel HW too - // GL.UseProgram(ProgramObject); - GL.DrawArrays(VBO_PrimMode, 0, VBO_Array.Length); - // GL.UseProgram(0); - - // Read Pixel under mouse cursor - Byte4 Pixel = new Byte4(); - GL.ReadPixels(mouse_x, this.Height - mouse_y, 1, 1, PixelFormat.Rgba, PixelType.UnsignedByte, ref Pixel); - SelectedTriangle = Pixel.ToUInt32(); - #endregion Pass 1: Draw Object and pick Triangle - - GL.Color3(Color.White); - GL.DisableClientState(ArrayCap.ColorArray); - - #region Pass 2: Draw Shape - if (SelectedTriangle == uint.MaxValue) - GL.ClearColor(.2f, .1f, .3f, 1f); // purple - else - GL.ClearColor(0f, .2f, .3f, 1f); // cyan - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.Color3(1f, 1f, 1f); - GL.DrawArrays(VBO_PrimMode, 0, VBO_Array.Length); - - GL.PolygonMode(MaterialFace.Front, PolygonMode.Line); - GL.Color3(Color.Red); - GL.DrawArrays(VBO_PrimMode, 0, VBO_Array.Length); - GL.PolygonMode(MaterialFace.Front, PolygonMode.Fill); - - if (SelectedTriangle != uint.MaxValue) - { - GL.Disable(EnableCap.DepthTest); - GL.Color3(Color.Green); - GL.DrawArrays(VBO_PrimMode, (int)SelectedTriangle * 3, 3); - GL.Enable(EnableCap.DepthTest); - } - #endregion Pass 2: Draw Shape - - this.SwapBuffers(); - - ErrorCode err = GL.GetError(); - if (err != ErrorCode.NoError) - Trace.WriteLine("Error at Swapbuffers: " + err); - } - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // The 'using' idiom guarantees proper resource cleanup. - // We request 30 UpdateFrame events per second, and unlimited - // RenderFrame events (as fast as the computer can handle). - using (Picking example = new Picking()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); - example.Title = String.Format("OpenTK | {0} {1}: {2} (use the mouse to pick)", info.Category, info.Difficulty, info.Title); - example.Run(30.0); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/Picking.rtf b/Source/Examples/OpenGL/1.x/Picking.rtf deleted file mode 100644 index 763dd773d6f3e0ce89b03509382ef25a90f53247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 zcmZ`(T~FIE6x}nw;*KYnwx}O4ZQ_Yd6G8$FA+#sIIQC8J&9O7vp;Uy)|7=sY>?&z_zR z9+incCXCUUN^IvJmui)m!(y&lKk{OJCPVMkiUTKIVxsHZ6}GO>X>&4f7WkabKA%0Q zd&iq!F4z+_nzJio@g3_`#mx_OYN2pYh}bE z0zZl!wr2to2qUSDE9(hJ_e^!RA<|Kn5BjiFThE%CTI?8h8@1_vAynEljto zR@1#kA75xZr_QBZ2>LB2K^VXo?lVfhQzA_kzbbBXtsi~}$a@%85K#C*DuFM- zQeJDIP3H-DkM(c6bQe=~7QRBr-V(UC#?K9%qs9@bYk3@+pIJ)RqU2IQWFw7by0~g? zS=$@;z&;-x3+2QmIo<_7$PH@Q$4ymMyG>?HIi`lbY%vZ0|5pF6r@MaFJthXps6PK} zsKh6!?>1=ks(LTK?NZ-|@{jkKfoEUH`j7cB7S_5(@fQV7Gp3)~$ZK&DZ_aoFblIV)l<_ za*a7!_Qok)vbk?I+pXzLkoF7w%!SEMu0+bFQ!;7WTD_W=-$N7-J025)$C0uWbwz

    |%m$3IQ2{axrF)9CHtDmQ{-rf>4ScdZZBxzrmeWJ{^8Q%pij{{&D?o zUhi#6bYAS_PWz;?vBKcM_TAuNJt(j4mmMyexF4O7vnEIuk>yA&Rr ZBBq - /// Uses System.Drawing for 2d text rendering. - /// - public class TextRenderer : IDisposable - { - Bitmap bmp; - Graphics gfx; - int texture; - Rectangle dirty_region; - bool disposed; - - #region Constructors - - ///

    - /// Constructs a new instance. - /// - /// The width of the backing store in pixels. - /// The height of the backing store in pixels. - public TextRenderer(int width, int height) - { - if (width <= 0) - throw new ArgumentOutOfRangeException("width"); - if (height <= 0) - throw new ArgumentOutOfRangeException("height "); - if (GraphicsContext.CurrentContext == null) - throw new InvalidOperationException("No GraphicsContext is current on the calling thread."); - - bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - gfx = Graphics.FromImage(bmp); - gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; - - texture = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, texture); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, - PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); - } - - #endregion - - #region Public Members - - /// - /// Clears the backing store to the specified color. - /// - /// A . - public void Clear(Color color) - { - gfx.Clear(color); - dirty_region = new Rectangle(0, 0, bmp.Width, bmp.Height); - } - - /// - /// Draws the specified string to the backing store. - /// - /// The to draw. - /// The that will be used. - /// The that will be used. - /// The location of the text on the backing store, in 2d pixel coordinates. - /// The origin (0, 0) lies at the top-left corner of the backing store. - public void DrawString(string text, Font font, Brush brush, PointF point) - { - gfx.DrawString(text, font, brush, point); - - SizeF size = gfx.MeasureString(text, font); - dirty_region = Rectangle.Round(RectangleF.Union(dirty_region, new RectangleF(point, size))); - dirty_region = Rectangle.Intersect(dirty_region, new Rectangle(0, 0, bmp.Width, bmp.Height)); - } - - /// - /// Gets a that represents an OpenGL 2d texture handle. - /// The texture contains a copy of the backing store. Bind this texture to TextureTarget.Texture2d - /// in order to render the drawn text on screen. - /// - public int Texture - { - get - { - UploadBitmap(); - return texture; - } - } - - #endregion - - #region Private Members - - // Uploads the dirty regions of the backing store to the OpenGL texture. - void UploadBitmap() - { - if (dirty_region != RectangleF.Empty) - { - System.Drawing.Imaging.BitmapData data = bmp.LockBits(dirty_region, - System.Drawing.Imaging.ImageLockMode.ReadOnly, - System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - GL.BindTexture(TextureTarget.Texture2D, texture); - GL.TexSubImage2D(TextureTarget.Texture2D, 0, - dirty_region.X, dirty_region.Y, dirty_region.Width, dirty_region.Height, - PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); - - bmp.UnlockBits(data); - - dirty_region = Rectangle.Empty; - } - } - - #endregion - - #region IDisposable Members - - void Dispose(bool manual) - { - if (!disposed) - { - if (manual) - { - bmp.Dispose(); - gfx.Dispose(); - if (GraphicsContext.CurrentContext != null) - GL.DeleteTexture(texture); - } - - disposed = true; - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - ~TextRenderer() - { - Console.WriteLine("[Warning] Resource leaked: {0}.", typeof(TextRenderer)); - } - - #endregion - } - - #region Constructor - - public TextRendering() - : base(800, 600) - { - } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - renderer = new TextRenderer(Width, Height); - PointF position = PointF.Empty; - - renderer.Clear(Color.MidnightBlue); - renderer.DrawString("The quick brown fox jumps over the lazy dog", serif, Brushes.White, position); - position.Y += serif.Height; - renderer.DrawString("The quick brown fox jumps over the lazy dog", sans, Brushes.White, position); - position.Y += sans.Height; - renderer.DrawString("The quick brown fox jumps over the lazy dog", mono, Brushes.White, position); - position.Y += mono.Height; - } - - #endregion - - #region OnUnload - - protected override void OnUnload(EventArgs e) - { - renderer.Dispose(); - } - - #endregion - - #region OnResize - - protected override void OnResize(EventArgs e) - { - GL.Viewport(ClientRectangle); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0); - } - - #endregion - - #region OnUpdateFrame - - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - } - } - - #endregion - - #region OnRenderFrame - - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - - GL.Enable(EnableCap.Texture2D); - GL.BindTexture(TextureTarget.Texture2D, renderer.Texture); - GL.Begin(PrimitiveType.Quads); - - GL.TexCoord2(0.0f, 1.0f); GL.Vertex2(-1f, -1f); - GL.TexCoord2(1.0f, 1.0f); GL.Vertex2(1f, -1f); - GL.TexCoord2(1.0f, 0.0f); GL.Vertex2(1f, 1f); - GL.TexCoord2(0.0f, 0.0f); GL.Vertex2(-1f, 1f); - - GL.End(); - - SwapBuffers(); - } - - #endregion - - #region Main - - public static void Main() - { - using (TextRendering example = new TextRendering()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGL/1.x/TextRendering.rtf b/Source/Examples/OpenGL/1.x/TextRendering.rtf deleted file mode 100644 index bcd196234f7fcaeba9166508e004215773f5611d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmZvaO^e$w5Qclsub5-MFtM{KEjewwWm#xx>E=?P|K72^Z9^y+ zVKk#>-g#$^B9W$iiHiX&|tgEZKYWQ0(KWt87XL0{v zy}lAf)gsEIg<^G1`mSECR-zRqH}B!jQwq8$vcZd%mF1=xvlr8`?QMoEhv*PA4#8*Q zs+d7~kTIqpRSy)P(Lne}kkD&P)_1V867CO~aHwvQ+>ci;Z*T72ysG}ue})2zNh-tx zP>-->#*Ybs36zsLk8r6q8$&e9oY~fo zRWDMikCp}*D;TMYXNjIN1TzVrV;~bki7rTuYzQ+ve2eIBzf9c1(O!DZUQ#bH&uv&A3eZF Kdp?uX;>B= target) - { - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.GenerateMipmap, (int)All.True); - GL.TexParameter(Target, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); - } - else - { - GL.TexParameter(Target, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - } - GL.TexParameter(Target, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - - GL.TexParameter(Target, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); - GL.TexParameter(Target, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); - - Bitmap bitmap = new Bitmap(filename); - BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - GL.TexImage2D(Target, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); - GL.Finish(); - bitmap.UnlockBits(data); - - if (GL.GetError() != ErrorCode.NoError) - throw new Exception("Error loading texture " + filename); - - return texture; - } - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - using (TextureMatrix example = new TextureMatrix()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); - example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - example.Run(30.0, 0.0); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/TextureMatrix.rtf b/Source/Examples/OpenGL/1.x/TextureMatrix.rtf deleted file mode 100644 index c2621c0df6d60aeb12d10bb410ca5cc15820de29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmZ9JPiq@75XF1;rx7qEhTIrblG?`;pH~XEk=v;MCj$+PjkVU0j^g%h(YfhLexM#1!;dERd)(?^fQ%FnU1Nb*%O7NHrh&vO!d7Ee^ zknq|uXNm=ZXP@V1pXnqd5j0SdBsHcy(dEqOL4sQNldsiyF*RV6&SHHoeUMRa;YIHM zich31;7K~6*U<)K2y!%M@J>ARB - /// Demonstrates simple OpenGL Texturing. - /// - [Example("Texture mapping", ExampleCategory.OpenGL, "1.x", 5, Documentation = "Textures")] - public class Textures : GameWindow - { - Bitmap bitmap = new Bitmap("Data/Textures/logo.jpg"); - int texture; - - public Textures() : base(800, 600) { } - - #region OnLoad - - /// - /// Setup OpenGL and load resources here. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.Texture2D); - - GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest); - - GL.GenTextures(1, out texture); - GL.BindTexture(TextureTarget.Texture2D, texture); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - - BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), - ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, - OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); - - bitmap.UnlockBits(data); - } - - #endregion - - #region OnUnload - - protected override void OnUnload(EventArgs e) - { - GL.DeleteTextures(1, ref texture); - } - - #endregion - - #region OnResize - - /// - /// Respond to resize events here. - /// - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Add your game logic here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - this.Exit(); - } - - #endregion - - #region OnRenderFrame - - /// - /// Add your game rendering code here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - GL.BindTexture(TextureTarget.Texture2D, texture); - - GL.Begin(PrimitiveType.Quads); - - GL.TexCoord2(0.0f, 1.0f); GL.Vertex2(-0.6f, -0.4f); - GL.TexCoord2(1.0f, 1.0f); GL.Vertex2(0.6f, -0.4f); - GL.TexCoord2(1.0f, 0.0f); GL.Vertex2(0.6f, 0.4f); - GL.TexCoord2(0.0f, 0.0f); GL.Vertex2(-0.6f, 0.4f); - - GL.End(); - - SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (Textures example = new Textures()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)typeof(Textures).GetCustomAttributes(false)[0]); - example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGL/1.x/Textures.rtf b/Source/Examples/OpenGL/1.x/Textures.rtf deleted file mode 100644 index 383511565bc0c083d3aee1a039b65fadb9fc2b38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1698 zcmaJ>-A~&(6u-~>73c1$olw-IFx?AJFa|<`4ecWBB`5dZsrwp)=h zZ4xSOeSCf&=i|AwzR63Wos1vV(B{SIvaGpj7SCm4wD&88!=h}oRAp0j!aDW~y0B8H z^Ou*S=dv=&ScK7eX}QinEX&q1>mn~#YUCn64?*wCmNi@9jir0nc&??V)9fVA3jCce z{yl#w*OE6sq^?iOvC7Lq*t)F1P6^%Si{-Lhm5nR@pwp#3yVF;xL!_ZNIY^+7XF-@p9D@U_;@j#q9$-SEg5^Gtr0q@?} zZFazLnzVUM28f9Xkh+mdQL1pT{4n7y;5&v7wIOXhL3-64@5>&aiqRYVEGwbZHgxNn zt&e_9aAIdo{R2|`dg#P4Z8}+XiIdb7hBOpk$+q(}u#Gx&#W=$~zkS;R%jmg(T?|Nw zR(l#Su+oDbR)JVyU-WXo1UOo42}{mnC}=l4_flU=h4KV5?obwCY4+OR4C*w^(24!;k2+LwmxN zWccWUoU{?b9_EzjU?gLQo}AHDDl77|pa{h~=4dr+$dG3z{ZmvlOaDHKAkJGq@4MX3smCP7+kaWlUm4(p?&E~>_9*0nC&ws}~@pAOnPh<*O_5c6? diff --git a/Source/Examples/OpenGL/1.x/VBODynamic.cs b/Source/Examples/OpenGL/1.x/VBODynamic.cs deleted file mode 100644 index 3b0fc0b0..00000000 --- a/Source/Examples/OpenGL/1.x/VBODynamic.cs +++ /dev/null @@ -1,212 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.Tutorial -{ - - [Example("VBO Dynamic", ExampleCategory.OpenGL, "1.x", 4, Documentation = "VBODynamic")] - class T09_VBO_Dynamic : GameWindow - { - /// Creates a 800x600 window with the specified title. - public T09_VBO_Dynamic() - : base(800, 600) - { - this.VSync = VSyncMode.Off; - } - - #region Particles - static int MaxParticleCount = 2000; - int VisibleParticleCount; - VertexC4ubV3f[] VBO = new VertexC4ubV3f[MaxParticleCount]; - ParticleAttribut[] ParticleAttributes = new ParticleAttribut[MaxParticleCount]; - - // this struct is used for drawing - struct VertexC4ubV3f - { - public byte R, G, B, A; - public Vector3 Position; - - public static int SizeInBytes = 16; - } - - // this struct is used for updates - struct ParticleAttribut - { - public Vector3 Direction; - public uint Age; - // more stuff could be here: Rotation, Radius, whatever - } - - uint VBOHandle; - #endregion Particles - - /// Load resources here. - /// Not used. - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - Version version = new Version(GL.GetString(StringName.Version).Substring(0, 3)); - Version target = new Version(1, 5); - if (version < target) - { - throw new NotSupportedException(String.Format( - "OpenGL {0} is required (you only have {1}).", target, version)); - } - - GL.ClearColor(.1f, 0f, .1f, 0f); - GL.Enable(EnableCap.DepthTest); - - // Setup parameters for Points - GL.PointSize(5f); - GL.Enable(EnableCap.PointSmooth); - GL.Hint(HintTarget.PointSmoothHint, HintMode.Nicest); - - // Setup VBO state - GL.EnableClientState(ArrayCap.ColorArray); - GL.EnableClientState(ArrayCap.VertexArray); - - GL.GenBuffers(1, out VBOHandle); - - // Since there's only 1 VBO in the app, might aswell setup here. - GL.BindBuffer(BufferTarget.ArrayBuffer, VBOHandle); - GL.ColorPointer(4, ColorPointerType.UnsignedByte, VertexC4ubV3f.SizeInBytes, (IntPtr)0); - GL.VertexPointer(3, VertexPointerType.Float, VertexC4ubV3f.SizeInBytes, (IntPtr)(4 * sizeof(byte))); - - Random rnd = new Random(); - Vector3 temp = Vector3.Zero; - - // generate some random stuff for the particle system - for (uint i = 0; i < MaxParticleCount; i++) - { - VBO[i].R = (byte)rnd.Next(0, 256); - VBO[i].G = (byte)rnd.Next(0, 256); - VBO[i].B = (byte)rnd.Next(0, 256); - VBO[i].A = (byte)rnd.Next(0, 256); // isn't actually used - VBO[i].Position = Vector3.Zero; // all particles are born at the origin - - // generate direction vector in the range [-0.25f...+0.25f] - // that's slow enough so you can see particles 'disappear' when they are respawned - temp.X = (float)((rnd.NextDouble() - 0.5) * 0.5f); - temp.Y = (float)((rnd.NextDouble() - 0.5) * 0.5f); - temp.Z = (float)((rnd.NextDouble() - 0.5) * 0.5f); - ParticleAttributes[i].Direction = temp; // copy - ParticleAttributes[i].Age = 0; - } - - VisibleParticleCount = 0; - - } - - protected override void OnUnload(EventArgs e) - { - GL.DeleteBuffers(1, ref VBOHandle); - } - - /// - /// Called when your window is resized. Set your viewport here. It is also - /// a good place to set up your projection matrix (which probably changes - /// along when the aspect ratio of your window). - /// - /// Contains information on the new Width and Size of the GameWindow. - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.MatrixMode(MatrixMode.Projection); - Matrix4 p = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Width / (float)Height, 0.1f, 50.0f); - GL.LoadMatrix(ref p); - - GL.MatrixMode(MatrixMode.Modelview); - Matrix4 mv = Matrix4.LookAt(Vector3.UnitZ, Vector3.Zero, Vector3.UnitY); - GL.LoadMatrix(ref mv); - } - - /// - /// Called when it is time to setup the next frame. Add you game logic here. - /// - /// Contains timing information for framerate independent logic. - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Escape]) - { - Exit(); - } - - // will update particles here. When using a Physics SDK, it's update rate is much higher than - // the framerate and it would be a waste of cycles copying to the VBO more often than drawing it. - if (VisibleParticleCount < MaxParticleCount) - VisibleParticleCount++; - - Vector3 temp; - - for (int i = MaxParticleCount - VisibleParticleCount; i < MaxParticleCount; i++) - { - if (ParticleAttributes[i].Age >= MaxParticleCount) - { - // reset particle - ParticleAttributes[i].Age = 0; - VBO[i].Position = Vector3.Zero; - } - else - { - ParticleAttributes[i].Age += (uint)Math.Max(ParticleAttributes[i].Direction.LengthFast * 10, 1); - Vector3.Multiply(ref ParticleAttributes[i].Direction, (float)e.Time, out temp); - Vector3.Add(ref VBO[i].Position, ref temp, out VBO[i].Position); - } - } - } - - /// - /// Called when it is time to render the next frame. Add your rendering code here. - /// - /// Contains timing information. - protected override void OnRenderFrame(FrameEventArgs e) - { - this.Title = VisibleParticleCount + " Points. FPS: " + string.Format("{0:F}", 1.0 / e.Time); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.PushMatrix(); - - GL.Translate(0f, 0f, -5f); - - // Tell OpenGL to discard old VBO when done drawing it and reserve memory _now_ for a new buffer. - // without this, GL would wait until draw operations on old VBO are complete before writing to it - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(VertexC4ubV3f.SizeInBytes * MaxParticleCount), IntPtr.Zero, BufferUsageHint.StreamDraw); - // Fill newly allocated buffer - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(VertexC4ubV3f.SizeInBytes * MaxParticleCount), VBO, BufferUsageHint.StreamDraw); - // Only draw particles that are alive - GL.DrawArrays(PrimitiveType.Points, MaxParticleCount - VisibleParticleCount, VisibleParticleCount); - - GL.PopMatrix(); - - SwapBuffers(); - } - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // The 'using' idiom guarantees proper resource cleanup. - // We request 30 UpdateFrame events per second, and unlimited - // RenderFrame events (as fast as the computer can handle). - using (T09_VBO_Dynamic example = new T09_VBO_Dynamic()) - { - Utilities.SetWindowTitle(example); - example.Run(60.0, 0.0); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/1.x/VBODynamic.rtf b/Source/Examples/OpenGL/1.x/VBODynamic.rtf deleted file mode 100644 index c44774a2c397fd806df1447ac2fd984f1f2a0183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2690 zcmaJ@U2oe)5bSe)#X>K&3xT!dxM-uNruhVtCWxB`DEM+Bm*OGh9ea1Qq6Yr&o!z5k z#z_m2n!Uvnq{?R$r=Nw_0CamNhrc#pkl|E~RaUHy35&Y*#i_YeM97 zLB9rTy3OtFgU@B(xdM{ZQ`MaWKgTdL5g@wM}$Y zJX{rP{9RrAvbim9Ebl*BS3fMrYE=#<)MW*9opHO>#pPwWEt|OhnO?dSd_7jldRK0N zEUwpb`hmXu(b`DS^h3u~bMIYDsLGLAzo+D>_qA;flv+GC$&htq9PuX`lXW}#^YNP^ zC(G6J{cq4A_%2QlW+mSSj**_miomPtZ1qtySDlYc+c72Yq$tv-DXjuMG7*$LyJVD0 zel*KI=dvAbS4Wb3fL?i5@sRMj(a#IurfbPlEhhF$ik^_)07>A6g8)gbNz?$V6gC}_=Uh#>J9}xHC0P3(h2E^Hf7R#kTW60N7|HC zLF0gaGBtt!9@$lgCDK`hO4%(#IQ%!Xh*_j1E$V|az32sy_&TuZ7fT_p8P^5+Cv*S^ zeEuU_9n2m<3k26WQRRojV%F>T_h6m06U99iAvbiYwYOa-Xfv7m5oNg4Gj=q~DD9t4 zW72h;EflkEVh+)Sk@JbrYtwZbnwZYBsCFU<*047Rsd-9umuQ3fqRTu|>hD{R^}0h* z+gM>;0VB^&g&?f>u^H0GygM>Ok7u%ep~j5aNe2wWBNCPGL%1)PObrHHkM7v_oWfy) zIm0}ETfBJ*iPWQN2~F@lO_RPgSZNHOr+A2oMTy>r1D)MiL(g9o&pBm2*W>ny_z9%P z*RRcxzdqk!Y=^`DVStv>zQm!2E6NPRRK^Z-u4{9|i8Rt@0rw-|c&HUlC{@xp6ZwO# z(jfaRTc*4arTa`1_KZ+aFX`Y%ime|3B@SF2EixZDZFEM|`-o)}i^He^EBD(DW+3g; zUBO}|uyMNnN&I-L_zHRkb@-E-^O9_%RZU>nlyUHqo%8|wk5s21O>$=!qr(;Cc5?O% z$pi{O+F(mgswcFZRjuYz8F8;*{JPQe#lQ4~yk!x)Apm>v!>(@;o!T@1PU zcbLdopMLk~xAs{%gSK}dWU}MwgWm31U1Yhypm7~6s)|&8NVd2CK)*W^1(8Ix=jgsq zGz0*Ia|$w@>M^RyGYi4>M|&869|km3cSwq;;hu?qpZXdRB4XT8c7_`7o$1otCSHm$LXUix!+&ME7-83HNwacUKODuC0gz%m zv%b(-WTrRnonAT5q*d6))cP7QudUoW)2?TPVw|nP9fd2-#umxMQ-p*nDB|RC&es)S z!D)1Gv(sBFuBfAk8yjR-;KJexc_L)t&WfT~$}gF>DHMNk@aK{N$9yFQV94=NOtsWe zH(A>+PgH#bh(HB>uwXN$EY~y>`io+DWVYAER#u4GqRL0?OtPJ36#qF=(u0}#k@x27 n#ENvESN^DuIKPgkxZn}5rya%=%@%Yly@Xu0=ez;855D^sUmU?@ diff --git a/Source/Examples/OpenGL/1.x/VBOStatic.cs b/Source/Examples/OpenGL/1.x/VBOStatic.cs deleted file mode 100644 index 0ae2ea0b..00000000 --- a/Source/Examples/OpenGL/1.x/VBOStatic.cs +++ /dev/null @@ -1,178 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region --- Using directives --- - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.Threading; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Platform; -using System.Drawing; - -#endregion - -namespace Examples.Tutorial -{ - [Example("VBO Static", ExampleCategory.OpenGL, "1.x", 3, Documentation = "VBOStatic")] - public class T08_VBO : GameWindow - { - const float rotation_speed = 180.0f; - float angle; - - struct Vbo { public int VboID, EboID, NumElements; } - Vbo[] vbo = new Vbo[2]; - - VertexPositionColor[] CubeVertices = new VertexPositionColor[] - { - new VertexPositionColor(-1.0f, -1.0f, 1.0f, Color.DarkRed), - new VertexPositionColor( 1.0f, -1.0f, 1.0f, Color.DarkRed), - new VertexPositionColor( 1.0f, 1.0f, 1.0f, Color.Gold), - new VertexPositionColor(-1.0f, 1.0f, 1.0f, Color.Gold), - new VertexPositionColor(-1.0f, -1.0f, -1.0f, Color.DarkRed), - new VertexPositionColor( 1.0f, -1.0f, -1.0f, Color.DarkRed), - new VertexPositionColor( 1.0f, 1.0f, -1.0f, Color.Gold), - new VertexPositionColor(-1.0f, 1.0f, -1.0f, Color.Gold) - }; - - readonly short[] CubeElements = new short[] - { - 0, 1, 2, 2, 3, 0, // front face - 3, 2, 6, 6, 7, 3, // top face - 7, 6, 5, 5, 4, 7, // back face - 4, 0, 3, 3, 7, 4, // left face - 0, 1, 5, 5, 4, 0, // bottom face - 1, 5, 6, 6, 2, 1, // right face - }; - - public T08_VBO() : base(800, 600) { } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - Version version = new Version(GL.GetString(StringName.Version).Substring(0, 3)); - Version target = new Version(1, 5); - if (version < target) - { - throw new NotSupportedException(String.Format( - "OpenGL {0} is required (you only have {1}).", target, version)); - } - - GL.ClearColor(System.Drawing.Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - - vbo[0] = LoadVBO(CubeVertices, CubeElements); - vbo[1] = LoadVBO(CubeVertices, CubeElements); - } - - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(0, 0, Width, Height); - - float aspect_ratio = Width / (float)Height; - Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 64); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perpective); - } - - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - this.Exit(); - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - base.OnRenderFrame(e); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - Matrix4 lookat = Matrix4.LookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - angle += rotation_speed * (float)e.Time; - GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - - Draw(vbo[0]); - - SwapBuffers(); - } - - Vbo LoadVBO(TVertex[] vertices, short[] elements) where TVertex : struct - { - Vbo handle = new Vbo(); - int size; - - // To create a VBO: - // 1) Generate the buffer handles for the vertex and element buffers. - // 2) Bind the vertex buffer handle and upload your vertex data. Check that the buffer was uploaded correctly. - // 3) Bind the element buffer handle and upload your element data. Check that the buffer was uploaded correctly. - - GL.GenBuffers(1, out handle.VboID); - GL.BindBuffer(BufferTarget.ArrayBuffer, handle.VboID); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * BlittableValueType.StrideOf(vertices)), vertices, - BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); - if (vertices.Length * BlittableValueType.StrideOf(vertices) != size) - throw new ApplicationException("Vertex data not uploaded correctly"); - - GL.GenBuffers(1, out handle.EboID); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, handle.EboID); - GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(elements.Length * sizeof(short)), elements, - BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size); - if (elements.Length * sizeof(short) != size) - throw new ApplicationException("Element data not uploaded correctly"); - - handle.NumElements = elements.Length; - return handle; - } - - void Draw(Vbo handle) - { - // To draw a VBO: - // 1) Ensure that the VertexArray client state is enabled. - // 2) Bind the vertex and element buffer handles. - // 3) Set up the data pointers (vertex, normal, color) according to your vertex format. - // 4) Call DrawElements. (Note: the last parameter is an offset into the element buffer - // and will usually be IntPtr.Zero). - - GL.EnableClientState(ArrayCap.ColorArray); - GL.EnableClientState(ArrayCap.VertexArray); - - GL.BindBuffer(BufferTarget.ArrayBuffer, handle.VboID); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, handle.EboID); - - GL.VertexPointer(3, VertexPointerType.Float, BlittableValueType.StrideOf(CubeVertices), new IntPtr(0)); - GL.ColorPointer(4, ColorPointerType.UnsignedByte, BlittableValueType.StrideOf(CubeVertices), new IntPtr(12)); - - GL.DrawElements(PrimitiveType.Triangles, handle.NumElements, DrawElementsType.UnsignedShort, IntPtr.Zero); - } - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (T08_VBO example = new T08_VBO()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - } -} diff --git a/Source/Examples/OpenGL/1.x/VBOStatic.rtf b/Source/Examples/OpenGL/1.x/VBOStatic.rtf deleted file mode 100644 index 12f3488cae78de14519ed8aed4247401a2c002b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3272 zcmaJ@O>^5e5bZg?Vn-*bRXF;vGi`iIoYd19H_lAl^icKylAwf!0$2dFq9*?DeY+qf z+NnF^u_Y7SkN4ib#h2X2dYLO5jQlFw&2n|V&MRHli!XWYY>Y*N4~x9ErpfDat9;OL zL9e_~&BguwvoCq+8s~A0E^@D{<%@N`@mkx}GB27=ua*~l==*%5t@bK9Prrsb>dHhq z&(4O1Hj z8N-B}pOdi^w&-h4A79^u?394NQtREFsWd4|fXb9c+lVg}-Dw|GG)TVFaqB9IjslwI zqZN5=D|8=990*<8qH{b~O(U4?QApQvFMYXZ z*`kLeks^66As6qOkdls>dGB=y^fr`$mdeJIpAr>~3z~{9MrS#={%qn1=_BDx<_-v> zQBW>akE4$%PY4H66pUyfw8mOvH&k|o&ggdU2mvBapi^i7XaJNDX^THErL1eGDzH4A z^&HM=zcuBSl>;$BcpM%F=7Jb&>Wx?XZ;qcz!P!w;KLZ1;5D));UMMEhiSm#~Q#`b$ z1nvijlr)+lkakSLFaj8h$w4C^5jl4hVGnlGpaiY}5FKlPJX>#eCYn3V zY7fi}kI{ny_J)-=f+BQHWVvq5hJ&@*a~_3J9wB?{P84|A~$x}Y{XJ4Zr-^xUA}l;m^d30GAjE9 zBcEoQ#e1}5T^;f7mn=pYbk}Tu!zzfnJ-O&xtBQt=0XRG@h`qsz#muDBmklra4_HKc zD)V)z+U$>Xi}-rUTKW1;^zk*zvOnbngd+P1#ab8PMeyaIu>0W#7W}iYndDK6@Mbn1 zsVqUx*i8qso;~u)G>x#AzSNUxjbg4ddLuR@QE{ - /// Demonstrates Vertex Arrays (in system memory). Example is incomplete (documentation). - /// Broken since release 0.3.12. - /// - [Example("Vertex Arrays", ExampleCategory.OpenGL, "1.x", 5, false)] - class T02_Vertex_Arrays : GameWindow - { - float rotation_speed = 3.0f; - float angle = 0.0f; - - Shapes.Shape shape = new Examples.Shapes.Plane(16, 16, 2.0f, 2.0f); - //TextureFont sans = new TextureFont(new Font(FontFamily.GenericSansSerif, 32, FontStyle.Regular, - // GraphicsUnit.Pixel)); - - #region Constructor - - public T02_Vertex_Arrays() - : base(800, 600) - { - //this.VSync = VSyncMode.On; - KeyUp += Keyboard_KeyUp; - } - - void Keyboard_KeyUp(object sender, KeyboardKeyEventArgs e) - { - // F4 cycles between available VSync modes. - if (e.Key == Key.F4) - { - if (this.VSync == VSyncMode.Off) - this.VSync = VSyncMode.On; - else if (this.VSync == VSyncMode.On) - this.VSync = VSyncMode.Adaptive; - else - this.VSync = VSyncMode.Off; - } - } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - GL.Enable(EnableCap.Texture2D); - - GL.ClearColor(Color.CadetBlue); - GL.Enable(EnableCap.DepthTest); - - GL.EnableClientState(ArrayCap.VertexArray); - //GL.EnableClientState(GL.Enums.EnableCap.COLOR_ARRAY); - GL.VertexPointer(3, VertexPointerType.Float, 0, shape.Vertices); - //GL.ColorPointer(4, GL.Enums.ColorPointerType.UNSIGNED_BYTE, 0, shape.Colors); - } - - #endregion - - #region OnResize - - /// - /// Called when the user resizes the window. - /// - /// Contains the new width/height of the window. - /// - /// You want the OpenGL viewport to match the window. This is the place to do it! - /// - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(0, 0, Width, Height); - - double aspect_ratio = Width / (double)Height; - - OpenTK.Matrix4 perspective = OpenTK.Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)aspect_ratio, 1, 64); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perspective); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Prepares the next frame for rendering. - /// - /// - /// Place your control logic here. This is the place to respond to user input, - /// update object positions etc. - /// - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - - if (keyboard[Key.Escape]) - { - this.Exit(); - return; - } - - if (keyboard[Key.F11]) - if (WindowState != WindowState.Fullscreen) - WindowState = WindowState.Fullscreen; - else - WindowState = WindowState.Normal; - - // Plus/Minus change the target render frequency. - // PageUp/PageDown change the target update frequency. - if (keyboard[Key.Plus] || keyboard[Key.KeypadAdd]) TargetRenderFrequency++; - if (keyboard[Key.Minus] || keyboard[Key.KeypadSubtract]) TargetRenderFrequency--; - if (keyboard[Key.PageUp]) TargetUpdateFrequency++; - if (keyboard[Key.PageDown]) TargetUpdateFrequency--; - - // Right/Left control the rotation speed and direction. - if (keyboard[Key.Right]) rotation_speed += 0.5f; - if (keyboard[Key.Left]) rotation_speed -= 0.5f; - } - - #endregion - - #region OnRenderFrame - - /// - /// Place your rendering code here. - /// - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - Matrix4 lookat = Matrix4.LookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - angle += rotation_speed * (float)e.Time; - - if (angle >= 360.0f) - angle -= 360.0f; - GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - - GL.DrawElements(PrimitiveType.Triangles, shape.Indices.Length, - DrawElementsType.UnsignedInt, shape.Indices); - - //GL.Begin(GL.Enums.BeginMode.TRIANGLES); - - //GL.Vertex3(-1.0, -1.0, 5.0); - //GL.Vertex3(1.0, -1.0, 5.0); - //GL.Vertex3(1.0, 1.0, 5.0); - - //GL.End(); - - GL.PushMatrix(); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 1.0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - - //GL.Translate(0.7f, 1.0f, 0.0f); - //sans.Print(String.format("{0:f1}", RenderFrequency)); - - GL.PopMatrix(); - - SwapBuffers(); - } - - #endregion - - #region public void Launch() - - /// - /// Launches this example. - /// - /// - /// Provides a simple way for the example launcher to launch the examples. - /// - public void Launch() - { - // Lock UpdateFrame rate at 30Hz and RenderFrame rate 85Hz. - //Run(60.0, 85.0); - Run(30.0, 85.0); - } - - #endregion - - public static readonly int order = 2; - } -} diff --git a/Source/Examples/OpenGL/1.x/VertexLighting.cs b/Source/Examples/OpenGL/1.x/VertexLighting.cs deleted file mode 100644 index 2b31bc94..00000000 --- a/Source/Examples/OpenGL/1.x/VertexLighting.cs +++ /dev/null @@ -1,181 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; - -using OpenTK; -using OpenTK.Graphics.OpenGL; -using Examples.Shapes; - -namespace Examples.Tutorial -{ - /// - /// Demonstrates fixed-function OpenGL lighting. Example is incomplete (documentation). - /// - [Example("Vertex Lighting", ExampleCategory.OpenGL, "1.x", false)] - public class T04_Vertex_Lighting : GameWindow - { - float x_angle, zoom; - Shape shape = new Plane(16, 16, 4.0f, 4.0f); - - #region Constructor - - public T04_Vertex_Lighting() : base(800, 600) - { - } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - //GL.Enable(GL.Enums.EnableCap.CULL_FACE); - - GL.EnableClientState(ArrayCap.VertexArray); - GL.EnableClientState(ArrayCap.NormalArray); - GL.VertexPointer(3, VertexPointerType.Float, 0, shape.Vertices); - GL.NormalPointer(NormalPointerType.Float, 0, shape.Normals); - - // Enable Light 0 and set its parameters. - GL.Light(LightName.Light0, LightParameter.Position, new float[] { 1.0f, 1.0f, -0.5f }); - GL.Light(LightName.Light0, LightParameter.Ambient, new float[] { 0.3f, 0.3f, 0.3f, 1.0f }); - GL.Light(LightName.Light0, LightParameter.Diffuse, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); - GL.Light(LightName.Light0, LightParameter.Specular, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); - GL.Light(LightName.Light0, LightParameter.SpotExponent, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); - GL.LightModel(LightModelParameter.LightModelAmbient, new float[] { 0.2f, 0.2f, 0.2f, 1.0f }); - GL.LightModel(LightModelParameter.LightModelTwoSide, 1); - GL.LightModel(LightModelParameter.LightModelLocalViewer, 1); - GL.Enable(EnableCap.Lighting); - GL.Enable(EnableCap.Light0); - - // Use GL.Material to set your object's material parameters. - GL.Material(MaterialFace.Front, MaterialParameter.Ambient, new float[] { 0.3f, 0.3f, 0.3f, 1.0f }); - GL.Material(MaterialFace.Front, MaterialParameter.Diffuse, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); - GL.Material(MaterialFace.Front, MaterialParameter.Specular, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); - GL.Material(MaterialFace.Front, MaterialParameter.Emission, new float[] { 0.0f, 0.0f, 0.0f, 1.0f }); - } - - #endregion - - #region OnResize - - /// - /// Called when the user resizes the window. - /// - /// Contains the new width/height of the window. - /// - /// You want the OpenGL viewport to match the window. This is the place to do it! - /// - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - - GL.Viewport(0, 0, Width, Height); - - float aspect_ratio = Width / (float)Height; - Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 64); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perpective); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Prepares the next frame for rendering. - /// - /// - /// Place your control logic here. This is the place to respond to user input, - /// update object positions etc. - /// - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - var mouse = OpenTK.Input.Mouse.GetState(); - - if (keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - return; - } - - if (keyboard[OpenTK.Input.Key.F11]) - if (WindowState != WindowState.Fullscreen) - WindowState = WindowState.Fullscreen; - else - WindowState = WindowState.Normal; - - if (mouse[OpenTK.Input.MouseButton.Left]) - x_angle = mouse.X; - else - x_angle += 0.5f; - - zoom = mouse.Wheel * 0.5f; // Mouse.Wheel is broken on both Linux and Windows. - - // Do not leave x_angle drift too far away, as this will cause inaccuracies. - if (x_angle > 360.0f) - x_angle -= 360.0f; - else if (x_angle < -360.0f) - x_angle += 360.0f; - } - - #endregion - - #region OnRenderFrame - - /// - /// Place your rendering code here. - /// - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - Matrix4 lookat = Matrix4.LookAt(0, 0, -7.5f + zoom, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - GL.Rotate(x_angle, 0.0f, 1.0f, 0.0f); - - GL.Begin(PrimitiveType.Triangles); - foreach (int index in shape.Indices) - { - GL.Normal3(shape.Normals[index]); - GL.Vertex3(shape.Vertices[index]); - } - GL.End(); - - SwapBuffers(); - } - - #endregion - - #region public void Launch() - - /// - /// Launches this example. - /// - /// - /// Provides a simple way for the example launcher to launch the examples. - /// - public static void Main() - { - using (T04_Vertex_Lighting example = new T04_Vertex_Lighting()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGL/2.x/DDSCubeMap.cs b/Source/Examples/OpenGL/2.x/DDSCubeMap.cs deleted file mode 100644 index d8334bc9..00000000 --- a/Source/Examples/OpenGL/2.x/DDSCubeMap.cs +++ /dev/null @@ -1,273 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Drawing; -using System.Collections.Generic; -using System.Diagnostics; -using System.Windows.Forms; -using System.IO; -using System.Text; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -using Examples.Shapes; -using Examples.TextureLoaders; - -namespace Examples.Tutorial -{ - [Example("DDS Cube Map", ExampleCategory.OpenGL, "2.x", Documentation = "DDSCubeMap")] - public class T13_GLSL_Earth: GameWindow - { - public T13_GLSL_Earth( ) - : base( 800, 800 ) - { - } - - #region internal Fields - - // Shader - int VertexShaderObject, FragmentShaderObject, ProgramObject; - const string VertexShaderFilename = "Data/Shaders/CubeMap_VS.glsl"; - const string FragmentShaderFilename = "Data/Shaders/CubeMap_FS.glsl"; - - // Textures - const TextureUnit TMU0_Unit = TextureUnit.Texture0; - const int TMU0_UnitInteger = 0; - const string TMU0_Filename = "Data/Textures/earth-cubemap.dds"; - uint TMU0_Handle; - TextureTarget TMU0_Target; - - // DL - DrawableShape sphere; - - // Camera - Vector3 EyePos = new Vector3( 0.0f, 0.0f, 6.0f ); - Vector3 Trackball = Vector3.Zero; - - #endregion internal Fields - - /// Setup OpenGL and load resources here. - /// Not used. - protected override void OnLoad(EventArgs e) - { - this.VSync = VSyncMode.Off; - - // Check for necessary capabilities: - string extensions = GL.GetString(StringName.Extensions); - if (!GL.GetString(StringName.Extensions).Contains("GL_ARB_shading_language")) - { - throw new NotSupportedException(String.Format("This example requires OpenGL 2.0. Found {0}. Aborting.", - GL.GetString(StringName.Version).Substring(0, 3))); - } - - if (!extensions.Contains("GL_ARB_texture_compression") || - !extensions.Contains("GL_EXT_texture_compression_s3tc")) - { - throw new NotSupportedException("This example requires support for texture compression. Aborting."); - } - - #region GL State - - GL.ClearColor( 0f, 0f, 0f, 0f ); - - GL.Disable( EnableCap.Dither ); - - GL.Enable( EnableCap.CullFace ); - GL.FrontFace( FrontFaceDirection.Ccw ); - GL.PolygonMode( MaterialFace.Front, PolygonMode.Fill ); - // GL.PolygonMode( MaterialFace.Back, PolygonMode.Line ); - - #endregion GL State - - #region Shaders - - string LogInfo; - - // Load&Compile Vertex Shader - - using ( StreamReader sr = new StreamReader( VertexShaderFilename ) ) - { - VertexShaderObject = GL.CreateShader( ShaderType.VertexShader ); - GL.ShaderSource( VertexShaderObject, sr.ReadToEnd( ) ); - GL.CompileShader( VertexShaderObject ); - } - - GL.GetShaderInfoLog( VertexShaderObject, out LogInfo ); - if ( LogInfo.Length > 0 && !LogInfo.Contains( "hardware" ) ) - Trace.WriteLine( "Vertex Shader failed!\nLog:\n" + LogInfo ); - else - Trace.WriteLine( "Vertex Shader compiled without complaint." ); - - // Load&Compile Fragment Shader - - using ( StreamReader sr = new StreamReader( FragmentShaderFilename ) ) - { - FragmentShaderObject = GL.CreateShader( ShaderType.FragmentShader ); - GL.ShaderSource( FragmentShaderObject, sr.ReadToEnd( ) ); - GL.CompileShader( FragmentShaderObject ); - } - GL.GetShaderInfoLog( FragmentShaderObject, out LogInfo ); - - if ( LogInfo.Length > 0 && !LogInfo.Contains( "hardware" ) ) - Trace.WriteLine( "Fragment Shader failed!\nLog:\n" + LogInfo ); - else - Trace.WriteLine( "Fragment Shader compiled without complaint." ); - - // Link the Shaders to a usable Program - ProgramObject = GL.CreateProgram( ); - GL.AttachShader( ProgramObject, VertexShaderObject ); - GL.AttachShader( ProgramObject, FragmentShaderObject ); - - // link it all together - GL.LinkProgram( ProgramObject ); - - // flag ShaderObjects for delete when not used anymore - GL.DeleteShader( VertexShaderObject ); - GL.DeleteShader( FragmentShaderObject ); - - int[] temp = new int[1]; - GL.GetProgram(ProgramObject, GetProgramParameterName.LinkStatus, out temp[0]); - Trace.WriteLine( "Linking Program (" + ProgramObject + ") " + ( ( temp[0] == 1 ) ? "succeeded." : "FAILED!" ) ); - if ( temp[0] != 1 ) - { - GL.GetProgramInfoLog( ProgramObject, out LogInfo ); - Trace.WriteLine( "Program Log:\n" + LogInfo ); - } - - GL.GetProgram(ProgramObject, GetProgramParameterName.ActiveAttributes, out temp[0]); - Trace.WriteLine( "Program registered " + temp[0] + " Attributes. (Should be 4: Pos, UV, Normal, Tangent)" ); - - Trace.WriteLine( "Tangent attribute bind location: " + GL.GetAttribLocation( ProgramObject, "AttributeTangent" ) ); - - Trace.WriteLine( "End of Shader build. GL Error: " + GL.GetError( ) ); - - #endregion Shaders - - #region Textures - - TextureLoaderParameters.FlipImages = false; - TextureLoaderParameters.MagnificationFilter = TextureMagFilter.Linear; - TextureLoaderParameters.MinificationFilter = TextureMinFilter.Linear; - TextureLoaderParameters.WrapModeS = TextureWrapMode.ClampToEdge; - TextureLoaderParameters.WrapModeT = TextureWrapMode.ClampToEdge; - TextureLoaderParameters.EnvMode = TextureEnvMode.Modulate; - - ImageDDS.LoadFromDisk( TMU0_Filename, out TMU0_Handle, out TMU0_Target ); - Trace.WriteLine( "Loaded " + TMU0_Filename + " with handle " + TMU0_Handle + " as " + TMU0_Target ); - - #endregion Textures - - Trace.WriteLine( "End of Texture Loading. GL Error: " + GL.GetError( ) ); - Trace.WriteLine( ""); - - sphere = new SlicedSphere(1.5f, Vector3d.Zero, SlicedSphere.eSubdivisions.Four, new SlicedSphere.eDir[] { SlicedSphere.eDir.All }, true); - - } - - protected override void OnUnload(EventArgs e) - { - sphere.Dispose(); - - GL.DeleteProgram( ProgramObject ); - GL.DeleteTextures( 1, ref TMU0_Handle ); - - base.OnUnload( e ); - } - - /// Respond to resize events here. - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize( EventArgs e ) - { - GL.Viewport( 0, 0, Width, Height ); - - GL.MatrixMode( MatrixMode.Projection ); - Matrix4 p = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Width / (float)Height, 0.1f, 10.0f); - GL.LoadMatrix(ref p); - - GL.MatrixMode( MatrixMode.Modelview ); - GL.LoadIdentity( ); - - base.OnResize( e ); - } - - /// Add your game logic here. - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - var mouse = OpenTK.Input.Mouse.GetState(); - - if (keyboard[OpenTK.Input.Key.Escape]) - this.Exit(); - if (keyboard[OpenTK.Input.Key.Space]) - Trace.WriteLine("GL: " + GL.GetError()); - - Trackball.X = mouse.X; - Trackball.Y = mouse.Y; - Trackball.Z = mouse.Scroll.Y * 0.5f; - } - - /// Add your game rendering code here. - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - this.Title = "FPS: " + (1 / e.Time).ToString("0."); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.UseProgram(ProgramObject); - - #region Textures - - GL.ActiveTexture(TMU0_Unit); - GL.BindTexture(TMU0_Target, TMU0_Handle); - - #endregion Textures - - #region Uniforms - - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "Earth"), TMU0_UnitInteger); - - #endregion Uniforms - - GL.PushMatrix(); - Matrix4 temp = Matrix4.LookAt(EyePos, Vector3.Zero, Vector3.UnitY); - GL.MultMatrix(ref temp); - - GL.Rotate(Trackball.X, Vector3.UnitY); - GL.Rotate(Trackball.Y, Vector3.UnitX); - - #region Draw - - GL.Color3(1f, 1f, 1f); - - sphere.Draw(); - - #endregion Draw - - GL.PopMatrix(); - - this.SwapBuffers(); - } - - /// Entry point - [STAThread] - public static void Main( ) - { - using ( T13_GLSL_Earth example = new T13_GLSL_Earth( ) ) - { - Utilities.SetWindowTitle(example); - example.Run( 30.0, 0.0 ); - } - } - } -} diff --git a/Source/Examples/OpenGL/2.x/GeometryShader.cs b/Source/Examples/OpenGL/2.x/GeometryShader.cs deleted file mode 100644 index 74b625d6..00000000 --- a/Source/Examples/OpenGL/2.x/GeometryShader.cs +++ /dev/null @@ -1,246 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.Drawing; - -using OpenTK; -using OpenTK.Input; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Tutorial -{ - [Example("Basic Geometry Shader", ExampleCategory.OpenGL, "2.x", Documentation = "Simple usage of EXT_geometry_shader4")] - public class SimpleGeometryShader : GameWindow - { - public SimpleGeometryShader() - : base(800, 600) - { - } - - int shaderProgram = 0; - - protected override void OnLoad(EventArgs e) - { - if (!GL.GetString(StringName.Extensions).Contains("EXT_geometry_shader4")) - { - System.Windows.Forms.MessageBox.Show( - "Your video card does not support EXT_geometry_shader4. Please update your drivers.", - "EXT_geometry_shader4 not supported", - System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); - Exit(); - throw new NotSupportedException(); - } - - // create a shader object. - shaderProgram = GL.CreateProgram(); - // create shader objects for all three types. - int vert = GL.CreateShader(ShaderType.VertexShader); - int frag = GL.CreateShader(ShaderType.FragmentShader); - int geom = GL.CreateShader(ShaderType.GeometryShaderExt); - - // GLSL for fragment shader. - String fragSource = @" - void main( void ) - { - gl_FragColor = vec4(0, 1, 0, 0); - } - "; - - // GLSL for vertex shader. - String vertSource = @" - void main( void ) - { - gl_Position = ftransform(); - } - "; - - // GLSL for geometry shader. - // Note this is a version 1.20 shader - // Also note GL_EXT_geometry_shader4 must be enabled explicitly, correct - // OpenGL implementations should only have the new tokens, like - // EmitVertex and EndPrimitive, when this extension is enabled. - String geomSource = @" - #version 120 - #extension GL_EXT_geometry_shader4 : enable - - void main(void) - { - // variable to use in for loops - int i; - - // Emit the original vertices without changing, making - // this part exactly the same as if no geometry shader - // was used. - for(i=0; i< gl_VerticesIn; i++) - { - gl_Position = gl_PositionIn[i]; - EmitVertex(); - } - // End the one primitive with the original vertices - EndPrimitive(); - - // Now we generate some more! This translates 0.2 over - // the positive x axis. - for(i=0; i< gl_VerticesIn; i++) - { - gl_Position = gl_PositionIn[i]; - gl_Position.x += 0.2; - EmitVertex(); - } - EndPrimitive(); - } - "; - - // compile shaders. - compileShader(frag, fragSource); - compileShader(vert, vertSource); - compileShader(geom, geomSource); - - // attach shaders and link the program. - GL.AttachShader(shaderProgram, frag); - GL.AttachShader(shaderProgram, vert); - GL.AttachShader(shaderProgram, geom); - - // Set the input type of the primitives we are going to feed the geometry shader, this should be the same as - // the primitive type given to GL.Begin. If the types do not match a GL error will occur (todo: verify GL_INVALID_ENUM, on glBegin) - GL.Ext.ProgramParameter(shaderProgram, AssemblyProgramParameterArb.GeometryInputType, (int)BeginMode.Lines); - // Set the output type of the geometry shader. Becasue we input Lines we will output LineStrip(s). - GL.Ext.ProgramParameter(shaderProgram, AssemblyProgramParameterArb.GeometryOutputType, (int)BeginMode.LineStrip); - - // We must tell the shader program how much vertices the geometry shader will output (at most). - // One simple way is to query the maximum and use that. - // NOTE: Make sure that the number of vertices * sum(components of active varyings) does not - // exceed MaxGeometryTotalOutputComponents. - GL.Ext.ProgramParameter(shaderProgram, AssemblyProgramParameterArb.GeometryVerticesOut, 50); - - // NOTE: calls to ProgramParameter do not take effect until you call LinkProgram. - GL.LinkProgram(shaderProgram); - - // output link info log. - string info; - GL.GetProgramInfoLog(shaderProgram, out info); - Debug.WriteLine(info); - - // Set clearcolor and bind the shader program. - GL.ClearColor(0.1f, 0.1f, 0.1f, 0.1f); - GL.UseProgram(shaderProgram); - // Set color to red. If the shader fails the fixed pipeline will be used and - // the lines will be red, if all is ok the fragment shader is used and they will be green. - GL.Color3(1.0f, 0, 0); - - // Clean up resources. Note the program object is not deleted. - if (frag != 0) - GL.DeleteShader(frag); - if (vert != 0) - GL.DeleteShader(vert); - if (geom != 0) - GL.DeleteShader(geom); - } - - /// - /// Helper method to avoid code duplication. - /// Compiles a shader and prints results using Debug.WriteLine. - /// - /// A shader object, gotten from GL.CreateShader. - /// The GLSL source to compile. - void compileShader(int shader, string source) - { - GL.ShaderSource(shader, source); - GL.CompileShader(shader); - - string info; - GL.GetShaderInfoLog(shader, out info); - Debug.WriteLine(info); - - int compileResult; - GL.GetShader(shader, ShaderParameter.CompileStatus, out compileResult); - if (compileResult != 1) - { - Debug.WriteLine("Compile Error!"); - Debug.WriteLine(source); - } - } - - protected override void OnUnload(EventArgs e) - { - if (shaderProgram != 0) - GL.DeleteProgram(shaderProgram); - base.OnUnload(e); - } - - /// - /// Sets the viewport and projection matrix for orthographic projection. - /// - /// resize event args - protected override void OnResize(EventArgs e) - { - GL.Viewport(ClientRectangle); - - // Set projection matrix - GL.MatrixMode(MatrixMode.Projection); - OpenTK.Matrix4 ortho = OpenTK.Matrix4.CreateOrthographicOffCenter(-1, 1, -1, 1, 1, -1); - GL.LoadMatrix(ref ortho); - - // Set selector state back to matrix mode - GL.MatrixMode(MatrixMode.Modelview); - - base.OnResize(e); - } - - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Space]) - { - ErrorCode err = GL.GetError(); - //Console.WriteLine(err + " " + Glu.ErrorString((GluErrorCode)err)); - Console.WriteLine("GL error code: {0}", err); - } - - if (keyboard[Key.Escape]) - this.Exit(); - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - // draw two vertical lines - GL.Begin(PrimitiveType.Lines); - { - // line one - GL.Vertex2(-0.5f, -0.5f); - GL.Vertex2(-0.5f, 0.5f); - // line two - GL.Vertex2(0.5f, 0.5f); - GL.Vertex2(0.5f, -0.5f); - } - GL.End(); - - this.SwapBuffers(); - } - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (SimpleGeometryShader example = new SimpleGeometryShader()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/2.x/GeometryShaderAdvanced.cs b/Source/Examples/OpenGL/2.x/GeometryShaderAdvanced.cs deleted file mode 100644 index 69d1f17f..00000000 --- a/Source/Examples/OpenGL/2.x/GeometryShaderAdvanced.cs +++ /dev/null @@ -1,1061 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.Drawing; - -using OpenTK; -using OpenTK.Input; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -/* - * The idea is to make a simple scene: A box with a checker texture with a sphere inside it. The - * camera will be inside the box looking at the sphere. - * - * Rendering will be done in two passes. The first pass will render the box from within the - * sphere, looking in along all three axes in the positive and negative directions. These six - * different camara orientations will be rendered to individual faces of a cubemap, in one - * single pass using the gl_Layer token in the geometry shader. This cubemap will be used the - * the second pass. - * - * The second pass will render both the box and the sphere. The box will have the checker - * texture, and the sphere will use the cubemap from the first pass. - * - * Keys: - * F1 - switch to cubemap cross texture view - * F2 - switch to the normal scene render - * - * F5 - Polygon mode points - * F6 - Polygon mode lines - * F7 - Polygon mode fill - * - * References: - * http://www.opengl.org/wiki/GL_EXT_framebuffer_object#Quick_example.2C_render_to_texture_.28Cubemap.29 - * http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt - * http://www.opengl.org/registry/specs/EXT/geometry_shader4.txt - */ - -namespace Examples.Tutorial -{ - [Example("Advanced Geometry Shader", ExampleCategory.OpenGL, "2.x", Documentation = "Advanced usage of EXT_geometry_shader4")] - public class SimpleGeometryShader2 : GameWindow - { - public SimpleGeometryShader2() - : base(800, 600) - { - KeyDown += Keyboard_KeyDown; - } - - enum ViewMode - { - CubemapCross, - Scene, - } - - struct VertexPositionNormalTexture - { - public Vector3 Position, Normal; - public Vector2 Texture; - - public VertexPositionNormalTexture(Vector3 position, Vector3 normal, Vector2 texture) - { - Position = position; - Normal = normal; - Texture = texture; - } - } - - #region Fields - - int shaderProgramBox; - int shaderProgramSphere; - int shaderProgramCubemap; - - int textureCubeColor; - int textureCubeDepth; - int textureCubeFBO; - - int vboCube; - int vboCubeStride; - int vboSphere; - int vboSphereStride = BlittableValueType.Stride; - int eboSphere; - - ViewMode mode = ViewMode.Scene; - Vector3 eyePos = new Vector3(0, -8, 0); - Vector3 eyeLookat = new Vector3(0, -9, -0); - Vector3 spherePos = new Vector3(0, -9, 0); - DateTime startTime = DateTime.Now; - - #endregion - - #region keyboard handler - - void Keyboard_KeyDown(object sender, KeyboardKeyEventArgs e) - { - switch (e.Key) - { - case Key.F1: - switchToMode(ViewMode.CubemapCross); - break; - case Key.F2: - switchToMode(ViewMode.Scene); - break; - case Key.F5: - GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Point); - break; - case Key.F6: - GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); - break; - case Key.F7: - GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); - break; - case Key.Escape: - this.Exit(); - break; - default: - break; - } - } - - #endregion - - #region init methods - - void initShaderProgramBox() - { - // create a program object. - shaderProgramBox = GL.CreateProgram(); - // create shader objects. - int vert = GL.CreateShader(ShaderType.VertexShader); - int frag = GL.CreateShader(ShaderType.FragmentShader); - - // GLSL for fragment shader. - // diagonal checker - String fragSource = @" - varying vec3 normal; - void main( void ) - { - float s = gl_TexCoord[0].s * 6.28 * 8.0; - float t = gl_TexCoord[0].t * 6.28 * 8.0; - gl_FragColor = gl_TexCoord[1] * vec4(sign(cos(s)+cos(t))); - //gl_FragColor = vec4(normal*vec3(0.5)+vec3(0.5), 1); - } - "; - - // GLSL for vertex shader. - String vertSource = @" - varying vec3 normal; - void main( void ) - { - gl_Position = ftransform(); - normal = gl_Normal; - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_TexCoord[1] = normalize(gl_Vertex)*0.5+0.5; - } - "; - - // compile shaders. - compileShader(frag, fragSource); - compileShader(vert, vertSource); - - // attach shaders and link the program. - GL.AttachShader(shaderProgramBox, frag); - GL.AttachShader(shaderProgramBox, vert); - GL.LinkProgram(shaderProgramBox); - - // output link info log. - string info; - GL.GetProgramInfoLog(shaderProgramBox, out info); - Debug.WriteLine(info); - - // Clean up resources. Note the program object is not deleted. - if (frag != 0) - GL.DeleteShader(frag); - if (vert != 0) - GL.DeleteShader(vert); - } - - void initShaderProgramSphere() - { - // create a program object. - shaderProgramSphere = GL.CreateProgram(); - // create shader objects. - int vert = GL.CreateShader(ShaderType.VertexShader); - int frag = GL.CreateShader(ShaderType.FragmentShader); - - // GLSL for fragment shader. - String fragSource = @" - varying vec3 normal; - varying vec3 eyevec; - uniform samplerCube tex; - - void main( void ) - { - gl_FragColor = textureCube(tex, reflect(normalize(-eyevec), normalize(normal))); - } - "; - - // GLSL for vertex shader. - String vertSource = @" - varying vec3 normal; - varying vec3 eyevec; - - void main( void ) - { - gl_Position = ftransform(); - eyevec = -gl_Vertex.xyz; - normal = gl_Normal; - } - "; - - // compile shaders. - compileShader(frag, fragSource); - compileShader(vert, vertSource); - - // attach shaders and link the program. - GL.AttachShader(shaderProgramSphere, frag); - GL.AttachShader(shaderProgramSphere, vert); - GL.LinkProgram(shaderProgramSphere); - - // output link info log. - string info; - GL.GetProgramInfoLog(shaderProgramSphere, out info); - Debug.WriteLine(info); - - // Clean up resources. Note the program object is not deleted. - if (frag != 0) - GL.DeleteShader(frag); - if (vert != 0) - GL.DeleteShader(vert); - } - - void initShaderProgramCubemap() - { - // create a program object. - shaderProgramCubemap = GL.CreateProgram(); - // create shader objects. - int vert = GL.CreateShader(ShaderType.VertexShader); - int frag = GL.CreateShader(ShaderType.FragmentShader); - int geom = GL.CreateShader(ShaderType.GeometryShaderExt); - - // GLSL for fragment shader. - // Checkerboard :) - String fragSource = @" - #version 120 - #extension GL_EXT_gpu_shader4 : enable - - void main( void ) - { - float s = gl_TexCoord[0].s * 6.28 * 8.0; - float t = gl_TexCoord[0].t * 6.28 * 8.0; - gl_FragColor = gl_TexCoord[2] * vec4(sign(cos(s)+cos(t)))/* * gl_TexCoord[1]*/; -// gl_FragColor = gl_TexCoord[1]; - } - "; - - // GLSL for vertex shader. - String vertSource = @" - #version 120 - #extension GL_EXT_gpu_shader4 : enable - - //varying vec4 p[2]; - //varying vec4 nx; - - void main( void ) - { - gl_Position = gl_Vertex; - gl_TexCoord[2] = normalize(gl_Vertex)*0.5+0.5; - gl_TexCoord[0] = gl_MultiTexCoord0; - } - "; - - // GLSL for geometry shader. - String geomSource = @" - #version 120 - #extension GL_EXT_geometry_shader4 : enable - #extension GL_EXT_gpu_shader4 : enable - uniform mat4 matrixPX; - uniform mat4 matrixNX; - uniform mat4 matrixPY; - uniform mat4 matrixNY; - uniform mat4 matrixPZ; - uniform mat4 matrixNZ; - - void main(void) { - int i, layer; - gl_Layer = 0; - gl_TexCoord[1] = vec4(1, 0, 0, 1); - for (i = 0; i < gl_VerticesIn; i++) { - gl_Position = matrixPX * gl_PositionIn[i]; - gl_TexCoord[0] = gl_TexCoordIn[i][0]; - gl_TexCoord[2] = gl_TexCoordIn[i][2]; - EmitVertex(); - } - EndPrimitive(); - gl_Layer = 1; - gl_TexCoord[1] = vec4(0, 0, 1, 1); - for (i = 0; i < gl_VerticesIn; i++) { - gl_Position = matrixNX * gl_PositionIn[i]; - gl_TexCoord[0] = gl_TexCoordIn[i][0]; - gl_TexCoord[2] = gl_TexCoordIn[i][2]; - EmitVertex(); - } - EndPrimitive(); - gl_Layer = 2; - gl_TexCoord[1] = vec4(0, 1, 0, 1); - for (i = 0; i < gl_VerticesIn; i++) { - gl_Position = matrixPY* gl_PositionIn[i]; - gl_TexCoord[0] = gl_TexCoordIn[i][0]; - gl_TexCoord[2] = gl_TexCoordIn[i][2]; - EmitVertex(); - } - EndPrimitive(); - gl_Layer = 3; - gl_TexCoord[1] = vec4(1, 1, 0, 1); - for (i = 0; i < gl_VerticesIn; i++) { - gl_Position = matrixNY * gl_PositionIn[i]; - gl_TexCoord[0] = gl_TexCoordIn[i][0]; - gl_TexCoord[2] = gl_TexCoordIn[i][2]; - EmitVertex(); - } - EndPrimitive(); - gl_Layer = 4; - gl_TexCoord[1] = vec4(1, 1, 1, 1); - for (i = 0; i < gl_VerticesIn; i++) { - gl_Position = matrixPZ * gl_PositionIn[i]; - gl_TexCoord[0] = gl_TexCoordIn[i][0]; - gl_TexCoord[2] = gl_TexCoordIn[i][2]; - EmitVertex(); - } - EndPrimitive(); - gl_Layer = 5; - gl_TexCoord[1] = vec4(1, 0, 1, 1); - for (i = 0; i < gl_VerticesIn; i++) { - gl_Position = matrixNZ * gl_PositionIn[i]; - gl_TexCoord[0] = gl_TexCoordIn[i][0]; - gl_TexCoord[2] = gl_TexCoordIn[i][2]; - EmitVertex(); - } - EndPrimitive(); - } - "; - - // compile shaders. - compileShader(frag, fragSource); - compileShader(vert, vertSource); - compileShader(geom, geomSource); - - int tmp; - GL.GetInteger((GetPName)ExtGeometryShader4.MaxGeometryOutputVerticesExt, out tmp); - GL.Ext.ProgramParameter(shaderProgramCubemap, AssemblyProgramParameterArb.GeometryVerticesOut, 18); - - GL.Ext.ProgramParameter(shaderProgramCubemap, AssemblyProgramParameterArb.GeometryInputType, (int)All.Triangles); - GL.Ext.ProgramParameter(shaderProgramCubemap, AssemblyProgramParameterArb.GeometryOutputType, (int)All.TriangleStrip); - - // attach shaders and link the program. - GL.AttachShader(shaderProgramCubemap, frag); - GL.AttachShader(shaderProgramCubemap, vert); - GL.AttachShader(shaderProgramCubemap, geom); - GL.LinkProgram(shaderProgramCubemap); - - // output link info log. - string info; - GL.GetProgramInfoLog(shaderProgramCubemap, out info); - Debug.WriteLine(info); - - // Clean up resources. Note the program object is not deleted. - if (frag != 0) - GL.DeleteShader(frag); - if (vert != 0) - GL.DeleteShader(vert); - if (geom != 0) - GL.DeleteShader(geom); - } - - /// - /// Helper method to avoid code duplication. - /// Compiles a shader and prints results using Debug.WriteLine. - /// - /// A shader object, gotten from GL.CreateShader. - /// The GLSL source to compile. - void compileShader(int shader, string source) - { - GL.ShaderSource(shader, source); - GL.CompileShader(shader); - - string info; - GL.GetShaderInfoLog(shader, out info); - Debug.WriteLine(info); - - int compileResult; - GL.GetShader(shader, ShaderParameter.CompileStatus, out compileResult); - if (compileResult != 1) - { - Debug.WriteLine("Compile Error!"); - Debug.WriteLine(source); - } - } - - void initTextureCube() - { - textureCubeColor = GL.GenTexture(); - GL.BindTexture(TextureTarget.TextureCubeMap, textureCubeColor); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge); - foreach (TextureTarget target in new TextureTarget[] { - TextureTarget.TextureCubeMapPositiveX, - TextureTarget.TextureCubeMapNegativeX, - TextureTarget.TextureCubeMapPositiveY, - TextureTarget.TextureCubeMapNegativeY, - TextureTarget.TextureCubeMapPositiveZ, - TextureTarget.TextureCubeMapNegativeZ, - }) - { - GL.TexImage2D(target, 0, PixelInternalFormat.Rgba8, 512, 512, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); - } - - /* - GL.BindTexture(TextureTarget.TextureCubeMap, textureCubeDepth); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge); - foreach (TextureTarget target in new TextureTarget[] { - TextureTarget.TextureCubeMapPositiveX, - TextureTarget.TextureCubeMapNegativeX, - TextureTarget.TextureCubeMapPositiveY, - TextureTarget.TextureCubeMapNegativeY, - TextureTarget.TextureCubeMapPositiveZ, - TextureTarget.TextureCubeMapNegativeZ, - }) { - GL.TexImage2D(target, 0, (PixelInternalFormat)All.DepthComponent32, 512, 512, 0, PixelFormat.DepthComponent, PixelType.UnsignedInt, IntPtr.Zero); - } - */ - GL.Ext.GenFramebuffers(1, out textureCubeFBO); - GL.Ext.GenRenderbuffers(1, out textureCubeDepth); - - GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, textureCubeFBO); - GL.Ext.FramebufferTexture(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, textureCubeColor, 0); - - //GL.Ext.BindRenderbuffer(RenderbufferTarget.RenderbufferExt, textureCubeDepth); - //GL.Ext.RenderbufferStorage(RenderbufferTarget.RenderbufferExt, (RenderbufferStorage)All.DepthComponent24, 512, 512); - //GL.Ext.FramebufferRenderbuffer(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, RenderbufferTarget.RenderbufferExt, textureCubeDepth); - - #region Test for Error - FramebufferErrorCode e = GL.Ext.CheckFramebufferStatus(FramebufferTarget.FramebufferExt); - switch (e) - { - case FramebufferErrorCode.FramebufferCompleteExt: - { - Console.WriteLine("FBO: The framebuffer is complete and valid for rendering."); - break; - } - case FramebufferErrorCode.FramebufferIncompleteAttachmentExt: - { - Console.WriteLine("FBO: One or more attachment points are not framebuffer attachment complete. This could mean there’s no texture attached or the format isn’t renderable. For color textures this means the base format must be RGB or RGBA and for depth textures it must be a DEPTH_COMPONENT format. Other causes of this error are that the width or height is zero or the z-offset is out of range in case of render to volume."); - break; - } - case FramebufferErrorCode.FramebufferIncompleteMissingAttachmentExt: - { - Console.WriteLine("FBO: There are no attachments."); - break; - } - /* case FramebufferErrorCode.GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT: - { - Console.WriteLine("FBO: An object has been attached to more than one attachment point."); - break; - }*/ - case FramebufferErrorCode.FramebufferIncompleteDimensionsExt: - { - Console.WriteLine("FBO: Attachments are of different size. All attachments must have the same width and height."); - break; - } - case FramebufferErrorCode.FramebufferIncompleteFormatsExt: - { - Console.WriteLine("FBO: The color attachments have different format. All color attachments must have the same format."); - break; - } - case FramebufferErrorCode.FramebufferIncompleteDrawBufferExt: - { - Console.WriteLine("FBO: An attachment point referenced by GL.DrawBuffers() doesn’t have an attachment."); - break; - } - case FramebufferErrorCode.FramebufferIncompleteReadBufferExt: - { - Console.WriteLine("FBO: The attachment point referenced by GL.ReadBuffers() doesn’t have an attachment."); - break; - } - case FramebufferErrorCode.FramebufferUnsupportedExt: - { - Console.WriteLine("FBO: This particular FBO configuration is not supported by the implementation."); - break; - } - case (FramebufferErrorCode)All.FramebufferIncompleteLayerTargetsExt: - { - Console.WriteLine("FBO: Framebuffer Incomplete Layer Targets."); - break; - } - case (FramebufferErrorCode)All.FramebufferIncompleteLayerCountExt: - { - Console.WriteLine("FBO: Framebuffer Incomplete Layer Count."); - break; - } - default: - { - Console.WriteLine("FBO: Status unknown. (yes, this is really bad.)"); - break; - } - } - - // using FBO might have changed states, e.g. the FBO might not support stereoscopic views or double buffering - int[] queryinfo = new int[6]; - GL.GetInteger(GetPName.MaxColorAttachmentsExt, out queryinfo[0]); - GL.GetInteger(GetPName.AuxBuffers, out queryinfo[1]); - GL.GetInteger(GetPName.MaxDrawBuffers, out queryinfo[2]); - GL.GetInteger(GetPName.Stereo, out queryinfo[3]); - GL.GetInteger(GetPName.Samples, out queryinfo[4]); - GL.GetInteger(GetPName.Doublebuffer, out queryinfo[5]); - Console.WriteLine("max. ColorBuffers: " + queryinfo[0] + " max. AuxBuffers: " + queryinfo[1] + " max. DrawBuffers: " + queryinfo[2] + - "\nStereo: " + queryinfo[3] + " Samples: " + queryinfo[4] + " DoubleBuffer: " + queryinfo[5]); - - Console.WriteLine("Last GL Error: " + GL.GetError()); - - #endregion Test for Error - - GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0); // disable rendering into the FBO - } - - void initVBOCube() - { - GL.GenBuffers(1, out vboCube); - // vertex 3 floats - // normal 3 floats - // texcoord 2 floats - // 3+3+2=8 floats = 8*4 = 32 bytes - vboCubeStride = 32; - GL.BindBuffer(BufferTarget.ArrayBuffer, vboCube); - GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(cubeData.Length * vboCubeStride), cubeData, BufferUsageHint.StaticDraw); - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - } - - void initVBOSpere() - { - VertexPositionNormalTexture[] sphereVertices = CalculateSphereVertices(1, 1, 16, 16); - ushort[] sphereElements = CalculateSphereElements(1, 1, 16, 16); - - GL.GenBuffers(1, out vboSphere); - GL.BindBuffer(BufferTarget.ArrayBuffer, vboSphere); - GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(BlittableValueType.StrideOf(sphereVertices) * sphereVertices.Length), sphereVertices, BufferUsageHint.StaticDraw); - - GL.GenBuffers(1, out eboSphere); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, eboSphere); - GL.BufferData(BufferTarget.ElementArrayBuffer, new IntPtr(BlittableValueType.StrideOf(sphereElements) * sphereElements.Length), sphereElements, BufferUsageHint.StaticDraw); - - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - } - - #endregion - - #region perspective - - void setOrtho() - { - OpenTK.Matrix4 proj; - proj = OpenTK.Matrix4.CreateOrthographicOffCenter(-1, 1, -1, 1, 1, -1); - GL.LoadMatrix(ref proj); - } - - void setPerspective() - { - OpenTK.Matrix4 proj; - proj = OpenTK.Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Width / (float)Height, 0.1f, 200f); - GL.LoadMatrix(ref proj); - } - - void switchToMode(ViewMode m) - { - mode = m; - // force update of projection matrix by calling OnResize - this.OnResize(EventArgs.Empty); - } - - #endregion - - #region render methods - - void drawCubemapCross() - { - GL.ClearColor(0.1f, 0.1f, 0.1f, 0.1f); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.PushAttrib(AttribMask.PolygonBit); - GL.Enable(EnableCap.TextureCubeMap); - GL.BindTexture(TextureTarget.TextureCubeMap, textureCubeColor); - GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); - - /* - * - * +---+ - * | 4 | - * +---+---+---+---+ - * | 0 | 1 | 2 | 3 | - * +---+---+---+---+ - * | 5 | - * +---+ - * 0 -x - * 1 +z - * 2 +x - * 3 -z - * 4 +y - * 5 -y - */ - - - GL.PushMatrix(); - GL.LoadIdentity(); - GL.Begin(PrimitiveType.Quads); - - // 0 -x - GL.TexCoord3(-1.0f, +1.0f, -1.0f); - GL.Vertex2(-1.0f, +0.3333f); - GL.TexCoord3(-1.0f, +1.0f, +1.0f); - GL.Vertex2(-0.5f, +0.3333f); - GL.TexCoord3(-1.0f, -1.0f, +1.0f); - GL.Vertex2(-0.5f, -0.3333f); - GL.TexCoord3(-1.0f, -1.0f, -1.0f); - GL.Vertex2(-1.0f, -0.3333f); - - // 1 +z - GL.TexCoord3(-1.0f, +1.0f, +1.0f); - GL.Vertex2(-0.5f, +0.3333f); - GL.TexCoord3(+1.0f, +1.0f, +1.0f); - GL.Vertex2(+0.0f, +0.3333f); - GL.TexCoord3(+1.0f, -1.0f, +1.0f); - GL.Vertex2(+0.0f, -0.3333f); - GL.TexCoord3(-1.0f, -1.0f, +1.0f); - GL.Vertex2(-0.5f, -0.3333f); - - // 2 +x - GL.TexCoord3(+1.0f, +1.0f, +1.0f); - GL.Vertex2(+0.0f, +0.3333f); - GL.TexCoord3(+1.0f, +1.0f, -1.0f); - GL.Vertex2(+0.5f, +0.3333f); - GL.TexCoord3(+1.0f, -1.0f, -1.0f); - GL.Vertex2(+0.5f, -0.3333f); - GL.TexCoord3(+1.0f, -1.0f, +1.0f); - GL.Vertex2(+0.0f, -0.3333f); - - // 3 -z - GL.TexCoord3(+1.0f, +1.0f, -1.0f); - GL.Vertex2(+0.5f, +0.3333f); - GL.TexCoord3(-1.0f, +1.0f, -1.0f); - GL.Vertex2(+1.0f, +0.3333f); - GL.TexCoord3(-1.0f, -1.0f, -1.0f); - GL.Vertex2(+1.0f, -0.3333f); - GL.TexCoord3(+1.0f, -1.0f, -1.0f); - GL.Vertex2(+0.5f, -0.3333f); - - // 4 +y - GL.TexCoord3(-1.0f, +1.0f, -1.0f); - GL.Vertex2(-0.5f, +1.0f); - GL.TexCoord3(+1.0f, +1.0, -1.0f); - GL.Vertex2(+0.0f, +1.0); - GL.TexCoord3(+1.0f, +1.0f, +1.0f); - GL.Vertex2(+0.0f, +0.3333f); - GL.TexCoord3(-1.0f, +1.0f, +1.0f); - GL.Vertex2(-0.5f, +0.3333f); - - // 5 -y - GL.TexCoord3(-1.0f, -1.0f, +1.0f); - GL.Vertex2(-0.5f, -0.3333f); - GL.TexCoord3(+1.0f, -1.0, +1.0f); - GL.Vertex2(+0.0f, -0.3333f); - GL.TexCoord3(+1.0f, -1.0f, -1.0f); - GL.Vertex2(+0.0f, -1.0f); - GL.TexCoord3(-1.0f, -1.0f, -1.0f); - GL.Vertex2(-0.5f, -1.0f); - - GL.End(); - GL.PopMatrix(); - - GL.Disable(EnableCap.TextureCubeMap); - GL.PopAttrib(); - } - - void renderCubeVBO() - { - GL.EnableClientState(ArrayCap.VertexArray); - GL.EnableClientState(ArrayCap.NormalArray); - GL.EnableClientState(ArrayCap.TextureCoordArray); - //GL.ClientActiveTexture(TextureUnit.Texture0 + 0); - - GL.BindBuffer(BufferTarget.ArrayBuffer, vboCube); - GL.VertexPointer(3, VertexPointerType.Float, vboCubeStride, new IntPtr(0)); - GL.NormalPointer(NormalPointerType.Float, vboCubeStride, new IntPtr(Vector3.SizeInBytes)); - GL.TexCoordPointer(2, TexCoordPointerType.Float, vboCubeStride, new IntPtr(Vector3.SizeInBytes + Vector3.SizeInBytes)); - - //GL.Arb.DrawArraysInstanced(BeginMode.Triangles, 0, cubeData.Length/8, 1); - GL.DrawArrays(PrimitiveType.Triangles, 0, cubeData.Length / (vboCubeStride / sizeof(float))); - - GL.DisableClientState(ArrayCap.VertexArray); - GL.DisableClientState(ArrayCap.NormalArray); - GL.DisableClientState(ArrayCap.TextureCoordArray); - } - - void renderSphereVBO() - { - GL.EnableClientState(ArrayCap.VertexArray); - GL.EnableClientState(ArrayCap.NormalArray); - GL.EnableClientState(ArrayCap.TextureCoordArray); - //GL.ClientActiveTexture(TextureUnit.Texture0 + 0); - - GL.BindBuffer(BufferTarget.ArrayBuffer, vboSphere); - GL.VertexPointer(3, VertexPointerType.Float, vboSphereStride, new IntPtr(0)); - GL.NormalPointer(NormalPointerType.Float, vboSphereStride, new IntPtr(Vector3.SizeInBytes)); - GL.TexCoordPointer(2, TexCoordPointerType.Float, vboSphereStride, new IntPtr(Vector3.SizeInBytes + Vector3.SizeInBytes)); - - GL.BindBuffer(BufferTarget.ElementArrayBuffer, eboSphere); - GL.DrawElements(PrimitiveType.Triangles, 16 * 16 * 6, DrawElementsType.UnsignedShort, IntPtr.Zero); - - //GL.Arb.DrawArraysInstanced(BeginMode.Triangles, 0, cubeData.Length/8, 1); - //GL.DrawArrays(BeginMode.Triangles, 0, sphereData.Length / (vboSphereStride / sizeof(float))); - - GL.DisableClientState(ArrayCap.VertexArray); - GL.DisableClientState(ArrayCap.NormalArray); - GL.DisableClientState(ArrayCap.TextureCoordArray); - } - - void renderCubemap() - { - GL.Disable(EnableCap.DepthTest); - - // draw onto cubemap FBO using geometry shader - GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, textureCubeFBO); - GL.UseProgram(shaderProgramCubemap); - GL.PushAttrib(AttribMask.ViewportBit); - { - GL.Viewport(0, 0, 512, 512); - - // clear all cubemap faces to blue - GL.ClearColor(0f, 0f, 1f, 0f); - for (int i = 0; i < 6; i++) - { - GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0, TextureTarget.TextureCubeMapPositiveX + i, textureCubeColor, 0); - //todo select depth renderbuffer face and trun depth_test on again - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - } - GL.Ext.FramebufferTexture(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0, textureCubeColor, 0); - // Create 6 ModelViewProjection matrices, one to look in each direction - // proj with 90 degrees (1/2 pi) fov - // translate negative to place cam insize sphere - Matrix4 model = Matrix4.CreateScale(-1) * Matrix4.CreateTranslation(spherePos); - Matrix4 proj = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver2, 1, 0.1f, 100f); - - Matrix4[] m = new Matrix4[6]; - - m[0] = model * Matrix4.LookAt(Vector3.Zero, Vector3.UnitX, -Vector3.UnitY) * proj; - m[1] = model * Matrix4.LookAt(Vector3.Zero, -Vector3.UnitX, -Vector3.UnitY) * proj; - m[2] = model * Matrix4.LookAt(Vector3.Zero, Vector3.UnitY, Vector3.UnitZ) * proj; - m[3] = model * Matrix4.LookAt(Vector3.Zero, -Vector3.UnitY, -Vector3.UnitZ) * proj; - m[4] = model * Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, -Vector3.UnitY) * proj; - m[5] = model * Matrix4.LookAt(Vector3.Zero, -Vector3.UnitZ, -Vector3.UnitY) * proj; - GL.UniformMatrix4(GL.GetUniformLocation(shaderProgramCubemap, "matrixPX"), false, ref m[0]); - GL.UniformMatrix4(GL.GetUniformLocation(shaderProgramCubemap, "matrixNX"), false, ref m[1]); - GL.UniformMatrix4(GL.GetUniformLocation(shaderProgramCubemap, "matrixPY"), false, ref m[2]); - GL.UniformMatrix4(GL.GetUniformLocation(shaderProgramCubemap, "matrixNY"), false, ref m[3]); - GL.UniformMatrix4(GL.GetUniformLocation(shaderProgramCubemap, "matrixPZ"), false, ref m[4]); - GL.UniformMatrix4(GL.GetUniformLocation(shaderProgramCubemap, "matrixNZ"), false, ref m[5]); - - - renderCubeVBO(); - } - GL.PopAttrib(); - GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0); - GL.UseProgram(0); - GL.Enable(EnableCap.DepthTest); - } - - void renderScene() - { - GL.MatrixMode(MatrixMode.Projection); - GL.PushMatrix(); - setPerspective(); - GL.MatrixMode(MatrixMode.Modelview); - GL.PushMatrix(); - Matrix4 lookat = Matrix4.LookAt(eyePos, eyeLookat, Vector3.UnitY); - GL.LoadMatrix(ref lookat); - - - GL.UseProgram(shaderProgramBox); - renderCubeVBO(); - GL.UseProgram(shaderProgramSphere); - GL.BindTexture(TextureTarget.TextureCubeMap, textureCubeColor); - GL.Uniform1(GL.GetUniformLocation(shaderProgramSphere, "tex"), 0); - GL.Translate(spherePos); - GL.Enable(EnableCap.DepthTest); - renderSphereVBO(); - GL.UseProgram(0); - - GL.MatrixMode(MatrixMode.Projection); - GL.PopMatrix(); - GL.MatrixMode(MatrixMode.Modelview); - GL.PopMatrix(); - } - - #endregion - - #region overrides - - protected override void OnLoad(EventArgs e) - { - if (!GL.GetString(StringName.Extensions).Contains("EXT_geometry_shader4")) - { - System.Windows.Forms.MessageBox.Show( - "Your video card does not support EXT_geometry_shader4. Please update your drivers.", - "EXT_geometry_shader4 not supported", - System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation); - Exit(); - } - - //int tmp; - //GL.GetInteger(GetPName.MaxVertexUniformComponents, out tmp); - //0x0400 - // 6 * 4x4 mat (0x10) = 0x60 - - // init shaders - initShaderProgramBox(); - initShaderProgramSphere(); - initShaderProgramCubemap(); - // init textures / fbos - initTextureCube(); - // init vbos - initVBOCube(); - initVBOSpere(); - - //switchToMode(ViewMode.Scene); - - } - - protected override void OnUnload(EventArgs e) - { - if (shaderProgramBox != 0) - GL.DeleteProgram(shaderProgramBox); - if (shaderProgramSphere != 0) - GL.DeleteProgram(shaderProgramSphere); - if (shaderProgramCubemap != 0) - GL.DeleteProgram(shaderProgramCubemap); - if (textureCubeColor != 0) - GL.DeleteTexture(textureCubeColor); - if (textureCubeDepth != 0) - GL.DeleteTexture(textureCubeDepth); - if (textureCubeFBO != 0) - GL.DeleteFramebuffers(1, ref textureCubeFBO); - base.OnUnload(e); - } - - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - // Set projection matrix - GL.MatrixMode(MatrixMode.Projection); - switch (mode) - { - case ViewMode.CubemapCross: - setOrtho(); - break; - case ViewMode.Scene: - setPerspective(); - break; - default: - GL.LoadIdentity(); - break; - } - - // Set selector state back to ModelView matrix mode - GL.MatrixMode(MatrixMode.Modelview); - base.OnResize(e); - - } - - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - // elapsed time in ms since last start - double elapsed = (DateTime.Now - startTime).TotalMilliseconds; - - spherePos.X = (float)Math.Sin(elapsed / 5000) * 3; - spherePos.Z = (float)Math.Cos(elapsed / 5000) * 3; - eyePos.X = (float)Math.Cos(elapsed / 3000) * 8; - eyePos.Z = (float)Math.Sin(elapsed / 2000) * 8; - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Space]) - { - ErrorCode err = GL.GetError(); - //Console.WriteLine(err + " " + Glu.ErrorString((GluErrorCode)err)); - Console.WriteLine("GL error code: {0}", err); - } - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - if (mode == ViewMode.CubemapCross) - { - renderCubemap(); - drawCubemapCross(); - } - if (mode == ViewMode.Scene) - { - renderCubemap(); - GL.ClearColor(0.1f, 0.1f, 0.1f, 0.1f); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - renderScene(); - } - - this.SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (SimpleGeometryShader2 example = new SimpleGeometryShader2()) - { - Utilities.SetWindowTitle(example); - example.Run(60.0, 0.0); - } - } - - #endregion - - #region data - //structure: vec3 pos, vec3 normal, vec2 texcoord - static float[] cubeData = { - -10,-10,-10, 0,0,-10, 1.0f,0.0f, - -10,10,-10, 0,0,-10, 1.0f,1.0f, - 10,10,-10, 0,0,-10, 0.0f,1.0f, - - 10,10,-10, 0,0,-10, 0.0f,1.0f, - 10,-10,-10, 0,0,-10, 0.0f,0.0f, - -10,-10,-10, 0,0,-10, 1.0f,0.0f, - - -10,-10,10, 0,0,10, 0.0f,0.0f, - 10,-10,10, 0,0,10, 1.0f,0.0f, - 10,10,10, 0,0,10, 1.0f,1.0f, - - 10,10,10, 0,0,10, 1.0f,1.0f, - -10,10,10, 0,0,10, 0.0f,1.0f, - -10,-10,10, 0,0,10, 0.0f,0.0f, - - -10,-10,-10, 0,-10,0, 0.0f,0.0f, - 10,-10,-10, 0,-10,0, 1.0f,0.0f, - 10,-10,10, 0,-10,0, 1.0f,1.0f, - - 10,-10,10, 0,-10,0, 1.0f,1.0f, - -10,-10,10, 0,-10,0, 0.0f,1.0f, - -10,-10,-10, 0,-10,0, 0.0f,0.0f, - - 10,-10,-10, 10,0,0, 0.0f,0.0f, - 10,10,-10, 10,0,0, 1.0f,0.0f, - 10,10,10, 10,0,0, 1.0f,1.0f, - - 10,10,10, 10,0,0, 1.0f,1.0f, - 10,-10,10, 10,0,0, 0.0f,1.0f, - 10,-10,-10, 10,0,0, 0.0f,0.0f, - - 10,10,-10, 0,10,0, 0.0f,0.0f, - -10,10,-10, 0,10,0, 1.0f,0.0f, - -10,10,10, 0,10,0, 1.0f,1.0f, - - -10,10,10, 0,10,0, 1.0f,1.0f, - 10,10,10, 0,10,0, 0.0f,1.0f, - 10,10,-10, 0,10,0, 0.0f,0.0f, - - -10,10,-10, -10,0,0, 0.0f,0.0f, - -10,-10,-10, -10,0,0, 1.0f,0.0f, - -10,-10,10, -10,0,0, 1.0f,1.0f, - - -10,-10,10, -10,0,0, 1.0f,1.0f, - -10,10,10, -10,0,0, 0.0f,1.0f, - -10,10,-10, -10,0,0, 0.0f,0.0f, - }; - - static VertexPositionNormalTexture[] CalculateSphereVertices(float radius, float height, byte segments, byte rings) - { - VertexPositionNormalTexture[] data = new VertexPositionNormalTexture[segments * rings]; - - int i = 0; - - for (double y = 0; y < rings; y++) - { - double phi = (y / (rings - 1)) * Math.PI; - for (double x = 0; x < segments; x++) - { - double theta = (x / (segments - 1)) * 2 * Math.PI; - - Vector3 v = new Vector3( - (float)(radius * Math.Sin(phi) * Math.Cos(theta)), - (float)(height * Math.Cos(phi)), - (float)(radius * Math.Sin(phi) * Math.Sin(theta))); - Vector3 n = Vector3.Normalize(v); - Vector2 uv = new Vector2( - (float)(x / (segments - 1)), - (float)(y / (rings - 1))); - // Using data[i++] causes i to be incremented multiple times in Mono 2.2 (bug #479506). - data[i] = new VertexPositionNormalTexture(v, n, uv); - i++; - } - - } - - return data; - } - - static ushort[] CalculateSphereElements(float radius, float height, byte segments, byte rings) - { - int num_vertices = segments * rings; - ushort[] data = new ushort[num_vertices * 6]; - - ushort i = 0; - - for (byte y = 0; y < rings - 1; y++) - { - for (byte x = 0; x < segments - 1; x++) - { - data[i++] = (ushort)((y + 0) * segments + x); - data[i++] = (ushort)((y + 1) * segments + x); - data[i++] = (ushort)((y + 1) * segments + x + 1); - - data[i++] = (ushort)((y + 1) * segments + x + 1); - data[i++] = (ushort)((y + 0) * segments + x + 1); - data[i++] = (ushort)((y + 0) * segments + x); - } - } - - // Verify that we don't access any vertices out of bounds: - foreach (int index in data) - if (index >= segments * rings) - throw new IndexOutOfRangeException(); - - return data; - } - - #endregion - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGL/2.x/JuliaSetFractal.cs b/Source/Examples/OpenGL/2.x/JuliaSetFractal.cs deleted file mode 100644 index c896c217..00000000 --- a/Source/Examples/OpenGL/2.x/JuliaSetFractal.cs +++ /dev/null @@ -1,307 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Windows.Forms; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.Tutorial -{ - /// - /// Demonstrates how to render an animated Julia Set in real-time. Quality is sacrificed for speed. - /// Info about the fractal: http://en.wikipedia.org/wiki/Julia_set - /// One more major optimization could be applied (exploit the symmetry of the image with RTT), but - /// that would make the program alot more complicated to follow. You can do this as an exercise. - /// - [Example("Julia Set Fractal", ExampleCategory.OpenGL, "2.x", Documentation = "JuliaSetFractal")] - public class JuliaSetFractal : GameWindow - { - public JuliaSetFractal() - : base(512, 512) - { - } - - #region Private Fields - - // GLSL Objects - int VertexShaderObject, FragmentShaderObject, ProgramObject; - int TextureObject; - - // Julia Variables for animation - float AnimOffsetX = 0.213f; // using non-zero as starting point to make it more interesting - float AnimOffsetY = 0.63f; - - const double AnimSpeedX = 0.65; // anim speed scaling is solely used to make the anim more interesting - const double AnimSpeedY = 1.05; - const double AnimCosinusPercent = 0.85f; // scales the cosinus down to 85% to avoid the (boring) borders - - float UniformScaleFactorX; // fractal horizontal scaling is only affected by window resize - float UniformScaleFactorY; // fractal vertical scaling is only affected by window resize - float UniformOffsetX = 1.8f; // fractal horizontal offset - float UniformOffsetY = 1.8f; // fractal vertical offset - - #endregion private Fields - - #region OnLoad - - /// - /// Setup OpenGL and load resources here. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - // Check for necessary capabilities: - Version version = new Version(GL.GetString(StringName.Version).Substring(0, 3)); - Version target = new Version(2, 0); - if (version < target) - { - throw new NotSupportedException(String.Format( - "OpenGL {0} is required (you only have {1}).", target, version)); - } - - this.VSync = VSyncMode.On; - - GL.Disable(EnableCap.Dither); - GL.ClearColor(0.2f, 0f, 0.4f, 0f); - - // declare some variables for tracking which shader did compile, and which texture to use - string[] ShaderFilenames = new string[2]; - ShaderFilenames[0] = "Data/Shaders/JuliaSet_SM3_FS.glsl"; - ShaderFilenames[1] = "Data/Shaders/JuliaSet_SM2_FS.glsl"; - - string LogInfo; - int status = 0; - - #region Shaders - // Load&Compile Vertex Shader - using (StreamReader sr = new StreamReader("Data/Shaders/JuliaSet_VS.glsl")) - { - VertexShaderObject = GL.CreateShader(ShaderType.VertexShader); - GL.ShaderSource(VertexShaderObject, sr.ReadToEnd()); - GL.CompileShader(VertexShaderObject); - } - - GL.GetShaderInfoLog(VertexShaderObject, out LogInfo); - if (LogInfo.Length > 0 && !LogInfo.Contains("hardware")) - Trace.WriteLine("Vertex Shader Log:\n" + LogInfo); - else - Trace.WriteLine("Vertex Shader compiled without complaint."); - - // Load&Compile Fragment Shader - FragmentShaderObject = GL.CreateShader(ShaderType.FragmentShader); - foreach (var shader in ShaderFilenames) - { - using (StreamReader sr = new StreamReader(shader)) - { - GL.ShaderSource(FragmentShaderObject, sr.ReadToEnd()); - GL.CompileShader(FragmentShaderObject); - } - GL.GetShader(FragmentShaderObject, ShaderParameter.CompileStatus, out status); - if (status != 1) - { - GL.GetShaderInfoLog(FragmentShaderObject, out LogInfo); - Trace.WriteLine("Compiling " + shader + " failed!\nLog:\n" + LogInfo); - } - else - { - Trace.WriteLine("Fragment Shader compiled without complaint."); - break; - } - } - if (status != 1) - { - MessageBox.Show("Shader compilation failed"); - Exit(); - } - - // Link the Shaders to a usable Program - ProgramObject = GL.CreateProgram(); - GL.AttachShader(ProgramObject, VertexShaderObject); - GL.AttachShader(ProgramObject, FragmentShaderObject); - GL.LinkProgram(ProgramObject); - - // make current - GL.UseProgram(ProgramObject); - - // Flag ShaderObjects for delete when app exits - GL.DeleteShader(VertexShaderObject); - GL.DeleteShader(FragmentShaderObject); - #endregion Shaders - - #region Textures - - // Load&Bind the 1D texture for color lookups - GL.ActiveTexture(TextureUnit.Texture0); // select TMU0 - GL.GenTextures(1, out TextureObject); - GL.TexParameter(TextureTarget.Texture1D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - GL.TexParameter(TextureTarget.Texture1D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - GL.TexParameter(TextureTarget.Texture1D, TextureParameterName.TextureWrapS, (int)(TextureWrapMode)All.ClampToEdge); - - using (Bitmap bitmap = new Bitmap("Data/Textures/JuliaColorTable.bmp")) - { - BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, - System.Drawing.Imaging.PixelFormat.Format24bppRgb); - GL.TexImage1D(TextureTarget.Texture1D, 0, PixelInternalFormat.Rgb8, data.Width, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, - PixelType.UnsignedByte, data.Scan0); - bitmap.UnlockBits(data); - } - #endregion Textures - - KeyUp += Keyboard_KeyUp; - } - - int i = 0; - void Keyboard_KeyUp(object sender, KeyboardKeyEventArgs e) - { - if (e.Key == Key.F12) - { - Bitmap bmp = new Bitmap(this.Width, this.Height); - System.Drawing.Imaging.BitmapData data = - bmp.LockBits(new System.Drawing.Rectangle(0, 0, this.Width, this.Height), - System.Drawing.Imaging.ImageLockMode.WriteOnly, - System.Drawing.Imaging.PixelFormat.Format24bppRgb); - GL.ReadPixels(0, 0, this.Width, this.Height, - OpenTK.Graphics.OpenGL.PixelFormat.Bgr, - OpenTK.Graphics.OpenGL.PixelType.UnsignedByte, - data.Scan0); - bmp.UnlockBits(data); - bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); - bmp.Save("Screenshot" + (i++).ToString() + ".png", ImageFormat.Png); - } - } - - #endregion - - #region OnUnload - - protected override void OnUnload(EventArgs e) - { - if (TextureObject != 0) - GL.DeleteTextures(1, ref TextureObject); - - if (ProgramObject != 0) - GL.DeleteProgram(ProgramObject); // implies deleting the previously flagged ShaderObjects - } - - #endregion - - #region OnResize - - /// - /// Respond to resize events here. - /// - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize(EventArgs e) - { - // Magic numbers so the fractal almost fits inside the window. - // If changing this, also change the -1.6f offset in the fragment shader accordingly. - UniformScaleFactorX = Width / (UniformOffsetX * 2f); - UniformScaleFactorY = Height / (UniformOffsetY * 2f); - - GL.Viewport(0, 0, Width, Height); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 1.0); // 2D setup - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Add your game logic here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - base.OnUpdateFrame(e); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - } - } - - #endregion - - #region OnRenderFrame - - /// - /// Add your game rendering code here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - //this.Title = "FPS: " + 1 / e.Time; - GL.Clear(ClearBufferMask.ColorBufferBit); - - // First, render the next frame of the Julia fractal. - GL.UseProgram(ProgramObject); - - // advance the animation by elapsed time, scaling is solely used to make the anim more interesting - AnimOffsetX += (float)(e.Time * AnimSpeedX); - AnimOffsetY += (float)(e.Time * AnimSpeedY); - - // pass uniforms into the fragment shader - // first the texture - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "COLORTABLE"), TextureObject); - // the rest are floats - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "CETX"), (float)(Math.Cos(AnimOffsetX) * AnimCosinusPercent)); - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "CETY"), (float)(Math.Cos(AnimOffsetY) * AnimCosinusPercent)); - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "SCALINGX"), UniformScaleFactorX); - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "SCALINGY"), UniformScaleFactorY); - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "OFFSETX"), UniformOffsetX); - GL.Uniform1(GL.GetUniformLocation(ProgramObject, "OFFSETY"), UniformOffsetY); - - // Fullscreen quad. Using immediate mode, since this app is fragment shader limited anyways. - GL.Begin(PrimitiveType.Quads); - { - GL.Vertex2(-1.0f, -1.0f); - GL.Vertex2(1.0f, -1.0f); - GL.Vertex2(1.0f, 1.0f); - GL.Vertex2(-1.0f, 1.0f); - } - GL.End(); - - SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (JuliaSetFractal example = new JuliaSetFractal()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGL/2.x/SimpleGLSL.cs b/Source/Examples/OpenGL/2.x/SimpleGLSL.cs deleted file mode 100644 index 3835ff77..00000000 --- a/Source/Examples/OpenGL/2.x/SimpleGLSL.cs +++ /dev/null @@ -1,293 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region --- Using Directives --- - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Threading; -using System.Diagnostics; -using System.IO; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -#endregion --- Using Directives --- - -namespace Examples.Tutorial -{ - /// - /// Demonstrates how to load and use a simple OpenGL shader program. Example is incomplete (documentation). - /// - [Example("First shader", ExampleCategory.OpenGL, "2.x", Documentation = "SimpleGLSL")] - public class T10_GLSL_Cube : GameWindow - { - #region --- Fields --- - - static float angle = 0.0f, rotation_speed = 3.0f; - int vertex_shader_object, fragment_shader_object, shader_program; - int vertex_buffer_object, color_buffer_object, element_buffer_object; - - Shapes.Shape shape = new Examples.Shapes.Cube(); - - #endregion - - #region --- Constructors --- - - public T10_GLSL_Cube() - : base(800, 600, GraphicsMode.Default) - { } - - #endregion - - #region OnLoad - - /// - /// This is the place to load resources that change little - /// during the lifetime of the GameWindow. In this case, we - /// check for GLSL support, and load the shaders. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - // Check for necessary capabilities: - Version version = new Version(GL.GetString(StringName.Version).Substring(0, 3)); - Version target = new Version(2, 0); - if (version < target) - { - throw new NotSupportedException(String.Format( - "OpenGL {0} is required (you only have {1}).", target, version)); - } - - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - - CreateVBO(); - - using (StreamReader vs = new StreamReader("Data/Shaders/Simple_VS.glsl")) - using (StreamReader fs = new StreamReader("Data/Shaders/Simple_FS.glsl")) - CreateShaders(vs.ReadToEnd(), fs.ReadToEnd(), - out vertex_shader_object, out fragment_shader_object, - out shader_program); - } - - #endregion - - #region CreateShaders - - void CreateShaders(string vs, string fs, - out int vertexObject, out int fragmentObject, - out int program) - { - int status_code; - string info; - - vertexObject = GL.CreateShader(ShaderType.VertexShader); - fragmentObject = GL.CreateShader(ShaderType.FragmentShader); - - // Compile vertex shader - GL.ShaderSource(vertexObject, vs); - GL.CompileShader(vertexObject); - GL.GetShaderInfoLog(vertexObject, out info); - GL.GetShader(vertexObject, ShaderParameter.CompileStatus, out status_code); - - if (status_code != 1) - throw new ApplicationException(info); - - // Compile vertex shader - GL.ShaderSource(fragmentObject, fs); - GL.CompileShader(fragmentObject); - GL.GetShaderInfoLog(fragmentObject, out info); - GL.GetShader(fragmentObject, ShaderParameter.CompileStatus, out status_code); - - if (status_code != 1) - throw new ApplicationException(info); - - program = GL.CreateProgram(); - GL.AttachShader(program, fragmentObject); - GL.AttachShader(program, vertexObject); - - GL.LinkProgram(program); - GL.UseProgram(program); - } - - #endregion - - #region private void CreateVBO() - - void CreateVBO() - { - int size; - - GL.GenBuffers(1, out vertex_buffer_object); - GL.GenBuffers(1, out color_buffer_object); - GL.GenBuffers(1, out element_buffer_object); - - // Upload the vertex buffer. - GL.BindBuffer(BufferTarget.ArrayBuffer, vertex_buffer_object); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(shape.Vertices.Length * 3 * sizeof(float)), shape.Vertices, - BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); - if (size != shape.Vertices.Length * 3 * sizeof(Single)) - throw new ApplicationException(String.Format( - "Problem uploading vertex buffer to VBO (vertices). Tried to upload {0} bytes, uploaded {1}.", - shape.Vertices.Length * 3 * sizeof(Single), size)); - - // Upload the color buffer. - GL.BindBuffer(BufferTarget.ArrayBuffer, color_buffer_object); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(shape.Colors.Length * sizeof(int)), shape.Colors, - BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); - if (size != shape.Colors.Length * sizeof(int)) - throw new ApplicationException(String.Format( - "Problem uploading vertex buffer to VBO (colors). Tried to upload {0} bytes, uploaded {1}.", - shape.Colors.Length * sizeof(int), size)); - - // Upload the index buffer (elements inside the vertex buffer, not color indices as per the IndexPointer function!) - GL.BindBuffer(BufferTarget.ElementArrayBuffer, element_buffer_object); - GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(shape.Indices.Length * sizeof(Int32)), shape.Indices, - BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size); - if (size != shape.Indices.Length * sizeof(int)) - throw new ApplicationException(String.Format( - "Problem uploading vertex buffer to VBO (offsets). Tried to upload {0} bytes, uploaded {1}.", - shape.Indices.Length * sizeof(int), size)); - } - - #endregion - - #region OnUnload - - protected override void OnUnload(EventArgs e) - { - if (shader_program != 0) - GL.DeleteProgram(shader_program); - if (fragment_shader_object != 0) - GL.DeleteShader(fragment_shader_object); - if (vertex_shader_object != 0) - GL.DeleteShader(vertex_shader_object); - if (vertex_buffer_object != 0) - GL.DeleteBuffers(1, ref vertex_buffer_object); - if (element_buffer_object != 0) - GL.DeleteBuffers(1, ref element_buffer_object); - } - - #endregion - - #region OnResize - - /// - /// Called when the user resizes the window. - /// - /// Contains the new width/height of the window. - /// - /// You want the OpenGL viewport to match the window. This is the place to do it! - /// - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - float aspect_ratio = Width / (float)Height; - Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 64); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perpective); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Prepares the next frame for rendering. - /// - /// - /// Place your control logic here. This is the place to respond to user input, - /// update object positions etc. - /// - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - this.Exit(); - - if (keyboard[OpenTK.Input.Key.F11]) - if (WindowState != WindowState.Fullscreen) - WindowState = WindowState.Fullscreen; - else - WindowState = WindowState.Normal; - } - - #endregion - - #region OnRenderFrame - - /// - /// Place your rendering code here. - /// - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | - ClearBufferMask.DepthBufferBit); - - Matrix4 lookat = Matrix4.LookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - angle += rotation_speed * (float)e.Time; - GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - - GL.EnableClientState(ArrayCap.VertexArray); - GL.EnableClientState(ArrayCap.ColorArray); - - GL.BindBuffer(BufferTarget.ArrayBuffer, vertex_buffer_object); - GL.VertexPointer(3, VertexPointerType.Float, 0, IntPtr.Zero); - GL.BindBuffer(BufferTarget.ArrayBuffer, color_buffer_object); - GL.ColorPointer(4, ColorPointerType.UnsignedByte, 0, IntPtr.Zero); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, element_buffer_object); - - GL.DrawElements(PrimitiveType.Triangles, shape.Indices.Length, - DrawElementsType.UnsignedInt, IntPtr.Zero); - - //GL.DrawArrays(GL.Enums.BeginMode.POINTS, 0, shape.Vertices.Length); - - GL.DisableClientState(ArrayCap.VertexArray); - GL.DisableClientState(ArrayCap.ColorArray); - - - //int error = GL.GetError(); - //if (error != 0) - // Debug.Print(Glu.ErrorString(Glu.Enums.ErrorCode.INVALID_OPERATION)); - - SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (T10_GLSL_Cube example = new T10_GLSL_Cube()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); - example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGL/2.x/SwizzledParallax.cs b/Source/Examples/OpenGL/2.x/SwizzledParallax.cs deleted file mode 100644 index 09dd5d25..00000000 --- a/Source/Examples/OpenGL/2.x/SwizzledParallax.cs +++ /dev/null @@ -1,380 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.Drawing; -using System.IO; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -using Examples.TextureLoaders; - -namespace Examples.Tutorial -{ - /// Demonstrates Swizzled DXT5 Parallax Mapping - /// The idea is described in more detail right here: http://www.opentk.com/node/394 - /// - [Example("Swizzled Parallax Mapping", ExampleCategory.OpenGL, "2.x", Documentation = "SwizzledParallax")] - public class T12_GLSL_Parallax: GameWindow - { - public T12_GLSL_Parallax( ) - : base( 800, 600 ) - { - } - - #region internal Fields - - // Shader - int VertexShaderObject, FragmentShaderObject, ProgramObject; - const string VertexShaderFilename = "Data/Shaders/Parallax_VS.glsl"; - const string FragmentShaderFilename = "Data/Shaders/Parallax_FS.glsl"; - - const int AttribTangent = 5; // slot where to pass tangents to VS, not sure which are reserved besides 0 - Vector3 Tangent = new Vector3( 1f, 0f, 0f ); - Vector3 Normal = new Vector3( 0f, 0f, 1f ); - - // Material parameter - //Vector3 MaterialScaleAndBiasAndShininess = new Vector3( 0.07f, 0.0f, 38.0f ); // for Metal tex - Vector3 MaterialScaleAndBiasAndShininess = new Vector3( 0.04f, 0.0f, 92.0f ); // for Rock tex - - // Textures - const TextureUnit TMU0_Unit = TextureUnit.Texture0; - const int TMU0_UnitInteger = 0; - const string TMU0_Filename = "Data/Textures/swizzled-rock-diffuse-height.dds"; - uint TMU0_Handle; - TextureTarget TMU0_Target; - - const TextureUnit TMU1_Unit = TextureUnit.Texture1; - const int TMU1_UnitInteger = 1; - const string TMU1_Filename = "Data/Textures/swizzled-rock-normal-gloss.dds"; - uint TMU1_Handle; - TextureTarget TMU1_Target; - - // Camera - Vector3 EyePos = new Vector3( 0.0f, 0.0f, 3.0f ); - - // Light - Vector3 LightPosition = new Vector3( 0.0f, 1.0f, 1.0f ); - Vector3 LightDiffuse = new Vector3( 0.5f, 0.5f, 0.5f ); - Vector3 LightSpecular = new Vector3( 1f, 1f, 1f ); - - #endregion internal Fields - - /// Setup OpenGL and load resources here. - /// Not used. - protected override void OnLoad(EventArgs e) - { - this.VSync = VSyncMode.Off; - - // Check for necessary capabilities: - string extensions = GL.GetString(StringName.Extensions); - if ( !GL.GetString(StringName.Extensions).Contains("GL_ARB_shading_language")) - { - throw new NotSupportedException(String.Format("This example requires OpenGL 2.0. Found {0}. Aborting.", - GL.GetString(StringName.Version).Substring(0, 3))); - } - - if (!extensions.Contains("GL_ARB_texture_compression") || - !extensions.Contains("GL_EXT_texture_compression_s3tc")) - { - throw new NotSupportedException("This example requires support for texture compression. Aborting."); - } - - int[] temp = new int[1]; - GL.GetInteger( GetPName.MaxTextureImageUnits, out temp[0] ); - Trace.WriteLine( temp[0] + " TMU's for Fragment Shaders found. (2 required)" ); - - GL.GetInteger( GetPName.MaxVaryingFloats, out temp[0] ); - Trace.WriteLine( temp[0] + " varying floats between VS and FS allowed. (6 required)" ); - - GL.GetInteger( GetPName.MaxVertexUniformComponents, out temp[0] ); - Trace.WriteLine( temp[0] + " uniform components allowed in Vertex Shader. (6 required)" ); - - GL.GetInteger( GetPName.MaxFragmentUniformComponents, out temp[0] ); - Trace.WriteLine( temp[0] + " uniform components allowed in Fragment Shader. (11 required)" ); - Trace.WriteLine("" ); - - #region GL State - - GL.ClearColor( 0.2f, 0f, 0.4f, 0f ); - - GL.PointSize( 10f ); - - GL.Disable( EnableCap.Dither ); - - GL.FrontFace( FrontFaceDirection.Ccw ); - GL.PolygonMode( MaterialFace.Front, PolygonMode.Fill ); - GL.PolygonMode( MaterialFace.Back, PolygonMode.Line ); - - #endregion GL State - - #region Shaders - - string LogInfo; - - // Load&Compile Vertex Shader - - using ( StreamReader sr = new StreamReader( VertexShaderFilename ) ) - { - VertexShaderObject = GL.CreateShader( ShaderType.VertexShader ); - GL.ShaderSource( VertexShaderObject, sr.ReadToEnd( ) ); - GL.CompileShader( VertexShaderObject ); - } - - GL.GetShaderInfoLog( VertexShaderObject, out LogInfo ); - if ( LogInfo.Length > 0 && !LogInfo.Contains( "hardware" ) ) - Trace.WriteLine( "Vertex Shader failed!\nLog:\n" + LogInfo ); - else - Trace.WriteLine( "Vertex Shader compiled without complaint." ); - - // Load&Compile Fragment Shader - - using ( StreamReader sr = new StreamReader( FragmentShaderFilename ) ) - { - FragmentShaderObject = GL.CreateShader( ShaderType.FragmentShader ); - GL.ShaderSource( FragmentShaderObject, sr.ReadToEnd( ) ); - GL.CompileShader( FragmentShaderObject ); - } - GL.GetShaderInfoLog( FragmentShaderObject, out LogInfo ); - - if ( LogInfo.Length > 0 && !LogInfo.Contains( "hardware" ) ) - Trace.WriteLine( "Fragment Shader failed!\nLog:\n" + LogInfo ); - else - Trace.WriteLine( "Fragment Shader compiled without complaint." ); - - // Link the Shaders to a usable Program - ProgramObject = GL.CreateProgram( ); - GL.AttachShader( ProgramObject, VertexShaderObject ); - GL.AttachShader( ProgramObject, FragmentShaderObject ); - - // must bind the attribute before linking - GL.BindAttribLocation( ProgramObject, AttribTangent, "AttributeTangent" ); - - // link it all together - GL.LinkProgram( ProgramObject ); - - // flag ShaderObjects for delete when not used anymore - GL.DeleteShader( VertexShaderObject ); - GL.DeleteShader( FragmentShaderObject ); - - GL.GetProgram(ProgramObject, GetProgramParameterName.LinkStatus, out temp[0]); - Trace.WriteLine( "Linking Program (" + ProgramObject + ") " + ( ( temp[0] == 1 ) ? "succeeded." : "FAILED!" ) ); - if ( temp[0] != 1 ) - { - GL.GetProgramInfoLog( ProgramObject, out LogInfo ); - Trace.WriteLine( "Program Log:\n" + LogInfo ); - } - - GL.GetProgram(ProgramObject, GetProgramParameterName.ActiveAttributes, out temp[0]); - Trace.WriteLine( "Program registered " + temp[0] + " Attributes. (Should be 4: Pos, UV, Normal, Tangent)" ); - - Trace.WriteLine( "Tangent attribute bind location: " + GL.GetAttribLocation( ProgramObject, "AttributeTangent" ) ); - - Trace.WriteLine( "End of Shader build. GL Error: " + GL.GetError( ) ); - - #endregion Shaders - - #region Textures - - TextureLoaderParameters.MagnificationFilter = TextureMagFilter.Linear; - TextureLoaderParameters.MinificationFilter = TextureMinFilter.LinearMipmapLinear; - TextureLoaderParameters.WrapModeS = TextureWrapMode.ClampToBorder; - TextureLoaderParameters.WrapModeT = TextureWrapMode.ClampToBorder; - TextureLoaderParameters.EnvMode = TextureEnvMode.Modulate; - - ImageDDS.LoadFromDisk( TMU0_Filename, out TMU0_Handle, out TMU0_Target ); - Trace.WriteLine( "Loaded " + TMU0_Filename + " with handle " + TMU0_Handle + " as " + TMU0_Target ); - - ImageDDS.LoadFromDisk( TMU1_Filename, out TMU1_Handle, out TMU1_Target ); - Trace.WriteLine( "Loaded " + TMU1_Filename + " with handle " + TMU1_Handle + " as " + TMU1_Target ); - - #endregion Textures - - Trace.WriteLine( "End of Texture Loading. GL Error: " + GL.GetError( ) ); - Trace.WriteLine( ""); - } - - protected override void OnUnload(EventArgs e) - { - GL.DeleteProgram( ProgramObject ); - GL.DeleteTextures( 1, ref TMU0_Handle ); - GL.DeleteTextures( 1, ref TMU1_Handle ); - - base.OnUnload( e ); - } - - /// Respond to resize events here. - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize( EventArgs e ) - { - GL.Viewport( 0, 0, Width, Height ); - - GL.MatrixMode( MatrixMode.Projection ); - Matrix4 p = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Width / (float)Height, 0.1f, 100.0f); - GL.LoadMatrix(ref p); - - GL.MatrixMode( MatrixMode.Modelview ); - GL.LoadIdentity( ); - - base.OnResize( e ); - } - - protected override void OnKeyDown(OpenTK.Input.KeyboardKeyEventArgs e) - { - base.OnKeyDown(e); - - if (e.Keyboard[OpenTK.Input.Key.Escape]) - this.Exit(); - if (e.Keyboard[OpenTK.Input.Key.Space]) - Trace.WriteLine("GL: " + GL.GetError()); - if (e.Keyboard[OpenTK.Input.Key.Q]) - { - MaterialScaleAndBiasAndShininess.X += 0.01f; - Trace.WriteLine("Scale: " + MaterialScaleAndBiasAndShininess.X + " Bias: " + MaterialScaleAndBiasAndShininess.Y); - } - if (e.Keyboard[OpenTK.Input.Key.A]) - { - MaterialScaleAndBiasAndShininess.X -= 0.01f; - Trace.WriteLine("Scale: " + MaterialScaleAndBiasAndShininess.X + " Bias: " + MaterialScaleAndBiasAndShininess.Y); - } - if (e.Keyboard[OpenTK.Input.Key.W]) - { - MaterialScaleAndBiasAndShininess.Y += 0.01f; - Trace.WriteLine("Scale: " + MaterialScaleAndBiasAndShininess.X + " Bias: " + MaterialScaleAndBiasAndShininess.Y); - } - if (e.Keyboard[OpenTK.Input.Key.S]) - { - MaterialScaleAndBiasAndShininess.Y -= 0.01f; - Trace.WriteLine("Scale: " + MaterialScaleAndBiasAndShininess.X + " Bias: " + MaterialScaleAndBiasAndShininess.Y); - } - if (e.Keyboard[OpenTK.Input.Key.E]) - { - MaterialScaleAndBiasAndShininess.Z += 1f; - Trace.WriteLine("Shininess: " + MaterialScaleAndBiasAndShininess.Z); - } - if (e.Keyboard[OpenTK.Input.Key.D]) - { - MaterialScaleAndBiasAndShininess.Z -= 1f; - Trace.WriteLine("Shininess: " + MaterialScaleAndBiasAndShininess.Z); - } - } - - protected override void OnMouseMove(OpenTK.Input.MouseMoveEventArgs e) - { - base.OnMouseMove(e); - - LightPosition.X = (-(this.Width / 2) + e.Mouse.X) / 100f; - LightPosition.Y = ((this.Height / 2) - e.Mouse.Y) / 100f; - - EyePos.Y = e.Mouse.Wheel * 0.5f; - } - - /// Add your game logic here. - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame( FrameEventArgs e ) - { - base.OnUpdateFrame( e ); - } - - /// Add your game rendering code here. - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame( FrameEventArgs e ) - { - this.Title = "FPS: " + (1 / e.Time).ToString("0."); - - GL.Clear( ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit ); - - GL.UseProgram( ProgramObject ); - - #region Textures - - GL.ActiveTexture( TMU0_Unit ); - GL.BindTexture( TMU0_Target, TMU0_Handle ); - GL.ActiveTexture( TMU1_Unit ); - GL.BindTexture( TMU1_Target, TMU1_Handle ); - - #endregion Textures - - #region Uniforms - - // first Material's uniforms - GL.Uniform1( GL.GetUniformLocation( ProgramObject, "Material_DiffuseAndHeight" ), TMU0_UnitInteger ); - GL.Uniform1( GL.GetUniformLocation( ProgramObject, "Material_NormalAndGloss" ), TMU1_UnitInteger ); - GL.Uniform3( GL.GetUniformLocation( ProgramObject, "Material_ScaleBiasShininess" ), MaterialScaleAndBiasAndShininess.X, MaterialScaleAndBiasAndShininess.Y, MaterialScaleAndBiasAndShininess.Z ); - - // the rest are vectors - GL.Uniform3( GL.GetUniformLocation( ProgramObject, "Camera_Position" ), EyePos.X, EyePos.Y, EyePos.Z ); - GL.Uniform3( GL.GetUniformLocation( ProgramObject, "Light_Position" ), LightPosition.X, LightPosition.Y, LightPosition.Z ); - GL.Uniform3( GL.GetUniformLocation( ProgramObject, "Light_DiffuseColor" ), LightDiffuse.X, LightDiffuse.Y, LightDiffuse.Z ); - GL.Uniform3( GL.GetUniformLocation( ProgramObject, "Light_SpecularColor" ), LightSpecular.X, LightSpecular.Y, LightSpecular.Z ); - - #endregion Uniforms - - GL.PushMatrix( ); - Matrix4 t = Matrix4.LookAt( EyePos, Vector3.Zero, Vector3.UnitY ); - GL.MultMatrix(ref t); - - #region Draw Quad - - GL.Color3( 1f, 1f, 1f ); - - GL.Begin(PrimitiveType.Quads); - { - GL.Normal3( Normal ); - GL.VertexAttrib3( AttribTangent, ref Tangent ); - GL.MultiTexCoord2( TextureUnit.Texture0, 0f, 1f ); - GL.Vertex3( -1.0f, 1.0f, 0.0f ); - - GL.Normal3( Normal ); - GL.VertexAttrib3( AttribTangent, ref Tangent ); - GL.MultiTexCoord2( TextureUnit.Texture0, 0f, 0f ); - GL.Vertex3( -1.0f, -1.0f, 0.0f ); - - GL.Normal3( Normal ); - GL.VertexAttrib3( AttribTangent, ref Tangent ); - GL.MultiTexCoord2( TextureUnit.Texture0, 1f, 0f ); - GL.Vertex3( 1.0f, -1.0f, 0.0f ); - - GL.Normal3( Normal ); - GL.VertexAttrib3( AttribTangent, ref Tangent ); - GL.MultiTexCoord2( TextureUnit.Texture0, 1f, 1f ); - GL.Vertex3( 1.0f, 1.0f, 0.0f ); - } - GL.End( ); - - #endregion Draw Quad - - GL.UseProgram( 0 ); - - // visualize the light position 'somehow' - GL.Begin(PrimitiveType.Points); - { - GL.Color3( LightSpecular ); - GL.Vertex3( LightPosition ); - } - GL.End( ); - - GL.PopMatrix( ); - - this.SwapBuffers( ); - } - - /// Entry point - [STAThread] - public static void Main( ) - { - using ( T12_GLSL_Parallax example = new T12_GLSL_Parallax( ) ) - { - Utilities.SetWindowTitle( example ); - example.Run( 30.0, 0.0 ); - } - } - } -} diff --git a/Source/Examples/OpenGL/3.x/HelloGL3.cs b/Source/Examples/OpenGL/3.x/HelloGL3.cs deleted file mode 100644 index 0a9877a1..00000000 --- a/Source/Examples/OpenGL/3.x/HelloGL3.cs +++ /dev/null @@ -1,233 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.IO; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Tutorial -{ - [Example("OpenGL 3.0", ExampleCategory.OpenGL, "3.x", Documentation="HelloGL3")] - public class HelloGL3 : GameWindow - { - string vertexShaderSource = @" -#version 140 - -precision highp float; - -uniform mat4 projection_matrix; -uniform mat4 modelview_matrix; - -in vec3 in_position; -in vec3 in_normal; - -out vec3 normal; - -void main(void) -{ - //works only for orthogonal modelview - normal = (modelview_matrix * vec4(in_normal, 0)).xyz; - - gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1); -}"; - - string fragmentShaderSource = @" -#version 140 - -precision highp float; - -const vec3 ambient = vec3(0.1, 0.1, 0.1); -const vec3 lightVecNormalized = normalize(vec3(0.5, 0.5, 2.0)); -const vec3 lightColor = vec3(0.9, 0.9, 0.7); - -in vec3 normal; - -out vec4 out_frag_color; - -void main(void) -{ - float diffuse = clamp(dot(lightVecNormalized, normalize(normal)), 0.0, 1.0); - out_frag_color = vec4(ambient + diffuse * lightColor, 1.0); -}"; - - int vertexShaderHandle, - fragmentShaderHandle, - shaderProgramHandle, - modelviewMatrixLocation, - projectionMatrixLocation, - vaoHandle, - positionVboHandle, - normalVboHandle, - eboHandle; - - Vector3[] positionVboData = new Vector3[]{ - new Vector3(-1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, 1.0f, -1.0f), - new Vector3(-1.0f, 1.0f, -1.0f) }; - - int[] indicesVboData = new int[]{ - // front face - 0, 1, 2, 2, 3, 0, - // top face - 3, 2, 6, 6, 7, 3, - // back face - 7, 6, 5, 5, 4, 7, - // left face - 4, 0, 3, 3, 7, 4, - // bottom face - 0, 1, 5, 5, 4, 0, - // right face - 1, 5, 6, 6, 2, 1, }; - - Matrix4 projectionMatrix, modelviewMatrix; - - public HelloGL3() - : base(640, 480, - new GraphicsMode(), "OpenGL 3 Example", 0, - DisplayDevice.Default, 3, 2, - GraphicsContextFlags.ForwardCompatible | GraphicsContextFlags.Debug) - { } - - protected override void OnLoad (System.EventArgs e) - { - VSync = VSyncMode.On; - - CreateShaders(); - CreateVBOs(); - CreateVAOs(); - - // Other state - GL.Enable(EnableCap.DepthTest); - GL.ClearColor(System.Drawing.Color.MidnightBlue); - } - - void CreateShaders() - { - vertexShaderHandle = GL.CreateShader(ShaderType.VertexShader); - fragmentShaderHandle = GL.CreateShader(ShaderType.FragmentShader); - - GL.ShaderSource(vertexShaderHandle, vertexShaderSource); - GL.ShaderSource(fragmentShaderHandle, fragmentShaderSource); - - GL.CompileShader(vertexShaderHandle); - GL.CompileShader(fragmentShaderHandle); - - Debug.WriteLine(GL.GetShaderInfoLog(vertexShaderHandle)); - Debug.WriteLine(GL.GetShaderInfoLog(fragmentShaderHandle)); - - // Create program - shaderProgramHandle = GL.CreateProgram(); - - GL.AttachShader(shaderProgramHandle, vertexShaderHandle); - GL.AttachShader(shaderProgramHandle, fragmentShaderHandle); - - GL.BindAttribLocation(shaderProgramHandle, 0, "in_position"); - GL.BindAttribLocation(shaderProgramHandle, 1, "in_normal"); - - GL.LinkProgram(shaderProgramHandle); - Debug.WriteLine(GL.GetProgramInfoLog(shaderProgramHandle)); - GL.UseProgram(shaderProgramHandle); - - // Set uniforms - projectionMatrixLocation = GL.GetUniformLocation(shaderProgramHandle, "projection_matrix"); - modelviewMatrixLocation = GL.GetUniformLocation(shaderProgramHandle, "modelview_matrix"); - - float aspectRatio = ClientSize.Width / (float)(ClientSize.Height); - Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, aspectRatio, 1, 100, out projectionMatrix); - modelviewMatrix = Matrix4.LookAt(new Vector3(0, 3, 5), new Vector3(0, 0, 0), new Vector3(0, 1, 0)); - - GL.UniformMatrix4(projectionMatrixLocation, false, ref projectionMatrix); - GL.UniformMatrix4(modelviewMatrixLocation, false, ref modelviewMatrix); - } - - void CreateVBOs() - { - positionVboHandle = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); - GL.BufferData(BufferTarget.ArrayBuffer, - new IntPtr(positionVboData.Length * Vector3.SizeInBytes), - positionVboData, BufferUsageHint.StaticDraw); - - normalVboHandle = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, normalVboHandle); - GL.BufferData(BufferTarget.ArrayBuffer, - new IntPtr(positionVboData.Length * Vector3.SizeInBytes), - positionVboData, BufferUsageHint.StaticDraw); - - eboHandle = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, eboHandle); - GL.BufferData(BufferTarget.ElementArrayBuffer, - new IntPtr(sizeof(uint) * indicesVboData.Length), - indicesVboData, BufferUsageHint.StaticDraw); - - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); - } - - void CreateVAOs() - { - // GL3 allows us to store the vertex layout in a "vertex array object" (VAO). - // This means we do not have to re-issue VertexAttribPointer calls - // every time we try to use a different vertex layout - these calls are - // stored in the VAO so we simply need to bind the correct VAO. - vaoHandle = GL.GenVertexArray(); - GL.BindVertexArray(vaoHandle); - - GL.EnableVertexAttribArray(0); - GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); - GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); - - GL.EnableVertexAttribArray(1); - GL.BindBuffer(BufferTarget.ArrayBuffer, normalVboHandle); - GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); - - GL.BindBuffer(BufferTarget.ElementArrayBuffer, eboHandle); - - GL.BindVertexArray(0); - } - - protected override void OnUpdateFrame(FrameEventArgs e) - { - Matrix4 rotation = Matrix4.CreateRotationY((float)e.Time); - Matrix4.Mult(ref rotation, ref modelviewMatrix, out modelviewMatrix); - GL.UniformMatrix4(modelviewMatrixLocation, false, ref modelviewMatrix); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - Exit(); - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.BindVertexArray(vaoHandle); - GL.DrawElements(PrimitiveType.Triangles, indicesVboData.Length, - DrawElementsType.UnsignedInt, IntPtr.Zero); - - SwapBuffers(); - } - - [STAThread] - public static void Main() - { - using (HelloGL3 example = new HelloGL3()) - { - Utilities.SetWindowTitle(example); - example.Run(30); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenGLES/1.1/SimpleWindow.cs b/Source/Examples/OpenGLES/1.1/SimpleWindow.cs deleted file mode 100644 index c599f023..00000000 --- a/Source/Examples/OpenGLES/1.1/SimpleWindow.cs +++ /dev/null @@ -1,186 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region Using Directives - -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using System.Threading; -using System.Drawing; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.ES11; - -#endregion - -namespace Examples.Tutorial -{ -#if EXPERIMENTAL - [Example("Immediate mode", ExampleCategory.OpenGLES, "1.1", Documentation = "SimpleES11Window")] - public class SimpleES11Window : GameWindow - { - #region --- Fields --- - - float rotation_speed = 3.0f; - float angle; - - #endregion - - #region --- Constructor --- - - public SimpleES11Window() - : base(800, 600, new GraphicsMode(16, 16), "", GameWindowFlags.Default, DisplayDevice.Default, 2, 0, GraphicsContextFlags.Embedded) - { } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - Color4 color = Color4.MidnightBlue; - GL.ClearColor(color.R, color.G, color.B, color.A); - GL.Enable((All)EnableCap.DepthTest); - } - - #endregion - - #region OnResize - - /// - /// Called when the user resizes the window. - /// - /// Contains the new width/height of the window. - /// - /// You want the OpenGL viewport to match the window. This is the place to do it! - /// - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - double aspect_ratio = Width / (double)Height; - - OpenTK.Matrix4 perspective = OpenTK.Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)aspect_ratio, 1, 64); - GL.MatrixMode((All)MatrixMode.Projection); - GL.LoadMatrix(ref perspective.Row0.X); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Prepares the next frame for rendering. - /// - /// - /// Place your control logic here. This is the place to respond to user input, - /// update object positions etc. - /// - protected override void OnUpdateFrame(FrameEventArgs e) - { - if (Keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - return; - } - } - - #endregion - - #region OnRenderFrame - - /// - /// Place your rendering code here. - /// - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear((uint)(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit)); - - Matrix4 lookat = Matrix4.LookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); - GL.MatrixMode((All)MatrixMode.Modelview); - GL.LoadMatrix(ref lookat.Row0.X); - - angle += rotation_speed * (float)e.Time; - GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - - DrawCube(); - - this.SwapBuffers(); - } - - #endregion - - #region private void DrawCube() - - private void DrawCube() - { -#if false - GL.Begin(BeginMode.Quads); - - GL.Color3(Color.Silver); - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, -1.0f); - - GL.Color3(Color.Honeydew); - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - - GL.Color3(Color.Moccasin); - - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - - GL.Color3(Color.IndianRed); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - - GL.Color3(Color.PaleVioletRed); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - - GL.Color3(Color.ForestGreen); - GL.Vertex3(1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - - GL.End(); -#endif - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (SimpleES11Window example = new SimpleES11Window()) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -#endif -} diff --git a/Source/Examples/OpenGLES/2.0/SimpleWindow20.cs b/Source/Examples/OpenGLES/2.0/SimpleWindow20.cs deleted file mode 100644 index c1470705..00000000 --- a/Source/Examples/OpenGLES/2.0/SimpleWindow20.cs +++ /dev/null @@ -1,134 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region Using Directives - -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using System.Threading; -using System.Drawing; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.ES20; - -#endregion - -namespace Examples.Tutorial -{ - [Example("Simple ES 2.0", ExampleCategory.OpenGLES, "2.0", Documentation = "SimpleES20Window")] - public class SimpleES20Window : GameWindow - { - #region Constructor - - public SimpleES20Window(GraphicsContextFlags flags) - : base(800, 600, GraphicsMode.Default, "", GameWindowFlags.Default, DisplayDevice.Default, 2, 0, flags) - { } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - Color4 color = Color4.MidnightBlue; - GL.ClearColor(color.R, color.G, color.B, color.A); - GL.Enable(EnableCap.DepthTest); - } - - #endregion - - #region OnResize - - /// - /// Called when the user resizes the window. - /// - /// Contains the new width/height of the window. - /// - /// You want the OpenGL viewport to match the window. This is the place to do it! - /// - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Prepares the next frame for rendering. - /// - /// - /// Place your control logic here. This is the place to respond to user input, - /// update object positions etc. - /// - protected override void OnUpdateFrame(FrameEventArgs e) - { - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - { - this.Exit(); - return; - } - } - - #endregion - - #region OnRenderFrame - - /// - /// Place your rendering code here. - /// - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - this.SwapBuffers(); - } - - #endregion - - #region private void DrawCube() - - private void DrawCube() - { - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - SimpleES20Window example; - try - { - example = new SimpleES20Window(GraphicsContextFlags.Embedded); - } - catch - { - example = new SimpleES20Window(GraphicsContextFlags.Default); - } - - if (example != null) - { - using (example) - { - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenGLES/SimpleWindow20.cs b/Source/Examples/OpenGLES/SimpleWindow20.cs deleted file mode 100644 index e69de29b..00000000 diff --git a/Source/Examples/OpenTK.Examples.csproj b/Source/Examples/OpenTK.Examples.csproj deleted file mode 100644 index 68cf447d..00000000 --- a/Source/Examples/OpenTK.Examples.csproj +++ /dev/null @@ -1,688 +0,0 @@ - - - - Local - 8.0.30703 - 2.0 - {868E37B3-0000-0000-0000-000000000000} - Debug - AnyCPU - Resources\App.ico - - - Examples - JScript - Grid - IE50 - false - WinExe - - - OpenTK.Examples - Examples.Program - - - - - 2.0 - - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - True - 285212672 - - - DEBUG;TRACE; - True - 4096 - False - ..\..\Binaries\OpenTK\Debug\ - False - False - 4 - AllRules.ruleset - full - - - True - 285212672 - - - TRACE; - 4096 - True - ..\..\Binaries\OpenTK\Release\ - False - False - 4 - AllRules.ruleset - pdbonly - true - - - ..\..\Binaries\OpenTK\Release\ - none - 4 - True - TRACE; - true - - - True - 285212672 - - - TRACE; - 4096 - True - ..\..\Binaries\OpenTK\Release\ - False - False - 4 - AllRules.ruleset - none - - - True - - - ..\..\OpenTK.snk - - - app.manifest - - - - System - - - System.Data - - - System.Drawing - - - System.Windows.Forms - - - System.Xml - - - - - - - - - - OpenTK - {A37A7E14-0000-0000-0000-000000000000} - - - {A625BE88-0000-0000-0000-000000000000} - OpenTK.GLControl - - - {A625BE87-0000-0000-0000-000000000000} - OpenTK.GLWidget - - - - - Properties\GlobalAssemblyInfo.cs - - - - Code - - - - Code - - - - - - Code - - - Code - - - Code - - - Code - - - Form - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Form - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Form - - - Code - - - Form - - - UserControl - - - Form - - - Form - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Form - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ExampleBrowser.cs - - - ExampleBrowser.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - Parrot.cs - - - Parrot.cs - - - FontRenderingBasic.cs - - - FontRenderingBasic.cs - - - MultipleGLControls.cs - - - MultipleGLControls.cs - - - GLControlGameLoop.cs - - - GLControlGameLoop.cs - - - GLControlSimple.cs - - - GLControlSimple.cs - - - DerivedGLControl.cs - - - DerivedGLControl.cs - - - Extensions.cs - - - Extensions.cs - - - OpenTK.snk - - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - - - - - - - Always - - - Code - - - - Dependencies\x86\libSDL2.dylib - - - Dependencies\x64\libSDL2.dylib - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dependencies\openal.COPYING.txt - - - Dependencies\SDL2.COPYING.txt - - - Dependencies\x64\openal32.dll - SDL2.dll - - - Dependencies\x64\SDL2.dll - - - Dependencies\x86\openal32.dll - - - Dependencies\x86\SDL2.dll - - - - - - - - - - - true - full - false - ..\..\Binaries\OpenTK\Debug\ - DEBUG;TRACE; - 4 - true - AllRules.ruleset - False - 285212672 - 4096 - False - - - - - true - pdbonly - true - ..\..\Binaries\OpenTK\Release\ - TRACE; - 4 - true - AllRules.ruleset - False - 285212672 - 4096 - False - - - - - - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/Fonts/FontRenderingAdvanced.cs b/Source/Examples/OpenTK/Fonts/FontRenderingAdvanced.cs deleted file mode 100644 index cf82eb21..00000000 --- a/Source/Examples/OpenTK/Fonts/FontRenderingAdvanced.cs +++ /dev/null @@ -1,161 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Drawing; -using System.Diagnostics; - -using OpenTK; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.Tutorial -{ -#if false - /// - /// Shows how to render and scroll large amounts of text. - /// - [Example("Font rendering (advanced)", ExampleCategory.OpenTK, "Fonts", 2, Documentation="FontRenderingAdvanced")] - public class FontRenderingAdvanced : GameWindow - { - Font serif = new Font(FontFamily.GenericSerif, 16.0f); - Font sans = new Font(FontFamily.GenericSansSerif, 18.0f); - TextPrinter text = new TextPrinter(); - - string poem = new StreamReader("Data/Poem.txt").ReadToEnd(); - int lines; // How many lines the poem contains. - - float scroll_speed; - float initial_position; - float wraparound_position; - float current_position; - - public FontRenderingAdvanced() - : base(800, 600) - { } - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - - current_position = initial_position; - scroll_speed = -1.0f; - - // Count the amount of lines in the text, to find out the correct - // warparound position. We want the text to scroll until the last - // line moves outside the screen, then warp it around from the - // other side of the screen. - foreach (char c in poem) - if (c == '\n') - lines++; - - wraparound_position = -(lines + 1) * serif.Height; - } - - #endregion - - #region OnUnload - - public override void OnUnload(EventArgs e) - { - if (serif != null) - serif.Dispose(); - if (sans != null) - sans.Dispose(); - } - - #endregion - - #region OnResize - - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - initial_position = Height + serif.Height; // Start one line below the screen. - wraparound_position = -(lines + 1) * serif.Height; - } - - #endregion - - #region OnUpdateFrame - - protected override void OnUpdateFrame(FrameEventArgs e) - { - if (Keyboard[Key.Space]) - scroll_speed = 0; - if (Keyboard[Key.Down]) - scroll_speed += 10; - if (Keyboard[Key.Up]) - scroll_speed -= 10; - if (Keyboard[Key.Escape]) - this.Exit(); - } - - #endregion - - #region OnRenderFrame - - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit); - - // We'll start printing from the lower left corner of the screen. The text - // will slowly move updwards - the user can control the movement speed with - // the keyboard arrows and the space bar. - current_position += scroll_speed * (float)e.Time; - if (scroll_speed > 0.0f && current_position > initial_position) - current_position = wraparound_position; - else if (scroll_speed < 0.0f && current_position < wraparound_position) - current_position = initial_position; - - // TextPrinter.Begin() sets up a 2d orthographic projection, with the x axis - // moving from 0 to viewport.Width (left to right) and the y axis from - // 0 to viewport.Height (top to bottom). This is the typical coordinate system - // used in 2d graphics, and is necessary for achieving pixel-perfect glyph rendering. - // TextPrinter.End() restores your previous projection/modelview matrices. - text.Begin(); - - // Print FPS counter. Since the counter changes per frame, - // it shouldn't be cached (TextPrinterOptions.NoCache). - text.Print((1.0 / e.Time).ToString("F2"), sans, Color.SpringGreen, new RectangleF(0, 0, Width, 0), TextPrinterOptions.NoCache, TextAlignment.Far); - - // Print the actual text. - GL.Translate(0, current_position, 0); - text.Print(poem, serif, Color.White, new RectangleF(Width / 2, 0, Width / 2, 0), TextPrinterOptions.Default, TextAlignment.Far); - text.Print(poem, serif, Color.White, new RectangleF(0, 0, Width / 2, 0)); - - text.End(); - - SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (FontRenderingAdvanced example = new FontRenderingAdvanced()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); - example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - example.Run(30.0, 0.0); - } - } - - #endregion - } -#endif -} diff --git a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.Designer.cs b/Source/Examples/OpenTK/Fonts/FontRenderingBasic.Designer.cs deleted file mode 100644 index 2217ad7b..00000000 --- a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.Designer.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace Examples.WinForms -{ - partial class FontRenderingBasic - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.glControl1 = new OpenTK.GLControl(); - this.changeFont = new System.Windows.Forms.Button(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.fontDialog = new System.Windows.Forms.FontDialog(); - this.SuspendLayout(); - // - // glControl1 - // - this.glControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.glControl1.BackColor = System.Drawing.Color.Black; - this.glControl1.Location = new System.Drawing.Point(0, 40); - this.glControl1.Name = "glControl1"; - this.glControl1.Size = new System.Drawing.Size(700, 521); - this.glControl1.TabIndex = 0; - this.glControl1.VSync = false; - this.glControl1.Load += new System.EventHandler(this.glControl1_Load); - this.glControl1.Paint += new System.Windows.Forms.PaintEventHandler(this.glControl1_Paint); - this.glControl1.Resize += new System.EventHandler(this.glControl1_Resize); - // - // changeFont - // - this.changeFont.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.changeFont.Location = new System.Drawing.Point(568, 10); - this.changeFont.Name = "changeFont"; - this.changeFont.Size = new System.Drawing.Size(120, 23); - this.changeFont.TabIndex = 1; - this.changeFont.Text = "Change Font"; - this.changeFont.UseVisualStyleBackColor = true; - this.changeFont.Click += new System.EventHandler(this.changeFont_Click); - // - // textBox1 - // - this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textBox1.Location = new System.Drawing.Point(12, 11); - this.textBox1.Name = "textBox1"; - this.textBox1.Size = new System.Drawing.Size(550, 22); - this.textBox1.TabIndex = 2; - this.textBox1.Text = "The quick brown fox jumped over the lazy dogs. 0123456789"; - this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); - // - // FontRendering - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(700, 561); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.changeFont); - this.Controls.Add(this.glControl1); - this.Name = "FontRendering"; - this.Text = "FontRendering"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private OpenTK.GLControl glControl1; - private System.Windows.Forms.Button changeFont; - private System.Windows.Forms.TextBox textBox1; - private System.Windows.Forms.FontDialog fontDialog; - } -} \ No newline at end of file diff --git a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.cs b/Source/Examples/OpenTK/Fonts/FontRenderingBasic.cs deleted file mode 100644 index ad6de379..00000000 --- a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.cs +++ /dev/null @@ -1,132 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.WinForms -{ - [Example("Font rendering (basic)", ExampleCategory.OpenTK, "Fonts", Difficulty = 1, Documentation = "FontRenderingBasic", Visible=false)] - public partial class FontRenderingBasic : Form - { - #region Fields - - float[] sizes = new float[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 24 }; - List fonts = new List(); - - //TextPrinter printer = new TextPrinter(); - - #endregion - - #region Constructors - - public FontRenderingBasic() - { - InitializeComponent(); - ResizeRedraw = true; - - glControl1.Width = ClientSize.Width; - glControl1.Height = ClientSize.Height; - - UpdateFontList(fontDialog.Font); - glControl1_Resize(this, EventArgs.Empty); - } - - #endregion - - #region Private Members - - void UpdateFontList(Font base_font) - { - //printer.Clear(); - - foreach (Font font in fonts) - font.Dispose(); - fonts.Clear(); - foreach (float size in sizes) - fonts.Add(new Font(base_font.Name, base_font.SizeInPoints + size, base_font.Style)); - } - - #endregion - - #region Events - - private void glControl1_Load(object sender, EventArgs e) - { - glControl1.MakeCurrent(); - } - - private void changeFont_Click(object sender, EventArgs e) - { - if (fontDialog.ShowDialog() == DialogResult.OK) - { - UpdateFontList(fontDialog.Font); - glControl1.Invalidate(); - } - } - - private void textBox1_TextChanged(object sender, EventArgs e) - { - glControl1.Invalidate(); - } - - private void glControl1_Paint(object sender, PaintEventArgs e) - { - glControl1.MakeCurrent(); - GL.ClearColor(Color.MidnightBlue); - GL.Clear(ClearBufferMask.ColorBufferBit); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(0, glControl1.ClientSize.Width, glControl1.ClientSize.Height, 0, -1, 1); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - - foreach (Font font in fonts) - { - //printer.Print(textBox1.Text, font, Color.White); - GL.Translate(0, font.Height + 5, 0); - } - - glControl1.SwapBuffers(); - } - - private void glControl1_Resize(object sender, EventArgs e) - { - glControl1.MakeCurrent(); - - if (glControl1.ClientSize.Height == 0) - glControl1.ClientSize = new System.Drawing.Size(glControl1.ClientSize.Width, 1); - - GL.Viewport(0, 0, glControl1.ClientSize.Width, glControl1.ClientSize.Height); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (FontRenderingBasic example = new FontRenderingBasic()) - { - Utilities.SetWindowTitle(example); - example.ShowDialog(); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.resx b/Source/Examples/OpenTK/Fonts/FontRenderingBasic.resx deleted file mode 100644 index cf80c422..00000000 --- a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/Fonts/FontRenderingBasic.rtf b/Source/Examples/OpenTK/Fonts/FontRenderingBasic.rtf deleted file mode 100644 index c0233ee2567005c654e046ce79f61d32cebc79ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3263 zcmcIm(Qex|6y0;b;=a`>9M!U&ZdkB~u3NL94O%QIh5-T!TB0N_G^vnOTqDT8?_5f< z<-`x`!+^lC$xHIwbI(2GL*_!6X2N(CKk}wZ=VyzokYzdJPc2N9&KC2Bth6SCmByD@ zR{D+dJ}Vn{H_ytv7S78sqqj~8eg24$bQf}D5=;8^{bc$keaK#Ar4eg6Y!dgP3n%4m z+;Op6ba3c@S-Q;1wJoGG5ip?bFuk+JTP^(g8q@gMmiC!qbpwqS*So~$udpm_&b~ZbpDv#E4jH$2rcm-MH+Yn790 zX@ZXo0QElf1}G1(Ac+R70jQx*_;&G;(j=YYkU&A)A_Gy}3ll^oITr>e-4F?yyaEM` zUacEv?1AprM_$Ig3v`3ZvfTqoCoWrXwjlS_*{a#bo+s*m{1 zi47)`C_F~;Wc(dBMnZqvHrClT0Za+4xBXUI9HzzAf@ddl0Ijr~q6(nd(VCO$XJIFm zr-@9egdFG(r@@|TSwa(zP=TOwp-&xo@Elqtj>>AI4_ zw*bVX_Jpmwp%#A z;jv9^(Pro{CYmn8(~hZRAd%-ScOVra2x!|eZw!W+z4&rTQg_Y3bnOg+n@Knso@?V* zSt%1!<)T6?zsG+==Kd)Ln0VVn_MIHW*r;z(pElB!sO%J{!Z2H|f8T9L9i?`VUgbms zFCg^JKZxa!wLre$(L~)LIe-pB$K~)5aF=vG)Q939D%#Z|Y#Y`C`$lf9Ls^&`A5}e= z5rz~xb>sugmsTq$9DCNpLT4bMhY)Pj=`FVoem(5s(S_1<1(b#b!UzOxgZ-*NdvFHM zwpAU`-+Z8r(weljx1o3QRG{()QG7OAh z$BO+zMs7HbBTJCm!LrHGu=irE^p=S@2u?2eI#&5LUN+bGQcfv-lgv(bnI0Z^IdYhT zeL9Mp-ibT7qu5Em;gEbEn8d~#CWpc3)RWTTk>kIjp}u;F7ATS%+d1^)WEyomeNIR; z;O9wR^VSu=kxUO{I17!=$Ct}a7LXF(tCuCgq#<2j^EKDq18m-~hP*|`ub($B8|9P= zDBH4ULG+{iyF}TI#)IrK@jgR%cjpCeqt!OLfHHj5#v2%5VEcHSG%yhQOBJDx3;&RO zH%w{W>Yy6UHx)15*aUAQ2g8kTmcwQ_Ea=5YW{Z-mXh2tZ{YClE{&zS3dFNFlY0$9x zqZP$v?C!7~s)=>;UBD;yy~%-MPVwNtU;H;r;K929iE-@MIeS#cQ8IqbJRMv76y)gA z8$96{Hv=}bWJ<|3mufOkX7swN172(K$54uN-#o0OL1&$&*^K@_UH9T00E5i#5%~Dx GhkpU|Q)L(c diff --git a/Source/Examples/OpenTK/GLControl/DerivedGLControl.Designer.cs b/Source/Examples/OpenTK/GLControl/DerivedGLControl.Designer.cs deleted file mode 100644 index 3c6aecad..00000000 --- a/Source/Examples/OpenTK/GLControl/DerivedGLControl.Designer.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace Examples.WinForms -{ - partial class DerivedGLControl - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GLControl/DerivedGLControl.cs b/Source/Examples/OpenTK/GLControl/DerivedGLControl.cs deleted file mode 100644 index 9ea8e6e2..00000000 --- a/Source/Examples/OpenTK/GLControl/DerivedGLControl.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Text; -using System.Windows.Forms; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.WinForms -{ - public partial class DerivedGLControl : GLControl - { - Color clearColor; - - public DerivedGLControl() - { - this.InitializeComponent(); - } - - public Color ClearColor - { - get { return clearColor; } - set - { - clearColor = value; - - if (!this.DesignMode) - { - MakeCurrent(); - GL.ClearColor(clearColor); - } - } - } - - protected override void OnPaint(PaintEventArgs e) - { - base.OnPaint(e); - - if (!this.DesignMode) - { - MakeCurrent(); - GL.Clear(ClearBufferMask.ColorBufferBit); - SwapBuffers(); - } - } - } -} diff --git a/Source/Examples/OpenTK/GLControl/DerivedGLControl.resx b/Source/Examples/OpenTK/GLControl/DerivedGLControl.resx deleted file mode 100644 index 19dc0dd8..00000000 --- a/Source/Examples/OpenTK/GLControl/DerivedGLControl.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLControl/GLControlGameLoop.Designer.cs b/Source/Examples/OpenTK/GLControl/GLControlGameLoop.Designer.cs deleted file mode 100644 index c84b7444..00000000 --- a/Source/Examples/OpenTK/GLControl/GLControlGameLoop.Designer.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace Examples.WinForms -{ - partial class GameLoopForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.glControl = new OpenTK.GLControl(); - this.SuspendLayout(); - // - // glControl - // - this.glControl.BackColor = System.Drawing.Color.Black; - this.glControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.glControl.Location = new System.Drawing.Point(0, 0); - this.glControl.Name = "glControl"; - this.glControl.Size = new System.Drawing.Size(784, 564); - this.glControl.TabIndex = 0; - this.glControl.VSync = false; - // - // W02_Immediate_Mode_Cube - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(784, 564); - this.Controls.Add(this.glControl); - this.Name = "W02_Immediate_Mode_Cube"; - this.Text = "Cube"; - this.ResumeLayout(false); - - } - - #endregion - - private OpenTK.GLControl glControl; - } -} \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLControl/GLControlGameLoop.cs b/Source/Examples/OpenTK/GLControl/GLControlGameLoop.cs deleted file mode 100644 index 0ee55fb5..00000000 --- a/Source/Examples/OpenTK/GLControl/GLControlGameLoop.cs +++ /dev/null @@ -1,243 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -#region --- Using directives --- - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Diagnostics; -using System.Threading; - -using OpenTK.Graphics.OpenGL; -using OpenTK.Platform; -using OpenTK; - -#endregion - -namespace Examples.WinForms -{ - [Example("Simple GLControl Game Loop", ExampleCategory.OpenTK, "GLControl", 2, Documentation="GLControlGameLoop")] - public partial class GameLoopForm : Form - { - static float angle = 0.0f; - - #region --- Constructor --- - - public GameLoopForm() - { - InitializeComponent(); - } - - #endregion - - #region OnLoad - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - glControl.KeyDown += new KeyEventHandler(glControl_KeyDown); - glControl.KeyUp += new KeyEventHandler(glControl_KeyUp); - glControl.Resize += new EventHandler(glControl_Resize); - glControl.Paint += new PaintEventHandler(glControl_Paint); - - Text = - GL.GetString(StringName.Vendor) + " " + - GL.GetString(StringName.Renderer) + " " + - GL.GetString(StringName.Version); - - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - - Application.Idle += Application_Idle; - - // Ensure that the viewport and projection matrix are set correctly. - glControl_Resize(glControl, EventArgs.Empty); - } - - void glControl_KeyUp(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.F12) - { - GrabScreenshot().Save("screenshot.png"); - } - } - - #endregion - - #region OnClosing - - protected override void OnClosing(CancelEventArgs e) - { - Application.Idle -= Application_Idle; - - base.OnClosing(e); - } - - #endregion - - #region Application_Idle event - - void Application_Idle(object sender, EventArgs e) - { - while (glControl.IsIdle) - { - Render(); - } - } - - #endregion - - #region GLControl.Resize event handler - - void glControl_Resize(object sender, EventArgs e) - { - OpenTK.GLControl c = sender as OpenTK.GLControl; - - if (c.ClientSize.Height == 0) - c.ClientSize = new System.Drawing.Size(c.ClientSize.Width, 1); - - GL.Viewport(0, 0, c.ClientSize.Width, c.ClientSize.Height); - - float aspect_ratio = Width / (float)Height; - Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 64); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perpective); - } - - #endregion - - #region GLControl.KeyDown event handler - - void glControl_KeyDown(object sender, KeyEventArgs e) - { - switch (e.KeyData) - { - case Keys.Escape: - this.Close(); - break; - } - } - - #endregion - - #region GLControl.Paint event handler - - void glControl_Paint(object sender, PaintEventArgs e) - { - Render(); - } - - #endregion - - #region private void Render() - - private void Render() - { - Matrix4 lookat = Matrix4.LookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadMatrix(ref lookat); - - GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - angle += 0.5f; - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - DrawCube(); - - glControl.SwapBuffers(); - } - - #endregion - - #region private void DrawCube() - - private void DrawCube() - { - GL.Begin(PrimitiveType.Quads); - - GL.Color3(Color.Silver); - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, -1.0f); - - GL.Color3(Color.Honeydew); - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - - GL.Color3(Color.Moccasin); - - GL.Vertex3(-1.0f, -1.0f, -1.0f); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - - GL.Color3(Color.IndianRed); - GL.Vertex3(-1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - - GL.Color3(Color.PaleVioletRed); - GL.Vertex3(-1.0f, 1.0f, -1.0f); - GL.Vertex3(-1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - - GL.Color3(Color.ForestGreen); - GL.Vertex3(1.0f, -1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, -1.0f); - GL.Vertex3(1.0f, 1.0f, 1.0f); - GL.Vertex3(1.0f, -1.0f, 1.0f); - - GL.End(); - } - - #endregion - - #region private void GrabScreenshot() - - Bitmap GrabScreenshot() - { - Bitmap bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); - System.Drawing.Imaging.BitmapData data = - bmp.LockBits(this.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly, - System.Drawing.Imaging.PixelFormat.Format24bppRgb); - GL.ReadPixels(0, 0, this.ClientSize.Width, this.ClientSize.Height, PixelFormat.Bgr, PixelType.UnsignedByte, - data.Scan0); - bmp.UnlockBits(data); - bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); - return bmp; - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (GameLoopForm example = new GameLoopForm()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); - example.Text = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - example.ShowDialog(); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GLControl/GLControlGameLoop.resx b/Source/Examples/OpenTK/GLControl/GLControlGameLoop.resx deleted file mode 100644 index 19dc0dd8..00000000 --- a/Source/Examples/OpenTK/GLControl/GLControlGameLoop.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLControl/GLControlSimple.Designer.cs b/Source/Examples/OpenTK/GLControl/GLControlSimple.Designer.cs deleted file mode 100644 index 2d520900..00000000 --- a/Source/Examples/OpenTK/GLControl/GLControlSimple.Designer.cs +++ /dev/null @@ -1,110 +0,0 @@ -namespace Examples.WinForms -{ - partial class SimpleForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.redButton = new System.Windows.Forms.Button(); - this.greenButton = new System.Windows.Forms.Button(); - this.blueButton = new System.Windows.Forms.Button(); - this.glControl1 = new OpenTK.GLControl(); - this.SuspendLayout(); - // - // redButton - // - this.redButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.redButton.Location = new System.Drawing.Point(1278, 25); - this.redButton.Margin = new System.Windows.Forms.Padding(6); - this.redButton.Name = "redButton"; - this.redButton.Size = new System.Drawing.Size(266, 44); - this.redButton.TabIndex = 1; - this.redButton.Text = "Red"; - this.redButton.UseVisualStyleBackColor = true; - this.redButton.Click += new System.EventHandler(this.redButton_Click); - // - // greenButton - // - this.greenButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.greenButton.Location = new System.Drawing.Point(1278, 83); - this.greenButton.Margin = new System.Windows.Forms.Padding(6); - this.greenButton.Name = "greenButton"; - this.greenButton.Size = new System.Drawing.Size(266, 44); - this.greenButton.TabIndex = 2; - this.greenButton.Text = "Green"; - this.greenButton.UseVisualStyleBackColor = true; - this.greenButton.Click += new System.EventHandler(this.greenButton_Click); - // - // blueButton - // - this.blueButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.blueButton.Location = new System.Drawing.Point(1278, 140); - this.blueButton.Margin = new System.Windows.Forms.Padding(6); - this.blueButton.Name = "blueButton"; - this.blueButton.Size = new System.Drawing.Size(266, 44); - this.blueButton.TabIndex = 3; - this.blueButton.Text = "Blue"; - this.blueButton.UseVisualStyleBackColor = true; - this.blueButton.Click += new System.EventHandler(this.blueButton_Click); - // - // glControl1 - // - this.glControl1.BackColor = System.Drawing.SystemColors.ControlDark; - this.glControl1.Dock = System.Windows.Forms.DockStyle.Fill; - this.glControl1.Location = new System.Drawing.Point(0, 0); - this.glControl1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6); - this.glControl1.Name = "glControl1"; - this.glControl1.Size = new System.Drawing.Size(1562, 1085); - this.glControl1.TabIndex = 4; - this.glControl1.VSync = false; - this.glControl1.Paint += new System.Windows.Forms.PaintEventHandler(this.glControl1_Paint); - this.glControl1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.glControl1_KeyDown); - this.glControl1.Resize += new System.EventHandler(this.glControl1_Resize); - // - // SimpleForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1562, 1085); - this.Controls.Add(this.blueButton); - this.Controls.Add(this.greenButton); - this.Controls.Add(this.redButton); - this.Controls.Add(this.glControl1); - this.Margin = new System.Windows.Forms.Padding(6); - this.Name = "SimpleForm"; - this.Text = "OpenTK Windows Forms Tutorial 01 - Your first window"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button redButton; - private System.Windows.Forms.Button greenButton; - private System.Windows.Forms.Button blueButton; - private OpenTK.GLControl glControl1; - } -} diff --git a/Source/Examples/OpenTK/GLControl/GLControlSimple.cs b/Source/Examples/OpenTK/GLControl/GLControlSimple.cs deleted file mode 100644 index f73b2e0b..00000000 --- a/Source/Examples/OpenTK/GLControl/GLControlSimple.cs +++ /dev/null @@ -1,94 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Drawing; -using System.Windows.Forms; - -using OpenTK.Graphics.OpenGL; - -namespace Examples.WinForms -{ - [Example("GLControl Simple", ExampleCategory.OpenTK, "GLControl", 1, Documentation="GLControlSimple")] - public partial class SimpleForm : Form - { - public SimpleForm() - { - InitializeComponent(); - } - - #region Events - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - glControl1_Resize(this, EventArgs.Empty); // Ensure the Viewport is set up correctly - GL.ClearColor(Color.Crimson); - } - - private void redButton_Click(object sender, EventArgs e) - { - GL.ClearColor(Color.Crimson); - glControl1.Invalidate(); - } - - private void greenButton_Click(object sender, EventArgs e) - { - GL.ClearColor(Color.ForestGreen); - glControl1.Invalidate(); - } - - private void blueButton_Click(object sender, EventArgs e) - { - GL.ClearColor(Color.RoyalBlue); - glControl1.Invalidate(); - } - - private void glControl1_Paint(object sender, PaintEventArgs e) - { - glControl1.MakeCurrent(); - - GL.Clear(ClearBufferMask.ColorBufferBit); - glControl1.SwapBuffers(); - } - - private void glControl1_Resize(object sender, EventArgs e) - { - if (glControl1.ClientSize.Height == 0) - glControl1.ClientSize = new System.Drawing.Size(glControl1.ClientSize.Width, 1); - - GL.Viewport(0, 0, glControl1.ClientSize.Width, glControl1.ClientSize.Height); - } - - private void glControl1_KeyDown(object sender, KeyEventArgs e) - { - switch (e.KeyData) - { - case Keys.Escape: - this.Close(); - break; - } - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (SimpleForm example = new SimpleForm()) - { - Utilities.SetWindowTitle(example); - example.ShowDialog(); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GLControl/GLControlSimple.resx b/Source/Examples/OpenTK/GLControl/GLControlSimple.resx deleted file mode 100644 index 19dc0dd8..00000000 --- a/Source/Examples/OpenTK/GLControl/GLControlSimple.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLControl/GLControlSimple.rtf b/Source/Examples/OpenTK/GLControl/GLControlSimple.rtf deleted file mode 100644 index 425d8844d234f406bfc89f0aa0f787f39982c7ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1767 zcmZuy-*4MC5Z-hCihE3o#<1*W=#Zy2STh3|7NA}GBA}qilSG6fHIlOH1^M6mk&bM}8)Iegur6z>OZ@4Ob~ z_T}Z`xs=X0k21O~J*(o^ZP|EcyD7@b47@3BQ_-ukVar}b=jqQ-M^-x0&FW3D+TibI z{oCzJxz~Jn(pJ4G2U(Q8@T!zRXM}Bv^>$lUWgRweX=kH%YLHPoTUJ08Hk(v^k$*n5 zI#3W@ZxD6?<))740G^9eN{<0Zr4{@rcA|9dN|ecz>Eq!YUL%A*zNLQ8bme zpvidVd4@DBJY{uPOMVL)l(-H$iVAF_Bd=u(I(xS9x)OmE-T%D{86zsCcOhH@X{-~< z1Vr1&&8W|TjiG~%?O6iR_eM*RgboQUNnuHt;HYAPSZb<&{6POH9RidAX=th3A!I%O zZ~^B>^%r!$v>MQn1>oxePftvAGOz=Wd`8>B4dJZ%IQOjSWq_QPzrm>N{1yCNV$U9W z{%6phf8H=NldXn!AQvNh>X8oUB&_6Vp6Ga_v>-62a*9hBom$574jMj@v)S8|=Z>&T zv*VSJPmOm29LatY2Iuk<#c|@J=Md=kAPL`P?wbN5jYD$B)+q-3O~;==+|8P1NB<9W zxjF}t^1|301*empY0zmo6bId4pAjJXtivD-eT;+BZbk1>BvTACGN%}1j6n>h7dE9c zCkl%Z)3(md7Lbb-eM-dg`eM}+U13bX^6QA3NB_%ruIrseuW)&ls?n(9*gAwd&~(`V ze09uo=NVJ#=O!bl6wuc{tmyl3ITx5VBc{eoRu^9%1@>oLH-eeUBtf7Xkfz;eapUdr z>SQ7!$_gX%{&?=waaNFw;<3k~85%pzy$%{HS#blAK_j(IM%+KF?$Xt8d6miFCK}@@ zaz*NX8o2s+5dHh1uGuG*&bP>R~zC$?cg;B(KRPwlZD=SvaFNY~-}UXRy??mGNi NL76!&sJ>kM@*O~PdYAwJ diff --git a/Source/Examples/OpenTK/GLControl/MultipleGLControls.Designer.cs b/Source/Examples/OpenTK/GLControl/MultipleGLControls.Designer.cs deleted file mode 100644 index 4238de8e..00000000 --- a/Source/Examples/OpenTK/GLControl/MultipleGLControls.Designer.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace Examples.WinForms -{ - partial class MultipleGLControlsForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.derivedGLControl1 = new Examples.WinForms.DerivedGLControl(); - this.derivedGLControl2 = new Examples.WinForms.DerivedGLControl(); - this.SuspendLayout(); - // - // derivedGLControl1 - // - this.derivedGLControl1.BackColor = System.Drawing.Color.Black; - this.derivedGLControl1.ClearColor = System.Drawing.Color.Blue; - this.derivedGLControl1.Location = new System.Drawing.Point(12, 12); - this.derivedGLControl1.Name = "derivedGLControl1"; - this.derivedGLControl1.Size = new System.Drawing.Size(300, 225); - this.derivedGLControl1.TabIndex = 0; - this.derivedGLControl1.VSync = false; - // - // derivedGLControl2 - // - this.derivedGLControl2.BackColor = System.Drawing.Color.Black; - this.derivedGLControl2.ClearColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); - this.derivedGLControl2.Location = new System.Drawing.Point(319, 13); - this.derivedGLControl2.Name = "derivedGLControl2"; - this.derivedGLControl2.Size = new System.Drawing.Size(293, 224); - this.derivedGLControl2.TabIndex = 1; - this.derivedGLControl2.VSync = false; - // - // W04_Multiple_GLControls - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(624, 444); - this.Controls.Add(this.derivedGLControl2); - this.Controls.Add(this.derivedGLControl1); - this.Name = "W04_Multiple_GLControls"; - this.Text = "W04_Multiple_GLControls"; - this.ResumeLayout(false); - - } - - #endregion - - private DerivedGLControl derivedGLControl1; - private DerivedGLControl derivedGLControl2; - - } -} \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLControl/MultipleGLControls.cs b/Source/Examples/OpenTK/GLControl/MultipleGLControls.cs deleted file mode 100644 index 993a607c..00000000 --- a/Source/Examples/OpenTK/GLControl/MultipleGLControls.cs +++ /dev/null @@ -1,35 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.WinForms -{ - [Example("Multiple GLControls", ExampleCategory.OpenTK, "GLControl", 3, Documentation="MultipleGLControls")] - public partial class MultipleGLControlsForm : Form - { - public MultipleGLControlsForm() - { - InitializeComponent(); - } - - public static void Main() - { - using (MultipleGLControlsForm example = new MultipleGLControlsForm()) - { - Utilities.SetWindowTitle(example); - example.ShowDialog(); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLControl/MultipleGLControls.resx b/Source/Examples/OpenTK/GLControl/MultipleGLControls.resx deleted file mode 100644 index 19dc0dd8..00000000 --- a/Source/Examples/OpenTK/GLControl/MultipleGLControls.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/GLWidget/GLWidgetSimple.cs b/Source/Examples/OpenTK/GLWidget/GLWidgetSimple.cs deleted file mode 100644 index 0cbc2b6a..00000000 --- a/Source/Examples/OpenTK/GLWidget/GLWidgetSimple.cs +++ /dev/null @@ -1,152 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Drawing; -using System.Threading; - -using Gtk; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.GLWidget -{ - [Example("GLWidget Simple", ExampleCategory.OpenTK, "GLWidget", 1, Documentation="GLWidgetSimple")] - public class SimpleWindow : Window - { - VBox vbox1; - HBox hbox1; - Button button_red, button_green, button_blue; - OpenTK.GLWidget glwidget1; - - public SimpleWindow() - : base(WindowType.Toplevel) - { - Build(); - } - - private void Build() - { - this.Title = "Sample GLWidget Example"; - this.DefaultWidth = 800; - this.DefaultHeight = 600; - - vbox1 = new VBox(); - - glwidget1 = new OpenTK.GLWidget(); - glwidget1.Initialized += Glwidget1_Initialized; - - // do note that if you are placing the widget inside a container you have to do it after initalization - var t = new Thread(new ThreadStart(delegate { - Thread.Sleep(50); - - Application.Invoke(delegate { - vbox1.PackStart(glwidget1, true, true, 1); - glwidget1.Show(); - }); - })); - t.Start(); - - hbox1 = new HBox(); - - button_blue = new Button("Clear Blue"); - button_blue.Clicked += Button_blue_Clicked; - hbox1.PackStart(button_blue, true, true, 0); - - button_green = new Button("Clear Green"); - button_green.Clicked += Button_green_Clicked; - hbox1.PackStart(button_green, true, true, 1); - - button_red = new Button("Clear Red"); - button_red.Clicked += Button_red_Clicked; - hbox1.PackStart(button_red, true, true, 2); - - vbox1.PackStart(hbox1, false, false, 0); - - this.Add(vbox1); - this.ShowAll(); - - this.DeleteEvent += OnDeleteEvent; - } - - #region Events - - protected void Glwidget1_Initialized(object sender, EventArgs e) - { - GL.ClearColor(1.0f, 1.0f, 1.0f, 1.0f); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0); - - glwidget1.SizeAllocated += Glwidget1_SizeAllocated; - glwidget1.RenderFrame += Glwidget1_RenderFrame; - } - - protected void Glwidget1_SizeAllocated(object o, SizeAllocatedArgs args) - { - GL.Viewport(0, 0, args.Allocation.Width, args.Allocation.Height); - } - - protected void Glwidget1_RenderFrame(object sender, EventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.Begin(PrimitiveType.Triangles); - - GL.Color3(Color.MidnightBlue); - GL.Vertex2(-1.0f, 1.0f); - GL.Color3(Color.SpringGreen); - GL.Vertex2(0.0f, -1.0f); - GL.Color3(Color.Ivory); - GL.Vertex2(1.0f, 1.0f); - - GL.End(); - - GraphicsContext.CurrentContext.SwapBuffers(); - } - - protected void Button_blue_Clicked(object sender, EventArgs e) - { - GL.ClearColor(Color.RoyalBlue); - glwidget1.QueueDraw(); - } - - protected void Button_green_Clicked(object sender, EventArgs e) - { - GL.ClearColor(Color.ForestGreen); - glwidget1.QueueDraw(); - } - - protected void Button_red_Clicked(object sender, EventArgs e) - { - GL.ClearColor(Color.Crimson); - glwidget1.QueueDraw(); - } - - protected void OnDeleteEvent(object sender, DeleteEventArgs a) - { - Application.Quit(); - a.RetVal = true; - } - - #endregion - - #region public static void Main() - - public static void Main(string[] args) - { - Application.Init(); - - SimpleWindow win = new SimpleWindow(); - win.Show(); - - Application.Run(); - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GameWindow/GameWindowMsaa.cs b/Source/Examples/OpenTK/GameWindow/GameWindowMsaa.cs deleted file mode 100644 index 38c4ae63..00000000 --- a/Source/Examples/OpenTK/GameWindow/GameWindowMsaa.cs +++ /dev/null @@ -1,136 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Drawing; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples -{ - [Example("GameWindow MSAA", ExampleCategory.OpenTK, "GameWindow", 2, Documentation = "GameWindowMsaa")] - public class FullscreenAntialias : GameWindow - { - public FullscreenAntialias() - : base(800, 600, new GraphicsMode(32, 0, 0, 4)) - { - KeyDown += Keyboard_KeyDown; - } - - #region Keyboard_KeyDown - - /// - /// Occurs when a key is pressed. - /// - /// The KeyboardDevice which generated this event. - /// The key that was pressed. - void Keyboard_KeyDown(object sender, KeyboardKeyEventArgs e) - { - if (e.Key == Key.Escape) - this.Exit(); - - if (e.Key == Key.F11) - if (this.WindowState == WindowState.Fullscreen) - this.WindowState = WindowState.Normal; - else - this.WindowState = WindowState.Fullscreen; - } - - #endregion - - #region OnLoad - - /// - /// Setup OpenGL and load resources here. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - } - - #endregion - - #region OnResize - - /// - /// Respond to resize events here. - /// - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0); - - base.OnResize(e); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Add your game logic here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - // Nothing to do! - } - - #endregion - - #region OnRenderFrame - - /// - /// Add your game rendering code here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit); - - GL.Begin(PrimitiveType.Triangles); - - GL.Color3(Color.MidnightBlue); - GL.Vertex2(-1.0f, 1.0f); - GL.Color3(Color.SpringGreen); - GL.Vertex2(0.0f, -1.0f); - GL.Color3(Color.Ivory); - GL.Vertex2(1.0f, 1.0f); - - GL.End(); - - this.SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (FullscreenAntialias example = new FullscreenAntialias()) - { - // Get the title and category of this example using reflection. - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GameWindow/GameWindowMsaa.rtf b/Source/Examples/OpenTK/GameWindow/GameWindowMsaa.rtf deleted file mode 100644 index 36643be2d5a7e554d09b8be4bfe55d2deceb965f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 zcmZ`($!^;)5bZf%F~~763`<$i!lxog(;QOt5TF-cXmTVGp-GjbyfpB?_mPqv7i|H- zmTAq*+eU99q^1(mMI$sf&Eico-lep%xLJrMZcU7$>BG-jG^&#!a;omCH*qBzC)Z4$ zgOPT5C|~p#m|vF%lve*PT^ygsBWUQ1J#}5sy&r<%K;L+~JRC0Gg!0x0K%u1wtgE|g z(PDtBE3vWz*VQsVbR}AL9Axr=o@0|(n?$$sn`&O;x?Ox)9>m7*_SHCjBL-E8UIs0k z-x{rw#SftX*Gkt`i|bmfM&9*DdU7dvJ*Z^76RRvnUFYJ9^6}D{NKvkP%XF;1265tD zZ>4dOI=`jlDX`OE)dtyjMn&41)X{pd$xPMKC1_}5G_IY~Q=%bqq||Y4&!oI&lGA}H z^B!^j1AH)G>@lO52Q`?3iK&x`8t5V2h{nmxfpF!n8ySorBJqY@qE0$(ImG!$?W6E{&Pan>N|=eeW|Jf+qW&m zTyfgMWoia%qsoSZhlXsKFKhJDJfR)SAEL_TyfbNjbOPa;@Sl@-%IdAby6EvYm3*R) zEegOF=yj&HZy<3zDX6@QDIg&phedU1EldIDj41Z3OtUYN@J_0P1sOx|oITABWj{_` zK<@ZJmYa8JP8q=EXmY$H;DhxEHV5vZ9jJ`KurSk-Zy?osmPmMHoTuyniA^Y^OQ{3nMnbTJUaKj;Q8x~Usr~u=0@g$LH Yod?PDv6FX`26Mb@ush>> - /// Demonstrates the GameWindow class. - /// - [Example("GameWindow Simple", ExampleCategory.OpenTK, "GameWindow", 1, Documentation = "GameWindowSimple")] - public class SimpleWindow : GameWindow - { - public SimpleWindow() : base(800, 600) - { - KeyDown += Keyboard_KeyDown; - } - - #region Keyboard_KeyDown - - /// - /// Occurs when a key is pressed. - /// - /// The KeyboardDevice which generated this event. - /// The key that was pressed. - void Keyboard_KeyDown(object sender, KeyboardKeyEventArgs e) - { - if (e.Key == Key.Escape) - this.Exit(); - - if (e.Key == Key.F11) - if (this.WindowState == WindowState.Fullscreen) - this.WindowState = WindowState.Normal; - else - this.WindowState = WindowState.Fullscreen; - } - - #endregion - - #region OnLoad - - /// - /// Setup OpenGL and load resources here. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - } - - #endregion - - #region OnResize - - /// - /// Respond to resize events here. - /// - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Add your game logic here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - // Nothing to do! - } - - #endregion - - #region OnRenderFrame - - /// - /// Add your game rendering code here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit); - - GL.Begin(PrimitiveType.Triangles); - - GL.Color3(Color.MidnightBlue); - GL.Vertex2(-1.0f, 1.0f); - GL.Color3(Color.SpringGreen); - GL.Vertex2(0.0f, -1.0f); - GL.Color3(Color.Ivory); - GL.Vertex2(1.0f, 1.0f); - - GL.End(); - - this.SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (SimpleWindow example = new SimpleWindow()) - { - // Get the title and category of this example using reflection. - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GameWindow/GameWindowSimple.rtf b/Source/Examples/OpenTK/GameWindow/GameWindowSimple.rtf deleted file mode 100644 index c360c26d646f418c1ee8dfffc7c208e5b1e07abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1558 zcmb7EO-~y!5bc>?F}IcqMcL&;t#YbRK}gV6h^iM~yt}g-H;%ovy(|>vzxUZr$Rfd^ zQj}zqnK$oa>?h$uTL@{q5)HTQ{7JOdgivXGnTyts%6rlF?oTP&dMTafP@EM{;-hGd zTr+)fO6tWXebA+2UM)6gEnaV(@9I$kK%?|C>YUE);1oOh#^YkMId~Ga)z*OuErjEy zI6D>{2AHxCl^(b(7P07~=-9B6!8*F}ZQw=)I-Q*qvl6e<`RBz(+$$be$}}fps0-0c z*9c=r)zm@bLDZnDrRj?KaVe^-yZl5~COF#+bx_ubDwx)sAIgPm&Cellmjz+Lcd` zhHLg-x<}%BHUY(^A;+d+7aP4w>;fV(9cWrZ9|Y=E=cZ-1O9 zzp?j#ahT!N-z;lPDri(;Nsma7))tCiPDsA|K$EA7qKKvh+eJndhY@_J9kkBWl7x)O z4X_&a87sGc^>u9L2Nh;J=c1vR>Quy4)V_u*GUb>5nn>AoCvKB45$aH-7-0TBro;>C zol~Gh3T9th*&NYNqtoYYvINh4gWN7$JRC8O+Z0EB&M9rZiHwRF-C;E%QjU{ zIFJ<#YGF2xTu`Q?p{E|fDj%SVzV~b{ugOCn(+8e)Gpc00>YN=gH65M9L?F_O?QsY9 z3xgpD3+uD(4g3%W{CF4{?Kd0Wp!spTN=M`^jZBR-?*qV)5WPren>RTn^P2gNTaa1q42(BPk4uThC2k#9 zlWfJp@6JR%n0bLGKAdcQm@LPeBZpYD8`#A?N+D0sPIuhnNuR9N>jGj?gp*oRg0t0c Ut^;DK;}yTZ)0%XOHV5zi0e597v;Y7A diff --git a/Source/Examples/OpenTK/GameWindow/GameWindowThreaded.cs b/Source/Examples/OpenTK/GameWindow/GameWindowThreaded.cs deleted file mode 100644 index c60f0afa..00000000 --- a/Source/Examples/OpenTK/GameWindow/GameWindowThreaded.cs +++ /dev/null @@ -1,319 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Drawing; -using System.Threading; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.Tutorial -{ - /// - /// Demonstrates how to decouple rendering from the main thread. - /// Note that all OpenGL function calls should take place at the rendering thread - - /// OpenGL will not be available on the main thread at all! - /// - [Example("GameWindow Threaded", ExampleCategory.OpenTK, "GameWindow", 3, Documentation = "GameWindowThreaded")] - public class ThreadedRendering : GameWindow - { - bool viewport_changed = true; - int viewport_width, viewport_height; - bool position_changed = true; - int position_x, position_y; - float position_dx, position_dy; - bool exit = false; - Thread rendering_thread; - object update_lock = new object(); - const float GravityAccel = -9.81f; - struct Particle - { - public Vector2 Position; - public Vector2 Velocity; - public Color4 Color; - } - List Particles = new List(); - Random rand = new Random(); - - public ThreadedRendering() - : base(800, 600) - { - KeyDown += delegate(object sender, KeyboardKeyEventArgs e) - { - if (e.Key == Key.Escape) - this.Exit(); - }; - - KeyUp += delegate(object sender, KeyboardKeyEventArgs e) - { - if (e.Key == Key.F11) - if (this.WindowState == WindowState.Fullscreen) - this.WindowState = WindowState.Normal; - else - this.WindowState = WindowState.Fullscreen; - }; - - Resize += delegate(object sender, EventArgs e) - { - // Note that we cannot call any OpenGL methods directly. What we can do is set - // a flag and respond to it from the rendering thread. - lock (update_lock) - { - viewport_changed = true; - viewport_width = Width; - viewport_height = Height; - } - }; - - Move += delegate(object sender, EventArgs e) - { - // Note that we cannot call any OpenGL methods directly. What we can do is set - // a flag and respond to it from the rendering thread. - lock (update_lock) - { - position_changed = true; - position_dx = (position_x - X) / (float)Width; - position_dy = (position_y - Y) / (float)Height; - position_x = X; - position_y = Y; - } - }; - - // Make sure initial position are correct, otherwise we'll give a huge - // initial velocity to the balls. - position_x = X; - position_y = Y; - } - - #region OnLoad - - /// - /// Setup OpenGL and load resources here. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - Context.MakeCurrent(null); // Release the OpenGL context so it can be used on the new thread. - - rendering_thread = new Thread(RenderLoop); - rendering_thread.IsBackground = true; - rendering_thread.Start(); - } - - #endregion - - #region OnUnload - - /// - /// Release resources here. - /// - /// Not used. - protected override void OnUnload(EventArgs e) - { - exit = true; // Set a flag that the rendering thread should stop running. - rendering_thread.Join(); - - base.OnUnload(e); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Add your game logic here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - // Nothing to do! - } - - #endregion - - #region OnRenderFrame - - /// - /// Ignored. All rendering is performed on our own rendering function. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - // Nothing to do. Release the CPU to other threads. - Thread.Sleep(1); - } - - #endregion - - #region RenderLoop - - void RenderLoop() - { - MakeCurrent(); // The context now belongs to this thread. No other thread may use it! - - VSync = VSyncMode.On; - - for (int i = 0; i < 64; i++) - { - Particle p = new Particle(); - p.Position = new Vector2((float)rand.NextDouble() * 2 - 1, (float)rand.NextDouble() * 2 - 1); - p.Color.R = (float)rand.NextDouble(); - p.Color.G = (float)rand.NextDouble(); - p.Color.B = (float)rand.NextDouble(); - Particles.Add(p); - } - - // Since we don't use OpenTK's timing mechanism, we need to keep time ourselves; - Stopwatch render_watch = new Stopwatch(); - Stopwatch update_watch = new Stopwatch(); - update_watch.Start(); - render_watch.Start(); - - GL.ClearColor(Color.MidnightBlue); - GL.Enable(EnableCap.DepthTest); - GL.Enable(EnableCap.PointSmooth); - GL.PointSize(16); - - while (!exit) - { - Update(update_watch.Elapsed.TotalSeconds); - update_watch.Reset(); - update_watch.Start(); - - Render(render_watch.Elapsed.TotalSeconds); - render_watch.Reset(); // Stopwatch may be inaccurate over larger intervals. - render_watch.Start(); // Plus, timekeeping is easier if we always start counting from 0. - - SwapBuffers(); - } - - Context.MakeCurrent(null); - } - - #endregion - - #region Update - - void Update(double time) - { - lock (update_lock) - { - // When the user moves the window we make the particles react to - // this movement. The reaction is semi-random and not physically - // correct. It looks quite good, however. - if (position_changed) - { - for (int i = 0; i < Particles.Count; i++) - { - Particle p = Particles[i]; - p.Velocity += new Vector2( - 16 * (position_dx + 0.05f * (float)(rand.NextDouble() - 0.5)), - 32 * (position_dy + 0.05f * (float)(rand.NextDouble() - 0.5))); - Particles[i] = p; - } - - position_changed = false; - } - } - - // For simplicity, we use simple Euler integration to simulate particle movement. - // This is not accurate, especially under varying timesteps (as is the case here). - // A better solution would have been time-corrected Verlet integration, as - // described here: - // http://www.gamedev.net/reference/programming/features/verlet/ - for (int i = 0; i < Particles.Count; i++) - { - Particle p = Particles[i]; - - p.Velocity.X = Math.Abs(p.Position.X) >= 1 ?-p.Velocity.X * 0.92f : p.Velocity.X * 0.97f; - p.Velocity.Y = Math.Abs(p.Position.Y) >= 1 ? -p.Velocity.Y * 0.92f : p.Velocity.Y * 0.97f; - if (p.Position.Y > -0.99) - { - p.Velocity.Y += (float)(GravityAccel * time); - } - else - { - if (Math.Abs(p.Velocity.Y) < 0.02) - { - p.Velocity.Y = 0; - p.Position.Y = -1; - } - else - { - p.Velocity.Y *= 0.9f; - } - } - - p.Position += p.Velocity * (float)time; - if (p.Position.Y <= -1) - p.Position.Y = -1; - - Particles[i] = p; - } - } - - #endregion - - #region Render - - /// - /// This is our main rendering function, which executes on the rendering thread. - /// - public void Render(double time) - { - lock (update_lock) - { - if (viewport_changed) - { - GL.Viewport(0, 0, viewport_width, viewport_height); - viewport_changed = false; - } - } - - Matrix4 perspective = - Matrix4.CreateOrthographic(2, 2, -1, 1); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref perspective); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.Begin(PrimitiveType.Points); - foreach (Particle p in Particles) - { - GL.Color4(p.Color); - GL.Vertex2(p.Position); - } - GL.End(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (GameWindow example = new ThreadedRendering()) - { - // Get the title and category of this example using reflection. - Utilities.SetWindowTitle(example); - example.Run(); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GameWindow/GameWindowThreaded.rtf b/Source/Examples/OpenTK/GameWindow/GameWindowThreaded.rtf deleted file mode 100644 index a2d12660e262762209e832678896ea9b8081646a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1874 zcmah~O>g5i6zn;_;@z5Eq=qFYi!FRAf^86B(-y@Rz3@UwPcmVOR7omYH}HS&kd$LN z-J*bDTju+iH#3iZ5iYcakjAU@Ru5fK-fcv~ZM%LEtu-N38ei6;^^@{mw1fMr6m7ke z&T}X}6ffevXpQWdesW6c?J<4OgJa%rk4P=Pow`27BLoG%RlVGN{EzDQpHk@!IxGE( zW=;2Ybc!AQ!qfJ6ym}F})z)DI+6u=_@nIu605fGFDm`*pY-7-S(XnACgLU-e+rW(q zbho-KRwZ6{>mRpA@vL~-E7RPHu`a|QT_cR0R8t3y2T@~8ElpRfH>IdDU*$)7G{M^ zt~&DwaSQqlNuGW#iU=v#uESUrhY1=|J8JFgC})C~YjT5H4bKR3`X^tZ}qx z{i?)ih{vc!q)aBo()n_f3&jRG8L&o`toNOZ9D>xSSZuZfo51?(z~4XTY!iB$g^ z-RvL3HMo`TK+DD+qcdT>O@{*4yaMFe16lfaiEPbq30lo#qEUZh7P^(<`?ftjW4YI~ zFiep-z%)KMtOlI1vv%(cI`_yA;lk2!&I9)x-J>QQG{lm4v2E5CH`0U0vieI2y0NP|g z3vXOR!k~Lj5Z*wmb7Q(*qL>k&wIQHl7ndRqqs$mZ>*Ak-wsxQqzv;Y(*aKXC>DR1Y zeCSk7 - /// Demonstrates the MouseCursor class. - /// - [Example("Custom MouseCursor", ExampleCategory.OpenTK, "GameWindow", 1, Documentation = "MouseCursorSimple")] - public class MouseCursorSimple : GameWindow - { - readonly MouseCursor MyCursor; - List lines = new List(); - - public MouseCursorSimple() - : base(800, 600) - { - KeyDown += Keyboard_KeyDown; - - using (Bitmap bitmap = new Bitmap("Data/Textures/cursor.png")) - { - var data = bitmap.LockBits( - new Rectangle(0, 0, bitmap.Width, bitmap.Height), - System.Drawing.Imaging.ImageLockMode.ReadOnly, - System.Drawing.Imaging.PixelFormat.Format32bppPArgb); - - MyCursor = new OpenTK.MouseCursor( - 2, 21, data.Width, data.Height, data.Scan0); - Cursor = MyCursor; - } - - MouseMove += Mouse_Move; - MouseDown += Mouse_ButtonDown; - } - - void AddLine(float x, float y) - { - // Scale mouse coordinates from - // (0, 0):(Width, Height) to - // (-1, -1):(+1, +1) - // Note, we must flip the y-coordinate - // since mouse is reported with (0, 0) - // at top-left and our projection uses - // (-1, -1) at bottom left. - x = (x- Width) / (float)Width; - y = (Height - y) / (float)Height; - lines.Add(new Vector2(2 * x + 1, 2 * y - 1)); - } - - #region Mouse_ButtonDown - - void Mouse_ButtonDown(object sender, MouseButtonEventArgs e) - { - if (e.Button == MouseButton.Left) - { - AddLine(e.X, e.Y); - } - } - - #endregion - - #region Mouse_Move - - void Mouse_Move(object sender, MouseMoveEventArgs e) - { - if (e.Mouse[MouseButton.Left]) - { - AddLine(e.X, e.Y); - } - } - - #endregion - - #region Keyboard_KeyDown - - /// - /// Occurs when a key is pressed. - /// - /// The KeyboardDevice which generated this event. - /// The key that was pressed. - void Keyboard_KeyDown(object sender, KeyboardKeyEventArgs e) - { - if (e.Key == Key.Escape) - { - this.Exit(); - } - - if (e.Key == Key.Enter && e.Alt) - { - if (this.WindowState == WindowState.Fullscreen) - this.WindowState = WindowState.Normal; - else - this.WindowState = WindowState.Fullscreen; - } - else if (e.Key == Key.Enter) - { - CursorVisible = !CursorVisible; - } - - if (e.Key == Key.Space) - { - if (Cursor == MouseCursor.Default) - { - Cursor = MyCursor; - } - else if (Cursor == MyCursor) - { - Cursor = MouseCursor.Empty; - } - else - { - Cursor = MouseCursor.Default; - } - } - } - - #endregion - - #region OnLoad - - /// - /// Setup OpenGL and load resources here. - /// - /// Not used. - protected override void OnLoad(EventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - } - - #endregion - - #region OnResize - - /// - /// Respond to resize events here. - /// - /// Contains information on the new GameWindow size. - /// There is no need to call the base implementation. - protected override void OnResize(EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1.0, 1.0, -1.0, 1.0, 0.0, 4.0); - } - - #endregion - - #region OnUpdateFrame - - /// - /// Add your game logic here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnUpdateFrame(FrameEventArgs e) - { - } - - #endregion - - #region OnRenderFrame - - /// - /// Add your game rendering code here. - /// - /// Contains timing information. - /// There is no need to call the base implementation. - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit); - - GL.Begin(PrimitiveType.Triangles); - - GL.Color3(Color.MidnightBlue); - GL.Vertex2(-1.0f, 1.0f); - GL.Color3(Color.SpringGreen); - GL.Vertex2(0.0f, -1.0f); - GL.Color3(Color.Ivory); - GL.Vertex2(1.0f, 1.0f); - - GL.End(); - - GL.Begin(PrimitiveType.LineStrip); - foreach (var p in lines) - { - GL.Color4(Color.White); - GL.Vertex2(p); - } - GL.End(); - - this.SwapBuffers(); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (MouseCursorSimple example = new MouseCursorSimple()) - { - // Get the title and category of this example using reflection. - Utilities.SetWindowTitle(example); - example.Run(30.0, 0.0); - } - } - - #endregion - } -} diff --git a/Source/Examples/OpenTK/GameWindow/MouseCursorSimple.rtf b/Source/Examples/OpenTK/GameWindow/MouseCursorSimple.rtf deleted file mode 100644 index 18c0bdb6131382aa0341b3ba0170e4102a2c5ae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 991 zcmZuwTWi}e6y9@w#d$6zSWa6u^0bAu1eP&M$6oXzTStzlEP0X~w+sI7JCc*eg@UoJ z-_duGj@(DZxUfNUiAohmuAGgrGSn%!3WE-TtIq!|xvKZV2aN2F9r+bkR~X04J%e9uO{8)XV}{4o$TwVo#jlwC*E%&DcUTA#0FBjp~$^6;WRmux^o8va@J$e|0W$nW&wkadw8YD zpiNrdpOB6CMW6upj3pPMYZ`K@!Z=Wbpn78hDWq;vGu1>%wIqhA)&&0^>IBCZ9hYaP zl7kb~xrl9wqD31;4s2SQNjal4w^@3WVqaz3$?S{GnHQ<|UK1tIF~AQeDY=6 X(&^;XDe5WRI=$7)<&^oXaq;OtDg0gB diff --git a/Source/Examples/OpenTK/Test/BasicMouseInput.cs b/Source/Examples/OpenTK/Test/BasicMouseInput.cs deleted file mode 100644 index b40d94c3..00000000 --- a/Source/Examples/OpenTK/Test/BasicMouseInput.cs +++ /dev/null @@ -1,123 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain by Andy Korth -// It is provided "as is" without express or implied warranty of any kind. - -#region --- Using Directives --- - -using System; -using System.Collections.Generic; -using System.Drawing; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -#endregion --- Using Directives --- - -namespace Examples.Tests -{ - /// - /// Demonstrates basic recommended mouse input, and to see if it actually works - /// - [Example("Basic Mouse Input", ExampleCategory.OpenTK,"Basic Mouse Input")] - public class BasicMouseInput : GameWindow - { - List lines = new List(); - - public BasicMouseInput() - : base(800, 600) - { - MouseMove += (sender, e) => - { - if (e.Mouse[MouseButton.Left]) - { - // Scale mouse coordinates from - // (0, 0):(Width, Height) to - // (-1, -1):(+1, +1) - // Note, we must flip the y-coordinate - // since mouse is reported with (0, 0) - // at top-left and our projection uses - // (-1, -1) at bottom left. - float x = (e.X - Width) / (float)Width; - float y = (Height- e.Y) / (float)Height; - lines.Add(new Vector2(2 * x + 1, 2 * y - 1)); - } - }; - } - - protected override void OnLoad(EventArgs e) - { - MouseUp += (object sender, MouseButtonEventArgs buttonEvent) => { - Console.WriteLine("Mouse button up: " + buttonEvent.Button + " at: " + buttonEvent.Position); - }; - } - - protected override void OnUpdateFrame(FrameEventArgs e) - { - // Here's the big test! - if(OpenTK.Input.Mouse.GetState()[MouseButton.Left]){ - Console.WriteLine("The left mouse button is down!"); - } - - // While we are here, test keyboard. - if(OpenTK.Input.Keyboard.GetState()[Key.A]){ - Console.WriteLine("The A key is down!"); - } - - var keyboard = OpenTK.Input.Keyboard.GetState(); - - if (keyboard[OpenTK.Input.Key.Escape]) - this.Exit(); - - if (keyboard[OpenTK.Input.Key.F11]) - if (WindowState != WindowState.Fullscreen) - WindowState = WindowState.Fullscreen; - else - WindowState = WindowState.Normal; - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.ClearColor(Color.MidnightBlue); - GL.Clear(ClearBufferMask.ColorBufferBit); - - GL.Viewport(ClientRectangle); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadIdentity(); - GL.Ortho(-1, 1, -1, 1, -1, 1); - - GL.Begin(PrimitiveType.LineStrip); - foreach (var p in lines) - { - GL.Color4(Color.White); - GL.Vertex2(p); - } - GL.End(); - - SwapBuffers(); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[Key.Space]) - { - // Simulate high load (4 fps) to check - // mouse input behavior - System.Threading.Thread.Sleep(250); - } - } - - [STAThread] - public static void Main() - { - using (BasicMouseInput example = new BasicMouseInput()) - { - // Get the title and category of this example using reflection. - ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); - example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - - example.Run(30.0); - } - } - - } -} diff --git a/Source/Examples/OpenTK/Test/BlittableValueTypes.cs b/Source/Examples/OpenTK/Test/BlittableValueTypes.cs deleted file mode 100644 index 8ac895d7..00000000 --- a/Source/Examples/OpenTK/Test/BlittableValueTypes.cs +++ /dev/null @@ -1,79 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.Reflection; -using OpenTK; - -#pragma warning disable 0649 // Do not warn about unitialized fields, this is on purpose - -namespace Examples.Tests -{ - struct Simple { public int Value; } - struct Generic { public T Value; } - enum Enum { First, Second } - struct Complex { public Simple Value; } - struct Complex { public Generic Value; } - struct Complex2 { public Enum Value; } - struct Complex3 { public Class Value; } - struct Complex4 : Interface { public Class Value; } - class Class { public int Value; } - class Class { public T Value; } - interface Interface { } - - [Example("Blittable Value Types", ExampleCategory.OpenTK, "Test", Documentation="BlittableValueTypes")] - public class BlittableValueTypes - { - public static void Main() - { - TestType(new Simple()); - TestType(new Generic()); - TestType(new Generic()); - TestType(new Complex()); - TestType(new Complex()); - TestType(new Complex2()); - TestType(new Complex3()); - TestType(new Complex4()); - TestType(new Class()); - TestType(new Class()); - } - - // Tests whether specified type is blittable and prints its marshalled size if so. - static void TestType(T instance) - { - PrintType(); - - Trace.Write(BlittableValueType.Check(instance) ? "is blittable " : "is not blittable "); - - try - { - // StrideOf() will throw an ArgumentException if the type is not blittable. - Trace.Write(String.Format("({0} bytes)", BlittableValueType.StrideOf(instance))); - } - catch (Exception e) - { - Trace.Write(String.Format("({0})", e.GetType().Name)); - } - - Trace.WriteLine(""); - } - - // Prints a simple description for the type. - static void PrintType() - { - Type type = typeof(T); - string typename = type.GetFields()[0].FieldType.ToString(); - - Trace.Write(type.IsClass ? "class " : type.IsEnum ? "enum " : type.IsInterface ? "interface " : "struct "); - Trace.Write(type.Name); - if (type.IsGenericType) - Trace.Write(String.Format("<{0}>", type.GetGenericArguments()[0].Name)); - Trace.Write(" { "); - - Trace.Write(typename.Substring(typename.LastIndexOf('.') + 1)); - Trace.Write(" } "); - } - } -} diff --git a/Source/Examples/OpenTK/Test/BlittableValueTypes.rtf b/Source/Examples/OpenTK/Test/BlittableValueTypes.rtf deleted file mode 100644 index d6f3715d6764a24398dd02380d7d05c0422a4da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmaJ=-EY${5a)S+#XWAQWKFsupa^N(1De=}L<>)Tah!8=nqx<{(^01W@0^{LR-!_R zEGMz=eqZ+@eAK0oHc(zvzbdQCnP^b!>5I_L##kHPOog^&gjTKe0pk>|JV`U(Zcko> za>jW+26N%DDc{e;$|KsU6tx+!D(C6YTd_imUPkBPKIn)IMYt?3%A(@ua{6(;6>Gxh zC$i0j7*r{G=^LRKoso7`PG>Vw3mvKtaBHJ?&7dMVD{4j-sw$m6$;+~(06})WL5LV) zfY>6`*vd6=Z>RJ7V~=+Et++N6qpS`7lniyb=@FEXArz3yL6Qy7VQgK)1sw$9 z2BbGYHllYuJX368u${DWg$>_n@Du!7zPM>oJ)NF`$2fSd8U27jBPa=>M@5>rKulON z6OEu5_z-YxlAwRRJHNU+zqy;hb4yJ0NTWsc)Zn8&?8QO^`i(mg#vT^x4GT2^$*y?l z*x*(gLv~f{RlP*2LBC63)0bIapL7Fjp2LszpYoLYWz=nxV|<+|Q6M)u-0amma8r^q+hO9&h+ z6?vD(j@14`4s|NdWp+OgzpbSwH-yxpCY$l*8S?0Kakh^{HA24U(Rh^_lt;-?;?k^W zh)K(Y8`=6X&>1=#9FBN0jz%6X - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); - this.dataGridView1 = new System.Windows.Forms.DataGridView(); - this.LabelVendor = new System.Windows.Forms.Label(); - this.LabelRenderer = new System.Windows.Forms.Label(); - this.LabelVersion = new System.Windows.Forms.Label(); - this.TextBoxVendor = new System.Windows.Forms.TextBox(); - this.TextBoxRenderer = new System.Windows.Forms.TextBox(); - this.TextBoxVersion = new System.Windows.Forms.TextBox(); - this.LabelSupport = new System.Windows.Forms.Label(); - this.TextBoxSupport = new System.Windows.Forms.TextBox(); - this.SupportedColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.NameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.CategoryColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Version = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.ExtensionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.UnmanagedName = new System.Windows.Forms.DataGridViewTextBoxColumn(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); - this.SuspendLayout(); - // - // backgroundWorker1 - // - this.backgroundWorker1.WorkerReportsProgress = true; - this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); - this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); - // - // dataGridView1 - // - this.dataGridView1.AllowUserToAddRows = false; - this.dataGridView1.AllowUserToDeleteRows = false; - this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.SupportedColumn, - this.NameColumn, - this.CategoryColumn, - this.Version, - this.ExtensionColumn, - this.UnmanagedName}); - this.dataGridView1.Location = new System.Drawing.Point(0, 110); - this.dataGridView1.Name = "dataGridView1"; - this.dataGridView1.ReadOnly = true; - this.dataGridView1.Size = new System.Drawing.Size(939, 397); - this.dataGridView1.TabIndex = 1; - // - // LabelVendor - // - this.LabelVendor.AutoSize = true; - this.LabelVendor.Location = new System.Drawing.Point(12, 9); - this.LabelVendor.Name = "LabelVendor"; - this.LabelVendor.Size = new System.Drawing.Size(41, 13); - this.LabelVendor.TabIndex = 2; - this.LabelVendor.Text = "Vendor"; - // - // LabelRenderer - // - this.LabelRenderer.AutoSize = true; - this.LabelRenderer.Location = new System.Drawing.Point(12, 35); - this.LabelRenderer.Name = "LabelRenderer"; - this.LabelRenderer.Size = new System.Drawing.Size(51, 13); - this.LabelRenderer.TabIndex = 3; - this.LabelRenderer.Text = "Renderer"; - // - // LabelVersion - // - this.LabelVersion.AutoSize = true; - this.LabelVersion.Location = new System.Drawing.Point(12, 61); - this.LabelVersion.Name = "LabelVersion"; - this.LabelVersion.Size = new System.Drawing.Size(42, 13); - this.LabelVersion.TabIndex = 4; - this.LabelVersion.Text = "Version"; - // - // TextBoxVendor - // - this.TextBoxVendor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TextBoxVendor.Location = new System.Drawing.Point(70, 6); - this.TextBoxVendor.Name = "TextBoxVendor"; - this.TextBoxVendor.ReadOnly = true; - this.TextBoxVendor.Size = new System.Drawing.Size(856, 20); - this.TextBoxVendor.TabIndex = 5; - // - // TextBoxRenderer - // - this.TextBoxRenderer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TextBoxRenderer.Location = new System.Drawing.Point(70, 32); - this.TextBoxRenderer.Name = "TextBoxRenderer"; - this.TextBoxRenderer.ReadOnly = true; - this.TextBoxRenderer.Size = new System.Drawing.Size(856, 20); - this.TextBoxRenderer.TabIndex = 6; - // - // TextBoxVersion - // - this.TextBoxVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TextBoxVersion.Location = new System.Drawing.Point(70, 58); - this.TextBoxVersion.Name = "TextBoxVersion"; - this.TextBoxVersion.ReadOnly = true; - this.TextBoxVersion.Size = new System.Drawing.Size(856, 20); - this.TextBoxVersion.TabIndex = 7; - // - // LabelSupport - // - this.LabelSupport.AutoSize = true; - this.LabelSupport.Location = new System.Drawing.Point(12, 87); - this.LabelSupport.Name = "LabelSupport"; - this.LabelSupport.Size = new System.Drawing.Size(44, 13); - this.LabelSupport.TabIndex = 8; - this.LabelSupport.Text = "Support"; - // - // TextBoxSupport - // - this.TextBoxSupport.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TextBoxSupport.Location = new System.Drawing.Point(70, 84); - this.TextBoxSupport.Name = "TextBoxSupport"; - this.TextBoxSupport.ReadOnly = true; - this.TextBoxSupport.Size = new System.Drawing.Size(856, 20); - this.TextBoxSupport.TabIndex = 9; - // - // SupportedColumn - // - this.SupportedColumn.HeaderText = ""; - this.SupportedColumn.Name = "SupportedColumn"; - this.SupportedColumn.ReadOnly = true; - this.SupportedColumn.Width = 24; - // - // NameColumn - // - this.NameColumn.HeaderText = "Name"; - this.NameColumn.Name = "NameColumn"; - this.NameColumn.ReadOnly = true; - this.NameColumn.Width = 852; - // - // CategoryColumn - // - this.CategoryColumn.HeaderText = "Category"; - this.CategoryColumn.Name = "CategoryColumn"; - this.CategoryColumn.ReadOnly = true; - this.CategoryColumn.Width = 5; - // - // Version - // - this.Version.HeaderText = "Introduced"; - this.Version.Name = "Version"; - this.Version.ReadOnly = true; - this.Version.Width = 5; - // - // ExtensionColumn - // - this.ExtensionColumn.HeaderText = "Extension"; - this.ExtensionColumn.Name = "ExtensionColumn"; - this.ExtensionColumn.ReadOnly = true; - this.ExtensionColumn.Width = 5; - // - // UnmanagedName - // - this.UnmanagedName.HeaderText = "Unmanaged Name"; - this.UnmanagedName.Name = "UnmanagedName"; - this.UnmanagedName.ReadOnly = true; - this.UnmanagedName.Width = 5; - // - // Extensions - // - this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.ClientSize = new System.Drawing.Size(938, 508); - this.Controls.Add(this.TextBoxSupport); - this.Controls.Add(this.LabelSupport); - this.Controls.Add(this.TextBoxVersion); - this.Controls.Add(this.TextBoxRenderer); - this.Controls.Add(this.TextBoxVendor); - this.Controls.Add(this.LabelVersion); - this.Controls.Add(this.LabelRenderer); - this.Controls.Add(this.LabelVendor); - this.Controls.Add(this.dataGridView1); - this.Name = "Extensions"; - this.Text = "W03_Extensions"; - ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.ComponentModel.BackgroundWorker backgroundWorker1; - private System.Windows.Forms.DataGridView dataGridView1; - private System.Windows.Forms.Label LabelVendor; - private System.Windows.Forms.Label LabelRenderer; - private System.Windows.Forms.Label LabelVersion; - private System.Windows.Forms.TextBox TextBoxVendor; - private System.Windows.Forms.TextBox TextBoxRenderer; - private System.Windows.Forms.TextBox TextBoxVersion; - private System.Windows.Forms.Label LabelSupport; - private System.Windows.Forms.TextBox TextBoxSupport; - private System.Windows.Forms.DataGridViewCheckBoxColumn SupportedColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn NameColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn CategoryColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn Version; - private System.Windows.Forms.DataGridViewTextBoxColumn ExtensionColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn UnmanagedName; - } -} \ No newline at end of file diff --git a/Source/Examples/OpenTK/Test/Extensions.cs b/Source/Examples/OpenTK/Test/Extensions.cs deleted file mode 100644 index b6f4c2c7..00000000 --- a/Source/Examples/OpenTK/Test/Extensions.cs +++ /dev/null @@ -1,250 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ -#endregion - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Threading; -using System.Reflection; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using System.Text.RegularExpressions; - -namespace Examples.WinForms -{ - [Example("OpenGL Extensions", ExampleCategory.OpenTK, "Test", Documentation="Extensions", Visible = false)] - public partial class Extensions : Form - { - #region Fields - - int supported_count, opengl_function_count; // Number of supported extensions. - SortedDictionary functions = new SortedDictionary(); - - #endregion - - #region Constructors - - public Extensions() - { - this.Font = SystemFonts.MessageBoxFont; - InitializeComponent(); - - Application.Idle += StartAsync; - - // Workaround for missing Idle event on Mono/Windows. - if (Configuration.RunningOnMono && Configuration.RunningOnWindows) - Application.RaiseIdle(EventArgs.Empty); - } - - #endregion - - #region Private Members - - // Creates a context and starts processing the GL class. - // The processing takes place in the background to avoid hanging the GUI. - void StartAsync(object sender, EventArgs e) - { - Application.Idle -= StartAsync; - - // Create a context to load all GL entry points. - // The loading part is handled automatically by OpenTK. - using (INativeWindow window = new OpenTK.NativeWindow()) - using (IGraphicsContext context = new GraphicsContext(GraphicsMode.Default, window.WindowInfo, 3, 0, GraphicsContextFlags.Default)) - { - window.ProcessEvents(); - context.MakeCurrent(window.WindowInfo); - (context as IGraphicsContextInternal).LoadAll(); - - TextBoxVendor.Text = GL.GetString(StringName.Vendor); - TextBoxRenderer.Text = GL.GetString(StringName.Renderer); - TextBoxVersion.Text = GL.GetString(StringName.Version); - } - - backgroundWorker1.RunWorkerAsync(); - TextBoxSupport.Text = "processing... (please be patient)"; - } - - void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) - { - Type delegates = typeof(GL).GetNestedType("Delegates", BindingFlags.NonPublic | BindingFlags.Static); - - foreach (Function f in LoadFunctionsFromType(typeof(GL))) - { - FieldInfo @delegate = delegates.GetField(f.EntryPoint, - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); - - // Only show a function as supported when all relevant overloads are supported. - if (!functions.ContainsKey(f)) - functions.Add(f, @delegate != null && @delegate.GetValue(null) != null); - else - functions[f] &= @delegate != null && @delegate.GetValue(null) != null; - } - - // Count supported functions using the delegates directly. - foreach (FieldInfo f in typeof(GL).GetNestedType("Delegates", BindingFlags.NonPublic) - .GetFields(BindingFlags.Static | BindingFlags.NonPublic)) - { - if (f.GetValue(null) != null) - supported_count++; - - opengl_function_count++; - } - } - - // Recursively load all functions marked with [AutoGenerated] in the specified Type. - IEnumerable LoadFunctionsFromType(Type type) - { - foreach (MethodInfo method in type.GetMethods(BindingFlags.Public | BindingFlags.Static)) - { - // Functions in GLHelper.cs are not autogenerated and should be skipped. - AutoGeneratedAttribute[] attr = (AutoGeneratedAttribute[]) - method.GetCustomAttributes(typeof(AutoGeneratedAttribute), false); - if (attr.Length == 0) - continue; - string returnType = method.ReturnParameter.ToString(); - List args = new List(); - foreach (ParameterInfo item in method.GetParameters()) - { - args.Add(item.ToString()); - } - - string argsStr = String.Join(", ", args.ToArray()); - string fullMethodName = String.Format("{0} {1}({2})", returnType, method.Name, argsStr); - - yield return new Function(fullMethodName, type.Name, - attr[0].EntryPoint, attr[0].Version, attr[0].Category); - } - - foreach (Type nested_type in type.GetNestedTypes(BindingFlags.Public | BindingFlags.Static)) - foreach (Function f in LoadFunctionsFromType(nested_type)) - yield return f; - } - - // Update the DataGridView with our findings. - private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - TextBoxSupport.Text = String.Format("{0} of {1} functions supported.", - supported_count, opengl_function_count); - - foreach (Function f in functions.Keys) - { - dataGridView1.Rows.Add(functions[f], f.Name, f.Category, f.Version, f.Extension, f.EntryPoint); - int index = dataGridView1.Rows.Count - 1; - - // Some simple coloring to make the GridView easier on the eyes. - // Supported functions are green, unsupported are redish. - dataGridView1.Rows[index].DefaultCellStyle.BackColor = - functions[f] ? - (index % 2 != 0 ? Color.FromArgb(128, 255, 192) : Color.FromArgb(192, 255, 192)) : - (index % 2 != 0 ? Color.FromArgb(255, 192, 160) : Color.FromArgb(255, 200, 160)); - } - - // Change the width of our Form to make every DataGridView column visible. - dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); - dataGridView1.Columns[1].Width = 450; - this.Size = dataGridView1.GetPreferredSize(new System.Drawing.Size(2000, Height)); - } - - #endregion - - #region public static void Main() - - /// - /// Entry point of this example. - /// - [STAThread] - public static void Main() - { - using (Extensions example = new Extensions()) - { - Utilities.SetWindowTitle(example); - example.ShowDialog(); - } - } - - #endregion - } - - #region class Function - - // A simple class where we store information from OpenTK.Graphics.GL. - sealed class Function : IEquatable, IComparable - { - #region Fields - - // We use these fields to distinguish between functions. - public readonly string Name; - public readonly string Category; - // These fields just provide some extra (cosmetic) information. - public readonly string EntryPoint; - public readonly string Version; - public readonly string Extension; - - #endregion - - #region Constructors - - public Function(string name, string category, string entryPoint, string version, string extension) - { - Name = name; - Category = category == "GL" ? String.Empty : category; - EntryPoint = entryPoint; - Version = version; - Extension = extension; - } - - #endregion - - #region Public Members - - public override bool Equals(object obj) - { - if (obj is Function) - return this.Equals((Function)obj); - - return false; - } - - public override int GetHashCode() - { - return Name.GetHashCode() ^ Category.GetHashCode(); - } - - #endregion - - #region IEquatable Members - - public bool Equals(Function other) - { - return - Category == other.Category && - Name == other.Name; - } - - #endregion - - #region IComparable Members - - public int CompareTo(Function other) - { - int order = Category.CompareTo(other.Category); - if (order == 0) - order = Name.CompareTo(other.Name); - - return order; - } - - #endregion - } - - #endregion -} \ No newline at end of file diff --git a/Source/Examples/OpenTK/Test/Extensions.resx b/Source/Examples/OpenTK/Test/Extensions.resx deleted file mode 100644 index ecf172ae..00000000 --- a/Source/Examples/OpenTK/Test/Extensions.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - True - - - True - - \ No newline at end of file diff --git a/Source/Examples/OpenTK/Test/ExternalContext.cs b/Source/Examples/OpenTK/Test/ExternalContext.cs deleted file mode 100644 index 77a6fadb..00000000 --- a/Source/Examples/OpenTK/Test/ExternalContext.cs +++ /dev/null @@ -1,111 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Runtime.InteropServices; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Tests -{ - [Example("External Context Test", ExampleCategory.OpenTK, "OpenGL")] - class ExternalContext - { - public static void Main() - { - using (Toolkit.Init(new ToolkitOptions { Backend = PlatformBackend.PreferNative })) - { - // Create a window and context using a third-party toolkit - // (in this case SDL2) - var window = SDL.CreateWindow("Test", 0, 0, 640, 480, - WindowFlags.AllowHighDpi | WindowFlags.OpenGL); - var context = SDL.GL.CreateContext(window); - - // The external context must be made current, - // in order to correctly initialize OpenTK.Graphics - SDL.GL.MakeCurrent(window, context); - - // Now we need to initialize OpenTK.Graphics using - // the external context. This can be achieved in - // two ways: - // - // var dummy = new GraphicsContext(ContextHandle.Zero, null); - // -- or -- - // var dummy = new GraphicsContext( - // new ContextHandle(context), - // (name) => SDL.GL.GetAddress(name), - // () => new ContextHandle(SDL.GL.GetCurrentContext())); - // - // The first approach works only on Windows, Mac and Linux/X11. - // - // The second approach will work on all platforms supported - // by the external toolkit. This means that you can use - // OpenTK.Graphics everywhere, even on platforms not directly - // supported by OpenTK. - - using (var dummy = new GraphicsContext( - new ContextHandle(context), - SDL.GL.GetAddress, - () => new ContextHandle(SDL.GL.GetCurrentContext()))) - { - for (int i = 0; i < 100; i++) - { - SDL.PumpEvents(); - GL.ClearColor(i / 100.0f, i / 100.0f, i / 100.0f, i / 100.0f); - GL.Clear(ClearBufferMask.ColorBufferBit); - - SDL.GL.SwapWindow(window); - } - - SDL.DestroyWindow(window); - } - } - } - } - - #region SDL2 bindings - - public enum WindowFlags - { - Default = 0, - OpenGL = 0x00000002, - AllowHighDpi = 0x00002000, - } - - static class SDL - { - const string lib = "SDL2.dll"; - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_CreateWindow", ExactSpelling = true)] - public static extern IntPtr CreateWindow(string title, int x, int y, int w, int h, WindowFlags flags); - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_DestroyWindow", ExactSpelling = true)] - public static extern void DestroyWindow(IntPtr window); - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_PumpEvents", ExactSpelling = true)] - public static extern void PumpEvents(); - - public static class GL - { - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_CreateContext", ExactSpelling = true)] - public static extern IntPtr CreateContext(IntPtr window); - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetCurrentContext", ExactSpelling = true)] - public static extern IntPtr GetCurrentContext(); - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_GetProcAddress", ExactSpelling = true)] - public static extern IntPtr GetAddress(string name); - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_MakeCurrent", ExactSpelling = true)] - public static extern int MakeCurrent(IntPtr window, IntPtr context); - - [DllImport(lib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GL_SwapWindow", ExactSpelling = true)] - public static extern void SwapWindow(IntPtr window); - } - } - - #endregion - -} diff --git a/Source/Examples/OpenTK/Test/GameWindowStates.cs b/Source/Examples/OpenTK/Test/GameWindowStates.cs deleted file mode 100644 index 66057787..00000000 --- a/Source/Examples/OpenTK/Test/GameWindowStates.cs +++ /dev/null @@ -1,731 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using System.Drawing; -using System.Threading; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -#pragma warning disable 612,618 // disable obsolete warnings - we need to access these functions - -namespace Examples.Tests -{ - [Example("GameWindow States", ExampleCategory.OpenTK, "GameWindow", 4, Documentation = "GameWindowStates")] - public class GameWindowStates : GameWindow - { - static readonly Font TextFont = new Font(FontFamily.GenericSansSerif, 11); - Bitmap TextBitmap = new Bitmap(1024, 1024); - StringBuilder TypedText = new StringBuilder(); - int texture; - bool mouse_in_window = false; - bool viewport_changed = true; - - MouseCursor Pencil; - - // legacy GameWindow.Mouse.* events - Vector4 mousedevice_pos; - int mousedevice_buttons; - MouseState mousedevice_state; - - // new GameWindow.Mouse* events - Vector4 mouse_pos; - int mouse_buttons; - MouseState mouse_state; - - // legacy GameWindow.Keyboard.Key* events - Dictionary legacy_keyboard_keys = new Dictionary(); - KeyboardState legacy_keyboard_state; - KeyModifiers legacy_keyboard_modifiers; - - //new GameWindow.Key* events - Dictionary keyboard_keys = new Dictionary(); - KeyboardState keyboard_state; - KeyModifiers keyboard_modifiers; - - // time drift - Stopwatch watch = new Stopwatch(); - double update_time, render_time; - - // timing information - double timestamp; - int update_count; - int update_fps; - int render_count; - int render_fps; - - // position of moving objects on screen - double variable_update_timestep_pos = -1; - double variable_refresh_timestep_pos = -1; - double fixed_update_timestep_pos = -1; - - public GameWindowStates() - : base(800, 600, GraphicsMode.Default) - { - VSync = VSyncMode.On; - Keyboard.KeyRepeat = false; - KeyDown += KeyDownHandler; - KeyUp += KeyUpHandler; - KeyPress += KeyPressHandler; - Keyboard.KeyDown += KeyboardDeviceDownHandler; - Keyboard.KeyUp += KeyboardDeviceUpHandler; - - MouseEnter += delegate { mouse_in_window = true; }; - MouseLeave += delegate { mouse_in_window = false; }; - - Mouse.Move += MouseDeviceMoveHandler; - Mouse.WheelChanged += MouseDeviceWheelHandler; - Mouse.ButtonDown += MouseDeviceButtonHandler; - Mouse.ButtonUp += MouseDeviceButtonHandler; - - MouseMove += MouseMoveHandler; - MouseWheel += MouseWheelHandler; - MouseDown += MouseButtonHandler; - MouseUp += MouseButtonHandler; - } - - #region Keyboard Events - - void KeyPressHandler(object sender, KeyPressEventArgs e) - { - if (TypedText.Length > 32) - TypedText.Remove(0, 1); - - TypedText.Append(e.KeyChar); - } - - void KeyDownHandler(object sender, KeyboardKeyEventArgs e) - { - switch (e.Key) - { - case OpenTK.Input.Key.Escape: - if (!CursorVisible) - CursorVisible = true; - else - Exit(); - break; - - case Key.Number1: WindowState = WindowState.Normal; break; - case Key.Number2: WindowState = WindowState.Maximized; break; - case Key.Number3: WindowState = WindowState.Fullscreen; break; - case Key.Number4: WindowState = WindowState.Minimized; break; - - case Key.Number5: WindowBorder = WindowBorder.Resizable; break; - case Key.Number6: WindowBorder = WindowBorder.Fixed; break; - case Key.Number7: WindowBorder = WindowBorder.Hidden; break; - - case Key.Left: X = X - 16; break; - case Key.Right: X = X + 16; break; - case Key.Up: Y = Y - 16; break; - case Key.Down: Y = Y + 16; break; - - case Key.KeypadPlus: - case Key.Plus: Size += new Size(16, 16); break; - - case Key.KeypadMinus: - case Key.Minus: Size -= new Size(16, 16); break; - - case Key.V: - VSync = VSync == VSyncMode.On ? VSyncMode.Off : VSyncMode.On; - break; - - case Key.BracketLeft: TargetUpdateFrequency--; break; - case Key.BracketRight: TargetUpdateFrequency++; break; - case Key.Comma: TargetRenderFrequency--; break; - case Key.Period: TargetRenderFrequency++; break; - - case Key.Enter: - CursorVisible = !CursorVisible; - break; - - case Key.C: - if (Cursor == MouseCursor.Default) - Cursor = Pencil; - else if (Cursor == Pencil) - Cursor = MouseCursor.Empty; - else - Cursor = MouseCursor.Default; - break; - - case Key.Space: - Point p = new Point(Width / 2, Height / 2); - p = PointToScreen(p); - OpenTK.Input.Mouse.SetPosition(p.X, p.Y); - break; - - case Key.R: - Keyboard.KeyRepeat = !Keyboard.KeyRepeat; - break; - } - - if (!keyboard_keys.ContainsKey(e.Key)) - { - keyboard_keys.Add(e.Key, 0); - } - keyboard_keys[e.Key] = keyboard_keys[e.Key] + 1; - keyboard_modifiers = e.Modifiers; - keyboard_state = e.Keyboard; - } - - void KeyUpHandler(object sender, KeyboardKeyEventArgs e) - { - keyboard_keys.Remove(e.Key); - keyboard_modifiers = e.Modifiers; - keyboard_state = e.Keyboard; - } - - void KeyboardDeviceDownHandler(object sender, KeyboardKeyEventArgs e) - { - if (!legacy_keyboard_keys.ContainsKey(e.Key)) - { - legacy_keyboard_keys.Add(e.Key, 0); - } - legacy_keyboard_keys[e.Key] = legacy_keyboard_keys[e.Key] + 1; - legacy_keyboard_modifiers = e.Modifiers; - legacy_keyboard_state = e.Keyboard; - } - - void KeyboardDeviceUpHandler(object sender, KeyboardKeyEventArgs e) - { - legacy_keyboard_keys.Remove(e.Key); - legacy_keyboard_modifiers = e.Modifiers; - legacy_keyboard_state = e.Keyboard; - } - - #endregion - - #region MouseDevice events - - void MouseDeviceMoveHandler(object sender, MouseMoveEventArgs e) - { - mousedevice_pos.X = e.X; - mousedevice_pos.Y = e.Y; - mousedevice_pos.Z = e.Mouse.Scroll.X; - mousedevice_pos.W = e.Mouse.Scroll.Y; - mousedevice_state = e.Mouse; - } - - void MouseDeviceButtonHandler(object sender, MouseButtonEventArgs e) - { - if (e.IsPressed) - { - mousedevice_buttons |= 1 << (int)e.Button; - Cursor = Pencil; - } - else - { - mousedevice_buttons &= ~(1 << (int)e.Button); - Cursor = MouseCursor.Default; - } - mousedevice_state = e.Mouse; - } - - void MouseDeviceWheelHandler(object sender, MouseWheelEventArgs e) - { - mousedevice_pos.Z = e.Mouse.Scroll.X; - mousedevice_pos.W = e.Mouse.Scroll.Y; - mousedevice_state = e.Mouse; - } - - #endregion - - #region Mouse events - - void MouseMoveHandler(object sender, MouseMoveEventArgs e) - { - mouse_pos.X = e.X; - mouse_pos.Y = e.Y; - mouse_pos.Z = e.Mouse.Scroll.X; - mouse_pos.W = e.Mouse.Scroll.Y; - mouse_state = e.Mouse; - } - - void MouseButtonHandler(object sender, MouseButtonEventArgs e) - { - if (e.IsPressed) - { - mouse_buttons |= 1 << (int)e.Button; - } - else - { - mouse_buttons &= ~(1 << (int)e.Button); - } - mouse_state = e.Mouse; - } - - void MouseWheelHandler(object sender, MouseWheelEventArgs e) - { - mouse_pos.Z = e.Mouse.Scroll.X; - mouse_pos.W = e.Mouse.Scroll.Y; - mouse_state = e.Mouse; - } - - #endregion - - #region Private Members - - static int Clamp(int val, int min, int max) - { - return val > max ? max : val < min ? min : val; - } - - static float DrawString(Graphics gfx, string str, int line) - { - return DrawString(gfx, str, line, 0); - } - - static float DrawString(Graphics gfx, string str, int line, float offset) - { - gfx.DrawString(str, TextFont, Brushes.White, new PointF(offset, line * TextFont.Height)); - return offset + gfx.MeasureString(str, TextFont).Width; - } - - static void KeyboardStateToString(KeyboardState state, StringBuilder sb) - { - for (int key_index = 0; key_index < (int)Key.LastKey; key_index++) - { - Key k = (Key)key_index; - if (state[k]) - { - sb.Append(k); - sb.Append(" "); - } - } - } - - int DrawKeyboards(Graphics gfx, int line) - { - line++; - DrawString(gfx, "Keyboard:", line++); - for (int i = 0; i < 4; i++) - { - var state = OpenTK.Input.Keyboard.GetState(i); - if (state.IsConnected) - { - StringBuilder sb = new StringBuilder(); - sb.Append(i); - sb.Append(": "); - KeyboardStateToString(state, sb); - DrawString(gfx, sb.ToString(), line++); - } - } - return line; - } - - static int DrawMice(Graphics gfx, int line) - { - line++; - DrawString(gfx, String.Format("Cursor: {0}", OpenTK.Input.Mouse.GetCursorState()), line++); - DrawString(gfx, "Mouse:", line++); - for (int i = 0; i < 4; i++) - { - var state = OpenTK.Input.Mouse.GetState(i); - if (state.IsConnected) - { - DrawString(gfx, state.ToString(), line++); - } - } - return line; - } - - int DrawKeyboardDevice(Graphics gfx, int line) - { - StringBuilder sb = new StringBuilder(); - sb.Append("KeyboardDevice: "); - for (Key key = 0; key < Key.LastKey; key++) - { - if (Keyboard[key]) - { - sb.Append(key); - sb.Append(" "); - } - } - DrawString(gfx, sb.ToString(), line++); - - sb.Remove(0, sb.Length); - sb.Append("KeyboardDevice events: ["); - sb.Append(legacy_keyboard_modifiers); - sb.Append("] "); - foreach (var pair in legacy_keyboard_keys) - { - sb.Append(pair.Key); - sb.Append(":"); - sb.Append(pair.Value); - sb.Append(" "); - } - DrawString(gfx, sb.ToString(), line++); - - sb.Remove(0, sb.Length); - sb.Append("KeyboardDevice state: "); - KeyboardStateToString(legacy_keyboard_state, sb); - DrawString(gfx, sb.ToString(), line++); - - sb.Remove(0, sb.Length); - sb.Append("Keyboard events: ["); - sb.Append(keyboard_modifiers); - sb.Append("] "); - foreach (var pair in keyboard_keys) - { - sb.Append(pair.Key); - sb.Append(":"); - sb.Append(pair.Value); - sb.Append(" "); - } - DrawString(gfx, sb.ToString(), line++); - - sb.Remove(0, sb.Length); - sb.Append("Keyboard state: "); - KeyboardStateToString(keyboard_state, sb); - DrawString(gfx, sb.ToString(), line++); - - return line; - } - - int DrawMouseDevice(Graphics gfx, int line) - { - StringBuilder sb = new StringBuilder(); - sb.Append("MouseDevice: "); - sb.AppendFormat("[{0}, {1}, {2:0.00}] ", - Mouse.X, Mouse.Y, Mouse.WheelPrecise); - for (var i = MouseButton.Left; i < MouseButton.LastButton; i++) - { - if (Mouse[i]) - { - sb.Append(i); - sb.Append(" "); - } - } - sb.AppendLine(); - DrawString(gfx, sb.ToString(), line++); - - sb.Remove(0, sb.Length); - sb.Append("MouseDevice events: "); - sb.AppendFormat("[{0}, {1}, {2:0.00}, {3:0.00}] ", - mousedevice_pos.X, mousedevice_pos.Y, - mousedevice_pos.Z, mousedevice_pos.W); - for (var i = MouseButton.Left; i < MouseButton.LastButton; i++) - { - if ((mousedevice_buttons & (1 << (int)i)) != 0) - { - sb.Append(i); - sb.Append(" "); - } - } - sb.Append(" "); - sb.AppendLine(mousedevice_state.ToString()); - DrawString(gfx, sb.ToString(), line++); - - sb.Remove(0, sb.Length); - sb.Append("Mouse events: "); - sb.AppendFormat("[{0}, {1}, {2:0.00}, {3:0.00}] ", - mouse_pos.X, mouse_pos.Y, - mouse_pos.Z, mouse_pos.W); - for (var i = MouseButton.Left; i < MouseButton.LastButton; i++) - { - if ((mouse_buttons & (1 << (int)i)) != 0) - { - sb.Append(i); - sb.Append(" "); - } - } - sb.Append(" "); - sb.AppendLine(mouse_state.ToString()); - DrawString(gfx, sb.ToString(), line++); - return line; - } - - static int DrawLegacyJoysticks(Graphics gfx, IList joysticks, int line) - { - line++; - DrawString(gfx, "Legacy Joystick:", line++); - - int joy_index = -1; - foreach (var joy in joysticks) - { - joy_index++; - if (!String.IsNullOrEmpty(joy.Description)) - { - StringBuilder sb = new StringBuilder(); - sb.Append(joy_index); - sb.Append(": '"); - sb.Append(joy.Description); - sb.Append("' "); - - for (int i = 0; i < joy.Axis.Count; i++) - { - sb.Append(joy.Axis[i]); - sb.Append(" "); - } - - for (int i = 0; i < joy.Button.Count; i++) - { - sb.Append(joy.Button[i]); - sb.Append(" "); - } - DrawString(gfx, sb.ToString(), line++); - } - } - - return line; - } - - #endregion - - protected override void OnUpdateFrame(FrameEventArgs e) - { - double clock_time = watch.Elapsed.TotalSeconds; - update_time += e.Time; - timestamp += e.Time; - update_count++; - - using (Graphics gfx = Graphics.FromImage(TextBitmap)) - { - int line = 0; - - gfx.Clear(Color.Black); - gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - - // OpenGL information - DrawString(gfx, GL.GetString(StringName.Renderer), line++); - DrawString(gfx, GL.GetString(StringName.Version), line++); - DrawString(gfx, Context.GraphicsMode.ToString(), line++); - - // GameWindow information - line++; - DrawString(gfx, "GameWindow:", line++); - DrawString(gfx, String.Format("[1 - 4]:[5 - 7]: WindowState.{0}:WindowBorder.{1}", - this.WindowState, this.WindowBorder), line++); - DrawString(gfx, String.Format("[V]: VSync.{0}.", VSync), line++); - DrawString(gfx, String.Format("Bounds: {0}", Bounds), line++); - DrawString(gfx, String.Format("ClientRectangle: {0}", ClientRectangle), line++); - DrawString(gfx, String.Format("Mouse {0} and {1}. {2}.", - mouse_in_window ? "inside" : "outside", - CursorVisible ? "visible" : "hidden", - Focused ? "Focused" : "Not focused"), line++); - - line = DrawKeyboardDevice(gfx, line); - line = DrawMouseDevice(gfx, line); - - // Timing information - line++; - DrawString(gfx, "Timing:", line++); - DrawString(gfx, - String.Format("Frequency: update {4} ({0:f2}/{1:f2}); render {5} ({2:f2}/{3:f2})", - UpdateFrequency, TargetUpdateFrequency, - RenderFrequency, TargetRenderFrequency, - update_fps, render_fps), - line++); - DrawString(gfx, - String.Format("Period: update {4:N4} ({0:f4}/{1:f4}); render {5:N4} ({2:f4}/{3:f4})", - UpdatePeriod, TargetUpdatePeriod, - RenderPeriod, TargetRenderPeriod, - 1.0 / update_fps, 1.0 / render_fps), - line++); - DrawString(gfx, String.Format("Time: update {0:f4}; render {1:f4}", - UpdateTime, RenderTime), line++); - DrawString(gfx, String.Format("Drift: clock {0:f4}; update {1:f4}; render {2:f4}", - clock_time, clock_time - update_time, clock_time - render_time), line++); - DrawString(gfx, String.Format("Text: {0}", TypedText.ToString()), line++); - - if (timestamp >= 1) - { - timestamp -= 1; - update_fps = update_count; - render_fps = render_count; - update_count = 0; - render_count = 0; - - } - - // Input information - line = DrawKeyboards(gfx, line); - line = DrawMice(gfx, line); - line = DrawJoysticks(gfx, line); - line = DrawLegacyJoysticks(gfx, Joysticks, line); - } - - fixed_update_timestep_pos += TargetUpdatePeriod; - variable_update_timestep_pos += e.Time; - if (fixed_update_timestep_pos >= 1) - fixed_update_timestep_pos -= 2; - if (variable_update_timestep_pos >= 1) - variable_update_timestep_pos -= 2; - } - - int DrawJoysticks(Graphics gfx, int line) - { - line++; - DrawString(gfx, "GamePad:", line++); - for (int i = 0; i < 4; i++) - { - GamePadCapabilities caps = GamePad.GetCapabilities(i); - GamePadState state = GamePad.GetState(i); - if (state.IsConnected) - { - DrawString(gfx, String.Format("{0}: {1}", i, caps), line++); - DrawString(gfx, state.ToString(), line++); - } - } - - line++; - DrawString(gfx, "Joystick:", line++); - for (int i = 0; i < 4; i++) - { - JoystickCapabilities caps = Joystick.GetCapabilities(i); - JoystickState state = Joystick.GetState(i); - if (state.IsConnected) - { - DrawString(gfx, String.Format("{0}: {1}", i, caps), line++); - DrawString(gfx, state.ToString(), line++); - } - } - - return line; - } - - protected override void OnLoad(EventArgs e) - { - watch.Start(); - - using (var bitmap = new Bitmap("Data/Textures/cursor.png")) - { - var data = bitmap.LockBits( - new Rectangle(0, 0, bitmap.Width, bitmap.Height), - System.Drawing.Imaging.ImageLockMode.ReadOnly, - System.Drawing.Imaging.PixelFormat.Format32bppPArgb); - - Pencil = new OpenTK.MouseCursor( - 2, 21, data.Width, data.Height, data.Scan0); - } - - GL.ClearColor(Color.MidnightBlue); - - GL.Enable(EnableCap.Texture2D); - GL.Enable(EnableCap.Blend); - GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcColor); - - texture = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, texture); - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, TextBitmap.Width, TextBitmap.Height, - 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Nearest); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Nearest); - } - - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - viewport_changed = true; - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - render_time += e.Time; - render_count++; - - GL.Clear(ClearBufferMask.ColorBufferBit); - - if (viewport_changed) - { - viewport_changed = false; - GL.Viewport(0, 0, Width, Height); - } - - DrawText(); - - DrawMovingObjects(); - - variable_refresh_timestep_pos += e.Time; - if (variable_refresh_timestep_pos >= 1) - variable_refresh_timestep_pos -= 2; - - SwapBuffers(); - } - - // Uploads our text Bitmap to an OpenGL texture - // and displays is to screen. - private void DrawText() - { - System.Drawing.Imaging.BitmapData data = TextBitmap.LockBits( - new System.Drawing.Rectangle(0, 0, TextBitmap.Width, TextBitmap.Height), - System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, TextBitmap.Width, TextBitmap.Height, PixelFormat.Bgra, - PixelType.UnsignedByte, data.Scan0); - TextBitmap.UnlockBits(data); - - Matrix4 text_projection = Matrix4.CreateOrthographicOffCenter(0, Width, Height, 0, -1, 1); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref text_projection); - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - - GL.Color4(Color4.White); - GL.Enable(EnableCap.Texture2D); - GL.Begin(PrimitiveType.Quads); - GL.TexCoord2(0, 0); GL.Vertex2(0, 0); - GL.TexCoord2(1, 0); GL.Vertex2(TextBitmap.Width, 0); - GL.TexCoord2(1, 1); GL.Vertex2(TextBitmap.Width, TextBitmap.Height); - GL.TexCoord2(0, 1); GL.Vertex2(0, TextBitmap.Height); - GL.End(); - GL.Disable(EnableCap.Texture2D); - } - - // Draws three moving objects, using three different timing methods: - // 1. fixed framerate based on TargetUpdatePeriod - // 2. variable framerate based on UpdateFrame e.Time - // 3. variable framerate based on RenderFrame e.Time - // If the timing implementation is correct, all three objects - // should be moving at the same speed, regardless of the current - // UpdatePeriod and RenderPeriod. - void DrawMovingObjects() - { - Matrix4 thing_projection = Matrix4.CreateOrthographic(2, 2, -1, 1); - GL.MatrixMode(MatrixMode.Projection); - GL.LoadMatrix(ref thing_projection); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - GL.Translate(fixed_update_timestep_pos, -0.2, 0); - GL.Color4(Color4.Red); - DrawRectangle(); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - GL.Translate(variable_update_timestep_pos, -0.4, 0); - GL.Color4(Color4.DarkGoldenrod); - DrawRectangle(); - - GL.MatrixMode(MatrixMode.Modelview); - GL.LoadIdentity(); - GL.Translate(variable_refresh_timestep_pos, -0.8, 0); - GL.Color4(Color4.DarkGreen); - DrawRectangle(); - } - - private void DrawRectangle() - { - GL.Begin(PrimitiveType.Quads); - GL.Vertex2(-0.05, -0.05); - GL.Vertex2(+0.05, -0.05); - GL.Vertex2(+0.05, +0.05); - GL.Vertex2(-0.05, +0.05); - GL.End(); - } - - public static void Main() - { - using (GameWindowStates ex = new GameWindowStates()) - { - Utilities.SetWindowTitle(ex); - ex.Run(30.0); - } - } - } -} diff --git a/Source/Examples/OpenTK/Test/GameWindowStates.rtf b/Source/Examples/OpenTK/Test/GameWindowStates.rtf deleted file mode 100644 index f4c9a1ddf98be551ee3986ce8819febd1291720e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1099 zcmaJ=OOMkq5a!%pF-IQT(xfe~o)#p~9^e3rxcK74lfm!&s0=@>MPs!QP2EZI7}ju0TAKa&ym%C~ zGmaPrdqJp*HyhCsqAd$inGwrkA3-lgixx=+NAT4*0hJE0TWyO~$=7cEet#B6ji-aQ zYAeRN5Q8KoYG!AoZHx70BP!AO@*UjSKu(Qy(9VjAnfbDe=ta8SciMxO{a_G$=T5cs z=pl3nwH#!njSiX*T$9ee$R2<3N_SepU4THcK6p6bL*;n=4fJmG2+}GzB^2NhZSd(t zX+IeGkcayq13sM!+5(|85Oj~LE6YjCCw7>e@%hbM%(ttzPa)_MKsAF49jWcidy^t)$kWJ)E! znng2DWgvIdiZhVl*>K%

    cF#zk$tO#=s^c@2(Wt$$-?z8b4gu7c01r$vVrExDi~g z&N)u-C`og4FduM2 zzXRx8-%Ba~w|0}){u~q&pRdglV;!c7Pqk-1`<^LycL`1W{<#~F6<6rROxt@T)OiB13j diff --git a/Source/Examples/OpenTK/Test/MathSerialization.cs b/Source/Examples/OpenTK/Test/MathSerialization.cs deleted file mode 100644 index 08994eda..00000000 --- a/Source/Examples/OpenTK/Test/MathSerialization.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK team. - * This notice may not be removed. - * See license.txt for licensing detailed licensing details. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Xml; - -#if false - -using System.Xml.Serialization; - - -namespace Examples.Tests -{ - [Example("Serialization", ExampleCategory.Test)] - public class MathSerialization - { - public static void Main() - { - using (MemoryStream stream = new MemoryStream()) - { - XmlSerializer xs = new XmlSerializer(typeof(Matrix4)); - - { - XmlWriterSettings settings = new XmlWriterSettings(); - settings.NewLineHandling = NewLineHandling.Entitize; - settings.Indent = true; - XmlWriter xw = XmlTextWriter.Create(stream, settings); - - xs.Serialize(xw, Matrix4.Identity); - - xw.Close(); - } - - stream.Position = 0; - byte[] text = new byte[stream.Length]; - int pos = 0; - do - { - pos += stream.Read(text, pos, (int)stream.Length); - } - while (pos != stream.Length); - - Console.WriteLine(System.Text.Encoding.Default.GetChars(text)); - - stream.Position = 0; - Matrix4 matrix = (Matrix4)xs.Deserialize(stream); - - if (Matrix4.Identity == matrix) - Console.WriteLine("Matrix deserialized correctly."); - else - Console.WriteLine("Error deserializing matrix."); - - Console.WriteLine("Press any key to continue..."); - Console.ReadKey(false); - } - } - } -} - -#endif \ No newline at end of file diff --git a/Source/Examples/OpenTK/Test/MathSpeed.cs b/Source/Examples/OpenTK/Test/MathSpeed.cs deleted file mode 100644 index 0da9c2d1..00000000 --- a/Source/Examples/OpenTK/Test/MathSpeed.cs +++ /dev/null @@ -1,91 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; - -namespace Examples.Tests -{ - [Example("Math speed test", ExampleCategory.OpenTK, "Test", Visible = false)] - public class MathSpeed - { - public static void Main() - { - /* - Stopwatch watch = new Stopwatch(); - - Vector3 a = new Vector3(0.0f, 0.0f, 0.0f); - Vector3 b = new Vector3(1.0f, 1.0f, 1.0f); - Vector3 c = new Vector3(3.0f, 3.0f, 3.0f); - Vector3 d = new Vector3(4.0f, 4.0f, 4.0f); - Vector3 e = Vector3.Zero; - Vector3 res; - - // Force the JIT to compile the functions. - Vector3.Add(a, b); - Vector3.Add(ref a, ref b, out res); - res = a + b; - res = Vector3.Zero; - - watch.Reset(); - watch.Start(); - for (int i = 100000000; --i != 0; ) - ; - watch.Stop(); - Trace.WriteLine(String.format("Noop\t\t\t\t\t\t{0}ns", (watch.Elapsed.TotalSeconds / 10.0).ToString())); - - watch.Reset(); - watch.Start(); - for (int i = 100000000; --i != 0; ) - res = Vector3.Add(res, a); - watch.Stop(); - res += res; // To make sure the whole for-loop isn't optimized-out - Trace.WriteLine(String.format("res = Vector3.Add(a, b)\t\t\t{0}ns", (watch.Elapsed.TotalSeconds / 10.0).ToString())); - res = Vector3.Zero; - - watch.Reset(); - watch.Start(); - for (int i = 100000000; --i != 0; ) - res = res + a; - watch.Stop(); - res += res; // To make sure the whole for-loop isn't optimized-out - Trace.WriteLine(String.format("res = a + b\t\t\t\t\t{0}ns", (watch.Elapsed.TotalSeconds / 10.0).ToString())); - - watch.Reset(); - watch.Start(); - for (int i = 100000000; --i != 0; ) - Vector3.Add(ref res, ref a, out res); - watch.Stop(); - res += res; // To make sure the whole for-loop isn't optimized-out - Trace.WriteLine(String.format("Vector3.Add(ref a, ref b, out res)\t{0}ns", (watch.Elapsed.TotalSeconds / 10.0).ToString())); -*/ - /* - a = Vector3.UnitX; - b = Vector3.UnitY; - res = Vector3.Add(ref a, ref b); - Trace.WriteLine(res.ToString()); - - a = Vector3.UnitX; - b = Vector3.UnitY; - Vector3.Add(a, b, out res); - Trace.WriteLine(res.ToString()); - - Vector2Im q = new Vector2(0.0f, 1.0f); - Vector2Im p = new Vector2(2.0f, 3.0f); - Vector2Im s = Vector2.Add(p, q); - p = s + q; - */ - } - - //static Vector3 pos = new Vector3(); - - //static Vector3 Pos - //{ - // get { return pos; } - // set { pos = value; } - //} - } -} diff --git a/Source/Examples/OpenTK/Test/MatrixTest.cs b/Source/Examples/OpenTK/Test/MatrixTest.cs deleted file mode 100644 index e19646b6..00000000 --- a/Source/Examples/OpenTK/Test/MatrixTest.cs +++ /dev/null @@ -1,32 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using OpenTK; - -namespace Examples.Tests -{ - [Example("Matrix math test", ExampleCategory.OpenTK, "Test", Visible = false)] - public class MatrixTest - { - public static void Main() - { - float x = 1.0f; - float y = 1.0f; - float z = 1.0f; - - Matrix4 translation = new Matrix4(new Vector4(1, 0, 0, 2), new Vector4(0, 1, 0, 3), new Vector4(0, 0, 1, -1), new Vector4(0, 0, 0, 1)); - Vector4 point = new Vector4(x, y, z, 1); - - Vector4 result = Vector4.Transform(point, translation); - - Trace.WriteLine("Result should be: (3, 4, 0, 1) : " + result); - - } - } -} - diff --git a/Source/Examples/OpenTK/Test/Multithreading.cs b/Source/Examples/OpenTK/Test/Multithreading.cs deleted file mode 100644 index 7e8383be..00000000 --- a/Source/Examples/OpenTK/Test/Multithreading.cs +++ /dev/null @@ -1,56 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; - -namespace Examples.Tests -{ - [Example("Multithreading Test", ExampleCategory.OpenTK, "Test")] - class Multithreading - { - public static void Main() - { - const int ThreadCount = 2; - List threads = new List(); - - // launch threads - for (int i = 0; i < ThreadCount; i++) - { - Thread t = new Thread(RunGame); - t.IsBackground = true; - t.Priority = ThreadPriority.BelowNormal; - t.Start(); - threads.Add(t); - } - - // wait for exit - foreach (Thread t in threads) - { - t.Join(); - } - } - - static void RunGame() - { - using (Tutorial.T03_Immediate_Mode_Cube game = new Examples.Tutorial.T03_Immediate_Mode_Cube()) - { - Utilities.SetWindowTitle(game); - game.KeyUp += delegate(object sender, OpenTK.Input.KeyboardKeyEventArgs e) - { - if (e.Key == OpenTK.Input.Key.F11) - { - if (game.WindowState == OpenTK.WindowState.Fullscreen) - game.WindowState = OpenTK.WindowState.Normal; - else - game.WindowState = OpenTK.WindowState.Fullscreen; - } - }; - game.Run(30.0); - } - } - } -} diff --git a/Source/Examples/OpenTK/Test/PointToClient.cs b/Source/Examples/OpenTK/Test/PointToClient.cs deleted file mode 100644 index 78e281b6..00000000 --- a/Source/Examples/OpenTK/Test/PointToClient.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Diagnostics; -using System.Drawing; -using OpenTK; - -namespace Examples.Tests -{ - [Example("PointToClient Test", ExampleCategory.OpenTK, "NativeWindow")] - public class PointToClientTest - { - public static void Main() - { - using (var window = new NativeWindow()) - { - Trace.WriteLine(String.Format("Window bounds: {0}", window.Bounds)); - Trace.WriteLine(String.Format("Window client: {0}", window.ClientRectangle)); - - Point pclient = new Point(100, 100); - Point pscreen = window.PointToScreen(pclient); - Point ptest = window.PointToClient(pscreen); - Trace.WriteLine(String.Format("Client: {0} -> Screen: {1} -> Client: {2}", - pclient, pscreen, ptest)); - Trace.WriteLine(String.Format("Test {0}", - ptest == pclient ? "succeeded" : "failed")); - - pscreen = new Point(100, 100); - pclient = window.PointToClient(pscreen); - ptest = window.PointToScreen(pclient); - Trace.WriteLine(String.Format("Screen: {0} -> Client: {1} -> Screen: {2}", - pscreen, pclient, ptest)); - Trace.WriteLine(String.Format("Test {0}", - ptest == pscreen ? "succeeded" : "failed")); - } - } - } -} - diff --git a/Source/Examples/OpenTK/Test/TestGraphicsModes.cs b/Source/Examples/OpenTK/Test/TestGraphicsModes.cs deleted file mode 100644 index 4af88c45..00000000 --- a/Source/Examples/OpenTK/Test/TestGraphicsModes.cs +++ /dev/null @@ -1,49 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using OpenTK.Graphics; -using OpenTK; -using System.Windows.Forms; - -namespace Examples.Tests -{ - [Example("Test GraphicsModes", ExampleCategory.OpenTK, "Test", Documentation = "TestGraphicsModes")] - public class TestGraphicsModes - { - static void Main() - { - Dictionary modes = new Dictionary(); - Trace.WriteLine("Cl (RGBA): Color format (total bits and bits per channel)."); - Trace.WriteLine("Dp : Depth buffer bits."); - Trace.WriteLine("St : Stencil buffer bits."); - Trace.WriteLine("AA : Sample count for anti-aliasing."); - Trace.WriteLine("Stereo : Stereoscoping rendering supported."); - Trace.WriteLine(""); - Trace.WriteLine("Cl (RGBA), Dp, St, AA, Stereo"); - Trace.WriteLine("-----------------------------"); - foreach (ColorFormat color in new ColorFormat[] { 32, 24, 16, 8 }) - foreach (int depth in new int[] { 24, 16 }) - foreach (int stencil in new int[] { 8, 0 }) - foreach (int samples in new int[] { 0, 2, 4, 6, 8, 16 }) - foreach (bool stereo in new bool[] { false, true }) - { - try - { - GraphicsMode mode = new GraphicsMode(color, depth, stencil, samples, 0, 2, stereo); - if (!modes.ContainsKey(mode)) - modes.Add(mode, mode); - } - catch - { } - } - - foreach (GraphicsMode mode in modes.Keys) - Trace.WriteLine(String.Format("{0}, {1:00}, {2:00}, {3:00}, {4}", mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples, mode.Stereo)); - } - } -} diff --git a/Source/Examples/OpenTK/Test/TestResolutionChanges.cs b/Source/Examples/OpenTK/Test/TestResolutionChanges.cs deleted file mode 100644 index 740f60f4..00000000 --- a/Source/Examples/OpenTK/Test/TestResolutionChanges.cs +++ /dev/null @@ -1,57 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Diagnostics; -using System.Threading; - -using OpenTK; - -namespace Examples.Tests -{ - [Example("Test Resolution Changes", ExampleCategory.OpenTK, "Test", Documentation="TestResolutionChanges")] - public class TestResolutionChanges - { - public static void Main() - { - for (int i = 0; i < 6; i++) - { - DisplayDevice dev = DisplayDevice.GetDisplay(DisplayIndex.First + i); - if (dev != null) - { - Print(dev.ToString()); - - dev.ChangeResolution(dev.SelectResolution(640, 480, 32, 60.0f)); - Thread.Sleep(1000); - Print(dev.ToString()); - - dev.RestoreResolution(); - Thread.Sleep(1000); - Print(dev.ToString()); - } - } - } - - static void Print(string msg) - { - Trace.WriteLine(msg); - - // Also display a MessageBox when running on a platform - // with WinForms support. - try - { - if (Configuration.RunningOnWindows || Configuration.RunningOnX11 || Configuration.RunningOnMacOS) - { - MessageBox.Show(msg); - } - } - catch - { - } - } - } -} diff --git a/Source/Examples/OpenTK/Test/TestShaderUtf8Support.cs b/Source/Examples/OpenTK/Test/TestShaderUtf8Support.cs deleted file mode 100644 index f61a3b2b..00000000 --- a/Source/Examples/OpenTK/Test/TestShaderUtf8Support.cs +++ /dev/null @@ -1,238 +0,0 @@ -// This code was written for the OpenTK library and has been released -// to the Public Domain. -// It is provided "as is" without express or implied warranty of any kind. - -using System; -using System.Diagnostics; -using System.IO; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Tutorial -{ - [Example("Shader UTF8 support", ExampleCategory.OpenTK, "OpenGL")] - public class TestShaderUtf8Support : GameWindow - { - string vertexShaderSource = @" -#version 130 - -precision highp float;//日本語文字 Japanese Characters - -uniform mat4 projection_matrix; -uniform mat4 modelview_matrix; - -in vec3 in_position; -in vec3 in_normal; - -out vec3 normal; - -void main(void) -{ - //works only for orthogonal modelview - normal = (modelview_matrix * vec4(in_normal, 0)).xyz; - - gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1); -}"; - - string fragmentShaderSource = @" -#version 130 - -precision highp float; - -const vec3 ambient = vec3(0.1, 0.1, 0.1); -const vec3 lightVecNormalized = normalize(vec3(0.5, 0.5, 2.0)); -const vec3 lightColor = vec3(0.9, 0.9, 0.7); - -in vec3 normal; - -out vec4 out_frag_color; - -void main(void) -{ - float diffuse = clamp(dot(lightVecNormalized, normalize(normal)), 0.0, 1.0); - out_frag_color = vec4(ambient + diffuse * lightColor, 1.0); -}"; - - int vertexShaderHandle, - fragmentShaderHandle, - shaderProgramHandle, - modelviewMatrixLocation, - projectionMatrixLocation, - vaoHandle, - positionVboHandle, - normalVboHandle, - eboHandle; - - Vector3[] positionVboData = new Vector3[]{ - new Vector3(-1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, 1.0f, -1.0f), - new Vector3(-1.0f, 1.0f, -1.0f) }; - - int[] indicesVboData = new int[]{ - // front face - 0, 1, 2, 2, 3, 0, - // top face - 3, 2, 6, 6, 7, 3, - // back face - 7, 6, 5, 5, 4, 7, - // left face - 4, 0, 3, 3, 7, 4, - // bottom face - 0, 1, 5, 5, 4, 0, - // right face - 1, 5, 6, 6, 2, 1, }; - - Matrix4 projectionMatrix, modelviewMatrix; - - public TestShaderUtf8Support() - : base(640, 480, - new GraphicsMode(), "OpenGL 3 Example", 0, - DisplayDevice.Default, 3, 0, - GraphicsContextFlags.ForwardCompatible | GraphicsContextFlags.Debug) - { } - - protected override void OnLoad (System.EventArgs e) - { - VSync = VSyncMode.On; - - CreateShaders(); - CreateVBOs(); - CreateVAOs(); - - // Other state - GL.Enable(EnableCap.DepthTest); - GL.ClearColor(System.Drawing.Color.MidnightBlue); - } - - void CreateShaders() - { - vertexShaderHandle = GL.CreateShader(ShaderType.VertexShader); - fragmentShaderHandle = GL.CreateShader(ShaderType.FragmentShader); - - GL.ShaderSource(vertexShaderHandle, vertexShaderSource); - GL.ShaderSource(fragmentShaderHandle, fragmentShaderSource); - - GL.CompileShader(vertexShaderHandle); - string log = GL.GetShaderInfoLog(vertexShaderHandle); - if (log.Length != 0) { - Debug.Print(log); - } - GL.CompileShader(fragmentShaderHandle); - - Debug.WriteLine(GL.GetShaderInfoLog(vertexShaderHandle)); - Debug.WriteLine(GL.GetShaderInfoLog(fragmentShaderHandle)); - - // Create program - shaderProgramHandle = GL.CreateProgram(); - - GL.AttachShader(shaderProgramHandle, vertexShaderHandle); - GL.AttachShader(shaderProgramHandle, fragmentShaderHandle); - - GL.LinkProgram(shaderProgramHandle); - - Debug.WriteLine(GL.GetProgramInfoLog(shaderProgramHandle)); - - GL.UseProgram(shaderProgramHandle); - - // Set uniforms - projectionMatrixLocation = GL.GetUniformLocation(shaderProgramHandle, "projection_matrix"); - modelviewMatrixLocation = GL.GetUniformLocation(shaderProgramHandle, "modelview_matrix"); - - float aspectRatio = ClientSize.Width / (float)(ClientSize.Height); - Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, aspectRatio, 1, 100, out projectionMatrix); - modelviewMatrix = Matrix4.LookAt(new Vector3(0, 3, 5), new Vector3(0, 0, 0), new Vector3(0, 1, 0)); - - GL.UniformMatrix4(projectionMatrixLocation, false, ref projectionMatrix); - GL.UniformMatrix4(modelviewMatrixLocation, false, ref modelviewMatrix); - } - - void CreateVBOs() - { - GL.GenBuffers(1, out positionVboHandle); - GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); - GL.BufferData(BufferTarget.ArrayBuffer, - new IntPtr(positionVboData.Length * Vector3.SizeInBytes), - positionVboData, BufferUsageHint.StaticDraw); - - GL.GenBuffers(1, out normalVboHandle); - GL.BindBuffer(BufferTarget.ArrayBuffer, normalVboHandle); - GL.BufferData(BufferTarget.ArrayBuffer, - new IntPtr(positionVboData.Length * Vector3.SizeInBytes), - positionVboData, BufferUsageHint.StaticDraw); - - GL.GenBuffers(1, out eboHandle); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, eboHandle); - GL.BufferData(BufferTarget.ElementArrayBuffer, - new IntPtr(sizeof(uint) * indicesVboData.Length), - indicesVboData, BufferUsageHint.StaticDraw); - - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); - } - - void CreateVAOs() - { - // GL3 allows us to store the vertex layout in a "vertex array object" (VAO). - // This means we do not have to re-issue VertexAttribPointer calls - // every time we try to use a different vertex layout - these calls are - // stored in the VAO so we simply need to bind the correct VAO. - GL.GenVertexArrays(1, out vaoHandle); - GL.BindVertexArray(vaoHandle); - - GL.EnableVertexAttribArray(0); - GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle); - GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); - GL.BindAttribLocation(shaderProgramHandle, 0, "in_position"); - - GL.EnableVertexAttribArray(1); - GL.BindBuffer(BufferTarget.ArrayBuffer, normalVboHandle); - GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0); - GL.BindAttribLocation(shaderProgramHandle, 1, "in_normal"); - - GL.BindBuffer(BufferTarget.ElementArrayBuffer, eboHandle); - - GL.BindVertexArray(0); - } - - protected override void OnUpdateFrame(FrameEventArgs e) - { - Matrix4 rotation = Matrix4.CreateRotationY((float)e.Time); - Matrix4.Mult(ref rotation, ref modelviewMatrix, out modelviewMatrix); - GL.UniformMatrix4(modelviewMatrixLocation, false, ref modelviewMatrix); - - var keyboard = OpenTK.Input.Keyboard.GetState(); - if (keyboard[OpenTK.Input.Key.Escape]) - Exit(); - } - - protected override void OnRenderFrame(FrameEventArgs e) - { - GL.Viewport(0, 0, Width, Height); - - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - GL.BindVertexArray(vaoHandle); - GL.DrawElements(PrimitiveType.Triangles, indicesVboData.Length, - DrawElementsType.UnsignedInt, IntPtr.Zero); - - SwapBuffers(); - } - - [STAThread] - public static void Main() - { - using (TestShaderUtf8Support example = new TestShaderUtf8Support()) - { - Utilities.SetWindowTitle(example); - example.Run(30); - } - } - } -} \ No newline at end of file diff --git a/Source/Examples/Properties/AssemblyInfo.cs b/Source/Examples/Properties/AssemblyInfo.cs deleted file mode 100644 index f39180d4..00000000 --- a/Source/Examples/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OpenTK.Examples")] -[assembly: AssemblyDescription("Examples showcasing OpenTK and OpenGL")] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f236c767-678f-4c20-9282-d051a3c39657")] diff --git a/Source/Examples/Properties/Resources.Designer.cs b/Source/Examples/Properties/Resources.Designer.cs deleted file mode 100644 index d99e79ae..00000000 --- a/Source/Examples/Properties/Resources.Designer.cs +++ /dev/null @@ -1,173 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18051 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace OpenTK.Examples.Properties { - using System; - - - ///

    - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenTK.Examples.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon App { - get { - object obj = ResourceManager.GetObject("App", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). - /// - internal static System.Drawing.Icon Game { - get { - object obj = ResourceManager.GetObject("Game", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap OpenAL { - get { - object obj = ResourceManager.GetObject("OpenAL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap OpenCL { - get { - object obj = ResourceManager.GetObject("OpenCL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap OpenGL { - get { - object obj = ResourceManager.GetObject("OpenGL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap OpenGLES { - get { - object obj = ResourceManager.GetObject("OpenGLES", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap OpenTK { - get { - object obj = ResourceManager.GetObject("OpenTK", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap v1x { - get { - object obj = ResourceManager.GetObject("v1x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap v2x { - get { - object obj = ResourceManager.GetObject("v2x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap v3x { - get { - object obj = ResourceManager.GetObject("v3x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap v4x { - get { - object obj = ResourceManager.GetObject("v4x", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/Source/Examples/Properties/Resources.resx b/Source/Examples/Properties/Resources.resx deleted file mode 100644 index 9aa53f94..00000000 --- a/Source/Examples/Properties/Resources.resx +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ../Resources/App.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Game.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\OpenAL.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\OpenCL.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\OpenGL.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\OpenGLES.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\OpenTK.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\v1x.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\v2x.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\v3x.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\v4x.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Source/Examples/Resources/App.ico b/Source/Examples/Resources/App.ico deleted file mode 100644 index 8d05ba6956d19b32daf72e8b14324ae196aeff86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 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 Yb9KIarbUYY&)e8@jD^>$-@w8D2YbGQ?*IS* diff --git a/Source/Examples/Resources/Game.ico b/Source/Examples/Resources/Game.ico deleted file mode 100644 index d36059193091aad50064f298b29278b10812cb66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 zcmeHQ2Y6OR){deJ>aM!G%J2T_Qp81f{asWLQIvqxAP~|+4ZTb6qLJPa1eV@H8Y!e# zdI*7#5K`z}1O%mt1zqI)?|bvj<>n*hON=4JdwpK!mbo)$&U@y}nVI`VJG%$)pSQOi z{;h8JQk4hns@mDvy#(MEZ)*2>Y96KrObwVCFg0Lmz|?@L0aF8}222f@8Zb3rYQWTh zsR2_1rUpz6m>MuOU~0hBfT;mf1EvN{4VW4*HDGGM)PSi0Qv;?3ObwVCFg0Lmz|?@L z0aF9NTMgi=Qhr%#R|$9+r~>>Ecmj9|cm{YLr~%XhY6C9={{;SJ0I&J%MSyw#4*W0h zH1KEOPrxI$$F>*zFCV%z-xm7ypT&s5NA@)t0csskg>H#_tIW{`z-V9 z+;M@!2M$xKK2x6j}2lAoXNI&NI+;h+M9yM;P|GGf`Gexznpy$-f#A%bGE$wwhxwHe? zma=*J0=D%L;9lB*k^4s>3&%i?SL_e;)wJE#uxF31J-U6qY|W~i=uPpz6x41T?%!VH z=X1Q@zyV89rYFm`)WN!51Xwp^pe&`S7bExVd-V4;0P;aU-MU(hYCR{D`-m`yi4C!u8prL=4yKkjRy{5pU=?6Ccy zVMCX}w|{Gtk9;PjB+LG+OgVb&n4CO$vQQj9eq6E-3v(fwr(8ePPSa?Ro4VBr5E(ql?o7)Xlas22wVl#y!R+ zC2cESwfSHjv^O>0(+;V3#=Q=``t_L;9viL4I_wMV%ZCmhDv>^ndSn^&8Ag8@9v}Tf zp8@^o3mhymyo8i8{aU>|h%#v7oZoRCQypNxZ}P7Fy90y5LoX`sDNoAYR5^U)h}Pf9 zzcr4-9=uXW{bzC_i-Iwwt^8Uz_yS!CfDsr17B ztMr0Xn-1!Z@6g8S-#D*-1!&aP(Q!E9_Uo!{j$@hG*|6`!c|gB)?)-VVj<)^u(@$c{ z@yjp2$PYjKAeS#+*6e|09z1kNc3><~^)a0^ZK@w+X$~+RcmZJiOFk$sZI=C$@|Px9 zCd+0Wtc!Kl0yy@znEUyH7$u|D9}weEcJfBPZ+!Qiuzkfje*XDq%|6be->`2Pbtx+c=Pvv_TIqz`r)BID`aAaP($E8yLtW5kuwNPVy?0-Fp7CJX z?3o)NQxo7-fO9m;OPgh1u;n2Cv={1*exG(!w_d$^okF7{FRONLg>PfOS73X;|Ni^C zcx3y3ym?cuz}M0DpZVeoIRW3MKzrf6ieDn2hzr9NjyzxDJ8#z3K{!AVZ zpbuxE|4@h72M)+V_`BnXmCt_prPkgbfBf;Ta_B=iM&uyB(!G@p+#WG{)EvmhIWzk$ zWv1P-KihK9PB^|Xeqb#5%0mx5)YvD`KU=kPOVW05k*OgQ@{=3u<2%^G7idQo{n$k+^E{Kfd>p8(sZQd;X`}dLh_5Lky)_pZ!v}@-e>-~N2dY5JGLEFAW zEXn?_>f_kD*)m5QJ$_s$WTm~+4m<&Oz^##ijE7UPzZ>u2cX zB*rvr9hBBJb#V^yq)`|2zkAZtwK{2ws;^F&Iejr?r4Qhk^(0W(!M;!5Pd`C_Q3I&A z#@A=3Dvx7+a%!r^J^LhWkvIn%Oxe3vd&cKRY)MLzHXpRemvd`dXi)z(@r6$?zHdC= zkFkbvw5nIL0jwW}#YFwkwR<-|uO8jkb?ezK^#j)^ zuHX1Jk34A@7mYIiR_8g09XPfqU0gz3u?rj|?cOah=%?f?B0ly;jTdWhY=Q7rL$;I8J3(C>vvs{;B`Pr-&aS3A+;y7YC-Y*CvMh?@tA31WU1cwAkXlRIp zhJ{L4_(s`?bnd*_x^HOFqH%#`v5vj)b>ASCWZjIXzPfZ#9}AS7mPN{O@X|M5Ycf!l zuMofPMjtFl59DyM(sQ*p|Lt8{ZIr6y?|2wrQ#H@8aB6 zwkKf^AbDrL=s%#3mhY`M>u7B#tX%p)+WU>~zk@v2<;3YzdV7_;zjb=*i!*W!b<-ay z?hBKd&lYS?mB0HXi`|-?`J$SCvMfZNqRKHorwz~#Do!{q(*`(JQwQ)gW<*6qkYaSC%b+Ivw@V}7sR-8J9t$Cz(JfcOJU zwQJlPKI)F2*oGLfsB-rrHsltda(n|7EApH!5*Q?{f^r2=?2 z+5_`UMc$&yGd|D6+=8-@7sjFKu!+s+YpM?n9zL``IOTX=*rCS$zarBMpH7?diF$wg zu4Flc`RWyvO)%!9ALcxuD5x>s&8@v)jZ&t}oF-Fe5z{sBdh(2^(!FOleVmBflvrfB ztTz*L%PUu}=E{YXaZp*nSSRPdMd=`7Pr6iDXXx`0*xPIv2Zf9*KJv`*?I+ zvP9#ZqRKTsKL%f{_~E>Jmtj7Ly{K?-TB|Vf@r?Ydd0*{SzCQYTCSyzbIO>*tj&T_I zw*`v-7A=~{fT17Cpy5O0!;wQ}Fyey2NC%A=A_IpF7FTyCo&T`NaGT0z{U@-VUKX6^ zSI0@zZHo^2$EWJt+HF26b~%^x$0j_p*uVh1V@uh_JnWZBPOiJeS@u%HVk6IiTdsu^ zbTIbgykEtBFK>*EI%jNS$3uM-uSu%O*B>Cv$ z@j9n1TfQ$Jju}2Nb84?*A zb61^|fxhlE*3-Vg8cSK?4Eh+yUTZz%cl|-c9-UXM&x8M`4_}d2j$PC6%;BrK_K*pG zVBx<_l7%V`UW5;p0ZZ21bZyCyzqkXIwZM zcEfSsSoi&K-Z93||5MIN&vW0&`fESs!O#oeiyfXR{=3AcmZ+U)F$W-5=fPF7VGO|7 z+pi$lku7@&<}L%(xJ#QSk6qu4aWMd&krI_vA%b&uUDq**Lk(`-7RiMzL9lTZ|eN} zT>VMBj$ur|GsXYvl#CL!gYiGPA{ZYj9+#|KKGRnIXU?BDO1+nnldY}2ac+4S;{eBg zBl`62uJh&zAHL{6i)D?^T5T;acw>k}!*9nYCWw!pZ=w7TA2Ui4H*b2mCk;F)^YA=2Oj;N$-olqNM24{3NjI9=zR z{5wUZ>hJACe_NIuCVgY(iF^2D4Lo1IGfenQm9J8+&roiHwxD>#H@ItUn!lgm`W4$FaX4 z|37m47)jWiDA92-5*8UDL7~Bz8wSYQ_3LE$s+H2aPY>PBQW1|DWiXy|ZTwrzgLvG; z8s(Q*E2U11d5q`u7hFT*-X*`a;rB-hrxELLU6*qz<2&kn>543=R(+q?*`?)+8a2{o z#cJ%4LT70?2gD_MuRLHG-&H?1rVp;&DV{NVB?ETFca|rIOD&)7@`q(@^Tj`WddR9> zk$1_){YCP{Jyyk|Z*X965&Y}%AAN;-@9?ps+8zvJEbd`hXUYA<6x8Y@Fa z3=@2>EMpP-O_=B{pQ7(hojF}5PMch4{72iEhB$9B=7`>tC(3y52{LN@SQ$2IgbYU9 z*wf%=HgDT{mmEqi?n(Ih`N_(aE46PExNk-~V4pq$|E2P&l;7a+`=cpSrpU)1e|#5~ zFJG?hah=B4r`};Ydv3N=s+2$PMtfkMIiF#F*P^=(d$Ys^99Iuak;i?KHSpXeCQX9U z?&O=hBS0Qm?wBv{MtfkMc}W}e@>vh(CA0zVtt%e=LxZ9U;h&Gx{I4p$>zl0J?i#O4=i;4*MG=B z=`*Om^uj(-_dY$PE7k)#b?YLYT{?^_N!)r!s#Lkd{S!|dmg?0nNbTBJ zG*qwtmGGXjgGV1tlP%j1>F=v@3Q9L+?v}?_IP2X1F|?!nW!C_CdjC*)I%Al2&U?xZ zo?Pi7TQm3Q<#SD*oSisx`VRjgK|wa~{|NFtwQ$*z(Tab{Nbae#1Na8X8XYb3wubNn zE*@^04S06x1n#x|6Ot@xwsxq{@I_6m@#99YzPX{zPn(a%UCaBA7Pqb ze&f3-*i+%$N7XTSDAsB$KEGHswee)Lx*SU@2heON{1yb*13HmuDevt z8lErsOxeJQ#3g$9jD5%%_n#GyzQF;jZQ!4Ke}A5{U|x6iUPexq90&KbDUOxa=-0QW z)-T_xUq{+GJ8E2!vkqN5X&iR#*hG&^3QAofChEMh z&y)W;hbBs!6APu?iAB=j$aMKz_DJ}Gp?W^oh)H_+F`w~#@#4j@W5*87SEzcty4~sj)v8^Pp+mou@bI4` zGBOtt5kJYeaoo37q)AL~7#YA~3X@H)u zckEofe2stbwJ$qM=YRg<&$|`DzrF_W)KgFWFMg|}?fq=W`VY$^IG?Zv zTd+=>V4lzgV|rKgZ?9fG#0#;3mg1UYeS7D2MV4W2|F-PF-lnw-#%prAVZ#QEXL3zn zuy*ZQ>@|mL-_P@bk%xKn!-^FvWCy-sU@WETS?_;D=k=k7GGx@Kt2+0} z1}09tE_|l?zklFi{e4wVL8)(Ag3fE@HSNVAbGEGhCRyj-?@FrlJ-kXPuW{1z1*9kH z+c>peoS^oZ;*}i$4kKE0UCI|GX}8LV?5p8PUynS`Jfo-T@2U5hs^3n8$H$x{r$AAM8Ur3*9~dxO*-i%hh_b1oQhxiF zoU%(t^XB#%ukST#pv7_=(;3q%@S1am58B>|@7MeK*j%5rJdAr|vj!CDO=~8)FyF6U0c#mn7bQ7#=19$&8JP2>Yv4I;BQoZ=-i~b{t7Uqd7xLxZ zXb;S@Ep)B^USw91W(T#`_mrnsduZT!r-vo0+PgYyaB_1Ih4yZ__gXmQt|QO}0`NUZaqB71 z`E&N~m06B2>DEGSf<|1Nta_k52w0<73Z0 z`|Pvy{kDAnP5V$j;IXv{!7;Ps+%tsd;Ck!7qfg?iFL3CzaLk;`3Ct<0H^Hx z{I=7UL&brAc9C#Gt4A+5+gGrOTbza}bKH>YA+cj(cKIV5#$7gCR;5#L0*D?G) zCJtPY|LDZHORim9`7I~?IsLk=2W^1+0gw1>2pFhriNC{Cdkbn$sHpS^_7B=&UZDDR zVJYVhvGK9`ep69p-!IQM&K<4uy0Xi^W%t_2a%y*M9;5}%l@)lV_z#~yuGo4YH`@)r z0r3s?=WnCNX*~Vx1jmi zfU8S8Nx(j#t!3U%`O>#W>%7ivQ&ToC94RMLqILdHro_nhWfNouo+$Y$f|ztYnbnG zr{D8g(DV#u93$MRDWkWy>(65IA;XD-8fgQdby6M#(Z#e+b<}f z8wgZmeo47E+5pFoD#1}TiE`%D35f>Rp|gie_`ET)dHn)O z3R$UL?~VzO0PkMlI#_!a{hv=I6}%H6=zn|Sf+THISgE%yCw04o%or?-dNh(buCHp~ zdB}_*a$s*#vFkfv?DrU-gCaM2lPjPkV?JKX_n-}FHn1@!VyUtL`kQQgAH==!@`jDz zd@uU+wt&SFhkhP`cq(X0f7!P!TF7<6s+s6(BW2Utxe_{SnD%UUw7-@warG?i-m!!G z%U!#ap82;F(zEW2_v8eBBWXH#DsAp*5aeIkK;_WraQ*ur*1HRTw~PCu{KlrdAUkEV zT)0p?na-RzDo6J3DK~8>NS7z^+cRUF4-S3_jtm_Gj(+WUPp%6(lnpSR_(Mp<#@;cO zJwn<5$AkR`bL2dJk9i5-P?{)x9dO^0YddID~NaN`?Ler z^YH5R>+3}&#%Ga#1=>McW(M|H&uV+?++R0Qavgm2^(E{d9mQ{h@w;w=o_QXb7`tWh zs>LbVZQx;ga!Pj^C+*v{_S-pIFS=7lo3Tr=ptNWo}=!ORP?v#If zPw{Q!{9gEZYo2YnR<@v0+Jv$Tw&$M1(bah{zbz)(ySTI~4>DPFr2M+l9d1|1L$$BW z(^jooRR-?|Ed1YW-@ZM+ktlOHEOk~$a?5d}9&mDZTdw*(&R3OVSxwPOQ3I~7uFrz^ z$UEG-e(luB>2IZ2g;`WN(}0(kR~07@*S6q%9dJ`|kMt_+f&UK^^QZtCXxp~!pPW6N zUvlwqv3GWJ>ji#412zHQ0$QA>QrN>Da9_IuG`m7JLF=>b?yvK2P~uzRvEXf{vxmzv zXLq*^E^e-|xZVMz11Fr_TrVR14#>lC0oRAXy%)IW{KGuTkp_DA?)@E!M* z1b)L6eE*}Y`?;f|#CExd%eQmuL#f3 z=8plT-|=PHCg}bd=-v_a&jdKH_`x8HlF67dHr)r?_z(K17v`M*DvIOcw1;sE%1;Dn z2R}QxyPkuL71|GQY)3o4MtiB}pTS3q;^@rQyyS`f2{Gaz)Z+`Bveaqh*ZTYn=be~` z4hIhn`OS;1^_4WAx3~9$j0qtd*DkKQc)0R!I9KR+0Gzv_t+y?F+;VYun{A2tN~A`{ z;!bXE@4y%LL79xhZRy)LkZ&tu_o;ZV-Mw5J&b0xzjac6}51e&!b!}ZDMchX(S=M@t z{g1wwW1=>uvi|{Z7(tFR9fd?3~ zfOD=TV(-Xp1JaS458m$$GvzN_1J2IQFM{i7TI}lX=8w7QdaPIVDR1-A!dqcJEv^PQ z7X|MFG3W6^%5}+gz*6{pu7jFmesL9gpXBFv=vdct!CEKRt;jjY`xTh$^uJ%$C+-tf zmpd^rm#d96{^^Qyq)Rcc^~S#8YvoQ@Q=n4Q0QaEa*SoWylXLDPBAw>s=Jbvk#^B?db<6v+<%QEHMuOU~0hBfT;mf1EvN{4VW4* zHE<6#fHg_;xJMeOq}6-d?up#`uh})?$u+y&`{Hd^nb+Iw?3l=Hd^y4t#?pxCEu0|1 zZM$l`zLxudx3%|9=RUZJL@RI`PEZrGY2|q11Q|~w(JEkyjN6#9Jf^tzX8K8PJ$zBS zZj@U+GxG7B!}|IYif1^Ax^6`A4M%aWt69BYjm-VB#IgN)($g|X1HT(ncxCSL@0#(y4xxwbCG0o+ByGl}P2h*Qz<{?yXPMS#Ekg@1@+Z Nx~7`Uqnv5r{{dX7@Vfv2 diff --git a/Source/Examples/Resources/OpenAL.png b/Source/Examples/Resources/OpenAL.png deleted file mode 100644 index 0d71bb5d452508c2e7b46ed767d1f320d0904d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmV+%0^|LOP)500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00G2FL_t(o!|j$aOI$$^$A6Q%i`iI6j3n3z(Wp&6 zfrW%C4F+WtIeE0z@rcjtMxy! zs!Sy$E(G}6C4aIInq;y~;*0>*ME84frt3B|^BNdT^gRWpZUbgE@>e6j)=?O7rVn@< z!UpgGI12H&I5X7A%2a@d!CzPF4}p~?Yl@a`6eiw^rNkGYBF>a<97dcO2VREo7+3>P z>o_lbasw}JZr%}9cfxxeAl6-cGGrhn*(7a3j1_8$xT6gdjc%jz+OyoF; z<`1d$->+Jk=_nDvW1uH$-SN6v3c1*3i@pH|DPwwoa`0!wnNMo{S*9@J%os2l!V}<) zT7R4(@DlJVh`1k^0KQ~hnOKmY(?G(hYKSw7z+6<#i(ux(nR*L`k7|AWKLLv~Pk`Tm z34_XN{YHx$dIV@bCC-5XwSF%}!0oJGtv^T#_+13D3w&*rL9O2gHlu@3&HQNR&(0hs ehsj~?Gt57ADS7y_Yh6PC0000500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00DeSL_t(o!|j*5N&`_4hQAX67T!=B1-lr$6!yW! z#!B!d>{V=h0AIituu7>|!L%HE zIBPHuj$OffOCj`t2&N_7LA03IvOedX=ZwJ2!?|>4p z37p5AuI}8i)M65~p6}8v08@761*jq2ck})l|9k7fcrYGJkL3%1w^BwwmJ@gY0000< KMNUMnLSTXgILDL# diff --git a/Source/Examples/Resources/OpenGL.png b/Source/Examples/Resources/OpenGL.png deleted file mode 100644 index ddb9126b89bbb16bf576d67ce96084f130308e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?kEP)500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00GWPL_t(o!|m6oL``sd?WVgs3yGR-^4VVT@uVinxj%87eqJ>fX#wV=A6u$KeOtIai zR~FR>W-yI29b6KYF&D$Gi6at;31B0w-}ttCeFtl%6$I)n98D> z!jm@pA{OutKX3#mF^Z!jHGSQv(vvxMulez7d7k(k0d#1vL>H_M@$y#~{MOwaJE)(>NLU=$*z@E#Ac zuGzAv?vzC}G$;yj8y9f8e&psbQx?@zyuw!;!sRaKxK|d{b~NMGUmDVpLX<@{hR2xb za>DtT!ekb|fdgH}9*ZfgZCTneg^w|XOPIn7{M=%oO}xhQzLTqLrNcE{IEww)z#87h o6u$2W(`$YQ4VVT@1EvS^2RIFbn=QD#9RL6T07*qoM6N<$f500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00IR`L_t(o!|m5QYZOrw2k_sTh>ze41s{zlBpL%L z1kuJpn*l*Y1dAy6XzT+PgC9WdcMt_hDJZUmFerop8xhnZAYud`r~wN}G@77Un<ZS_4^QTvcb#F;VEvUAsTBXGQH?&5lp23!cDx&xw#X=IJQ{MTuVdrro|{7#$c{b<6s)1sRmrC zU~i`hyuVI=*$4=vA*x|=Ia7NuPO?q^v(CJz)3@PCoMh+XB-`5R28~ktSI&C)Q?l-B z8loKy_;4Sm8u-7)IPM`$L$t7%$n=zqGOmr}8C5)N09Wu3&*LN;SWINfQhO#1(P)$E zyBnu*97nLd;PMVbX^4Kb1E#-?)Na-qhHw>^>ZUIgtMIZk$}~h1X^1W(tD7GB-(7pE zz{k#jiIZ$koMh{o*bm@D-PA<875I9bWX*b0H4RZU*Dqo;PO?XMhWGf1%{htBV}0)X z1$Wy8bM_zhkEqr?Z^W5=l*tT6(hyB|k~392z-)>A8*X7Z4bgZ@b!G{;vl{)_m0!|k r@d1-%mA7MHx_<{500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00EmxL_t(o!|j$&OO;U&#(y_0ZIL0k6M{eq2|qxE zwGkd8|KP%0g>K3(AYmV&O^cv~i$HMUDx|Jp4~U=;xQVEpsN_c5=te41l?U5nrH8AuKIiA{n5jnmC^`YOe zy_N<_x&+Jtw?oj0t3EU0)C(vtqBiEzX znb?!IKjwUaKP2{JNdq}yo&fVnok>aea>48Y{lMq&>wveC+OsrD+dII0U_GR(z^tTe zS-Q6EZ$KBY9a1y!UQ%P05yJK|&>dGCpbaQXx}0U6vAqNgM#BZT158P($ueBoo&iP@ psSkK{s;*tkzy(YJQ^1@zm_yo|b2o5{OWyzh002ovPDHLkV1kg<*Gd2Y diff --git a/Source/Examples/Resources/v1x.png b/Source/Examples/Resources/v1x.png deleted file mode 100644 index 9d049df5c7f9f9502f799ce5b6fd9c38970bab47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmV+*0^j|KP)500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00GEJL_t(o!|m5QXjD-U#_`_<#X^u6)A)*_rG;o= zWg!GCMDRrj5}OEOV`sntZ4{O1EX2k~5fTtYNvQ#`uuyCyjg5^$8bJ-%`Cgl|a9Ojs zAw&b-fy+HJ184r{o^J+jquFd)F4kiiSq)Re)G#&7e+9FmQz9Z(Vi5g!pPAF$ZW<9g zu&cNqGV@Veel?D?{LGyE4JINQ*ozSip|7M~V0r0eOitoiwwdyuaefV(vdPpW|F*-&+wefSV;Y zhhv%fxf9H79LBoL99*m*GxHjzihC5#(2JiK$;`JM1)P~Ia zVIpE5HqBGFKO#<4{QIQ~*5FMgzP`*D5wR8zunJ!=oS8Ebu?L560OxVJ(>0A@qVlwC zdt1Es4_~ZN2HDmUI-8j@WqlH}WqmOs2A5hh7s|0X1U*+Y^u5%-+sZZSUzHlB ihN)p{m>Oo8!TbWhRE2i`vE!Wp0000500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00J0EL_t(o!|j$kXcbWqhQE99Q3z^mLUJM4iHL$J zL{f=b_(Vh`1Qdy2CnyT~gBBW8ep|)DC`e3D5R642+WNp3sHrUs7(@#bu#tqsT$@=~ zHo3S9A^~@rJ!fWj_B%WOnLU+yz0N|hDhtR;m=dOhDPjIAm_=EKq#CdTSP!fO#(@{W zknNc~NhPfVHpcY3?I)S|GGKo)w>>cD%Sh@4J_EOb6TlJR6fg+9lhl%Pk>7wTKtC`n zX?rGqJ!1X9mPTdj2;U^|0eAyUMQj6bEf0z9ai9~J1}Z?Gq*bxtgFtuO`W`sm2xbV_ z39PW)ZhJGZ7Wf(Qy^<<9fnEV;W7-PblGFzDhHnBmV0$uorjq9fA!!s?4a@>dZ2!tD zN=bt$eS86Gk!N>SOVu37wgw2m^CBQ&-N2_9*W%if1^FY4q&2|3m`(#{if&iiKSFzH zdt9i`Na_Hd0nGt&*!J6^Fp`b|T^aX-M9^uQqnQxsN#H8582Acw*?v0Di>g3d$~BfQ zqoj7=C9o9u2=oD$BRmZ3v0b0H=}Bq^?!=BFKrR5Sk`9G$)^<|5<-lkvMN9M;BsBpK z17r&5v^^qe6R;211)KveH7e8V6iAZ%X6PnqQg?HdrUDG4gn!!hNQ{pHV==xcX500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00M4FL_t(o!|j*POH@%5$3HVhR)U#iAX3sIB3eZH z4-}b;45CFyP>@iqgb)f2=qgOU5Csu!+JuZ0EgI?cWM5q%x7yUa@(sT7$9zzA>*=m8D`r+`;xHke?M1z-rs z0XNO8Bcea+x*V`&t~6zU8Q=+U2YBi78ld0Ij>JJC=`+ynk<9?ZX4dFY+2acZ7zcWP zIS)^5GusN>moy#7b^)V4>3d173DVUEoOU)3^!Y*?fFjTyrau$s3Snjwzy@cRg7RlQf$IiKHoS zjF4_svi&VhX4VQ^@uFP|EO*sYphHq22^cdw1e}kE-vMosigWHWPD_FIh-}u2xEOJi z1=a+j50ZWa`ZjN4yfcS^6F@7FGqatNO7o?u2%Pb80r=>41Hi?IZ9VWN7)=3?6&~SQ zud{ARL%>xx*#Y#=o2Ck3t^*zh-PA5=+;t7Wm%zMPQo+nJzzuf@&@1Vjf71v&23C8- zJ0;zY)lHJV0+$0(TZ~c}2!M>1f%tqyU@!39{a;GD&zuB~I=jDomi)C-+stastiA$} zb-;l@^r#xAb~7+xW_P{vXT0jWyu$#-Bt5Ij6~di%`iRm!U|+TFGn2qUU>mR=SOQD| s&%GV5C*6IMQYQV^PQj#L{zWi90pG^hJ;kch3IG5A07*qoM6N<$g72v^5dZ)H diff --git a/Source/Examples/Resources/v4x.png b/Source/Examples/Resources/v4x.png deleted file mode 100644 index 692170c07834198c0e42c9acb3aac1c62685907e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*hgP)500001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^00IX|L_t(o!|j*Pi;Ynj$3O4P#X?Oe3%`bJH4CHs z0kV*k5MyF9Q*14eZ?PftEsI$QMapz13ysDKA$FvU?%D!nqj1YY5%*r3=dI)F-nny! zns}ehInVQ)bKdXyp67j@bFxOG!F-V(=8+U&3NQtj0?dB}rqs$IsTbG}WWYz;_h+-P zqz%BvP=A{*X)&-1!1lyU%i`U?hgVYzs!x7GN;c>$a=i#DMK*z==>-0@oz<16RXV1@_Fu%<*Vz zz}Q@Z()JiI73yx_DX;{n0|#usZ3#xw0I)68$#n1>WCVB}{Z-MPX%6aAn^*z35CAs= zeL&sz<1X0wEa^G0J~7{Gn`b1g28Kg@VtYFJmw|`CgKlV%bSPOjms@#2w_@f9upnin zgAerp{fX(F?ONg=jNcgG6)+B*1J(j%Njq#eegPw?4>%m^2VkM3VW1btcaTXs82y{J z>v4Q<5-=+w#~^7ba2r?zd;^ATSK`=r0^5O;z}aSI24Z1=<-na5, IComparer - { - #region IComparer Members - - public int Compare(TreeNode x, TreeNode y) - { - ExampleInfo x_info = x.Tag as ExampleInfo; - ExampleInfo y_info = y.Tag as ExampleInfo; - if (x_info == null || y_info == null) - { - return x.Text.CompareTo(y.Text); - } - else - { - int result = x_info.Attribute.Category.CompareTo(y_info.Attribute.Category); - if (result == 0) - result = x_info.Attribute.Subcategory.CompareTo(y_info.Attribute.Subcategory); - if (result == 0) - result = x_info.Attribute.Difficulty.CompareTo(y_info.Attribute.Difficulty); - if (result == 0) - result = x_info.Attribute.Title.CompareTo(y_info.Attribute.Title); - - return result; - } - } - - #endregion - - #region IComparer Members - - public int Compare(object x, object y) - { - if (x is TreeNode && y is TreeNode) - return Compare(x as TreeNode, y as TreeNode); - else - return 0; - } - - #endregion - } -} diff --git a/Source/Examples/Shapes/Base/DrawableShape.cs b/Source/Examples/Shapes/Base/DrawableShape.cs deleted file mode 100644 index 2c786d15..00000000 --- a/Source/Examples/Shapes/Base/DrawableShape.cs +++ /dev/null @@ -1,181 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ -#endregion - -using System; - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shapes -{ - // Abstract base class for procedurally generated geometry - // - // All classes derived from it must produce Counter-Clockwise (CCW) primitives. - // Derived classes must create a single VBO and IBO, without primitive restarts for strips. - // Uses an double-precision all-possible-attributes VertexT2dN3dV3d Array internally. - // Cannot directly use VBO, but has Get-methods to retrieve VBO-friendly data. - // Can use a Display List to prevent repeated immediate mode draws. - // - - public abstract class DrawableShape: IDisposable - { - protected PrimitiveType PrimitiveMode; - protected VertexT2dN3dV3d[] VertexArray; - protected uint[] IndexArray; - - public int GetTriangleCount - { - get - { - switch ( PrimitiveMode ) - { - case PrimitiveType.Triangles: - if ( IndexArray != null ) - { - return IndexArray.Length / 3; - } else - { - return VertexArray.Length / 3; - } - // break; - default: throw new NotImplementedException("Unknown primitive type."); - } - } - } - - #region Display List - - private bool UseDisplayList; - private int DisplayListHandle = 0; - - #endregion Display List - - public DrawableShape( bool useDisplayList ) - { - UseDisplayList = useDisplayList; - PrimitiveMode = PrimitiveType.Triangles; - VertexArray = null; - IndexArray = null; - } - - #region Convert to VBO - - public void GetArraysforVBO(out PrimitiveType primitives, out VertexT2dN3dV3d[] vertices, out uint[] indices) - { - primitives = PrimitiveMode; - - vertices = new VertexT2dN3dV3d[VertexArray.Length]; - for (uint i = 0; i < VertexArray.Length; i++) - { - vertices[i].TexCoord = VertexArray[i].TexCoord; - vertices[i].Normal = VertexArray[i].Normal; - vertices[i].Position = VertexArray[i].Position; - } - - indices = IndexArray; - } - - public void GetArraysforVBO(out PrimitiveType primitives, out VertexT2fN3fV3f[] vertices, out uint[] indices) - { - primitives = PrimitiveMode; - - vertices = new VertexT2fN3fV3f[VertexArray.Length]; - for (uint i = 0; i < VertexArray.Length; i++) - { - vertices[i].TexCoord = (Vector2)VertexArray[i].TexCoord; - vertices[i].Normal = (Vector3)VertexArray[i].Normal; - vertices[i].Position = (Vector3)VertexArray[i].Position; - } - - indices = IndexArray; - } - - public void GetArraysforVBO(out PrimitiveType primitives, out VertexT2hN3hV3h[] vertices, out uint[] indices) - { - primitives = PrimitiveMode; - - vertices = new VertexT2hN3hV3h[VertexArray.Length]; - for (uint i = 0; i < VertexArray.Length; i++) - { - vertices[i].TexCoord = (Vector2h)VertexArray[i].TexCoord; - vertices[i].Normal = (Vector3h)VertexArray[i].Normal; - vertices[i].Position = (Vector3h)VertexArray[i].Position; - } - - indices = IndexArray; - } - - #endregion Convert to VBO - - private void DrawImmediateMode() - { - GL.Begin( PrimitiveMode ); - { - if ( IndexArray == null ) - foreach ( VertexT2dN3dV3d v in VertexArray ) - { - GL.TexCoord2( v.TexCoord.X, v.TexCoord.Y ); - GL.Normal3( v.Normal.X, v.Normal.Y, v.Normal.Z ); - GL.Vertex3( v.Position.X, v.Position.Y, v.Position.Z ); - } else - { - for ( uint i = 0; i < IndexArray.Length; i++ ) - { - uint index = IndexArray[i]; - GL.TexCoord2( VertexArray[index].TexCoord.X, VertexArray[index].TexCoord.Y ); - GL.Normal3( VertexArray[index].Normal.X, VertexArray[index].Normal.Y, VertexArray[index].Normal.Z ); - GL.Vertex3( VertexArray[index].Position.X, VertexArray[index].Position.Y, VertexArray[index].Position.Z ); - } - } - } - GL.End(); - } - - /// - /// Does not touch any state/matrices. Does call Begin/End and Vertex&Co. - /// Creates and compiles a display list if not present yet. Requires an OpenGL context. - /// - public void Draw() - { - if ( !UseDisplayList ) - DrawImmediateMode(); - else - if ( DisplayListHandle == 0 ) - { - if ( VertexArray == null ) - throw new Exception("Cannot draw null Vertex Array."); - DisplayListHandle = GL.GenLists( 1 ); - GL.NewList( DisplayListHandle, ListMode.CompileAndExecute ); - DrawImmediateMode(); - GL.EndList(); - } else - GL.CallList( DisplayListHandle ); - } - - #region IDisposable Members - - /// - /// Removes reference to VertexArray and IndexArray. - /// Deletes the Display List, so it requires an OpenGL context. - /// The instance is effectively destroyed. - /// - public void Dispose() - { - if ( VertexArray != null ) - VertexArray = null; - if ( IndexArray != null ) - IndexArray = null; - if ( DisplayListHandle != 0 ) - { - GL.DeleteLists( DisplayListHandle, 1 ); - DisplayListHandle = 0; - } - } - - #endregion - } - -} diff --git a/Source/Examples/Shapes/Base/VertexStructs.cs b/Source/Examples/Shapes/Base/VertexStructs.cs deleted file mode 100644 index 8a3d350b..00000000 --- a/Source/Examples/Shapes/Base/VertexStructs.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -using OpenTK; - -namespace Examples.Shapes -{ - public struct VertexT2dN3dV3d - { - public Vector2d TexCoord; - public Vector3d Normal; - public Vector3d Position; - - public VertexT2dN3dV3d( Vector2d texcoord, Vector3d normal, Vector3d position ) - { - TexCoord = texcoord; - Normal = normal; - Position = position; - } - } - - public struct VertexT2fN3fV3f - { - public Vector2 TexCoord; - public Vector3 Normal; - public Vector3 Position; - } - - public struct VertexT2hN3hV3h - { - public Vector2h TexCoord; - public Vector3h Normal; - public Vector3h Position; - } - - -} diff --git a/Source/Examples/Shapes/Capsule.cs b/Source/Examples/Shapes/Capsule.cs deleted file mode 100644 index 3ada2fca..00000000 --- a/Source/Examples/Shapes/Capsule.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; - -using OpenTK; - -namespace Examples.Shapes -{ - public sealed class Capsule: DrawableShape - { - public enum eSubdivisions - { - None = 0, - One = 1, - Two = 2, - Three = 3, - Four = 4, - } - - - public Capsule( double radius, double height, eSubdivisions subdivs, bool useDL ) - : base( useDL ) - { - uint HoseSubDivs = 0; - SlicedSphere.eSubdivisions spheresubdivs = SlicedSphere.eSubdivisions.Zero; - - switch ( subdivs ) - { - case eSubdivisions.None: - spheresubdivs = SlicedSphere.eSubdivisions.Zero; - HoseSubDivs = 0; - break; - case eSubdivisions.One: - spheresubdivs = SlicedSphere.eSubdivisions.One; - HoseSubDivs = 1; - break; - case eSubdivisions.Two: - spheresubdivs = SlicedSphere.eSubdivisions.Two; - HoseSubDivs = 3; - break; - case eSubdivisions.Three: - spheresubdivs = SlicedSphere.eSubdivisions.Three; - HoseSubDivs = 7; - break; - case eSubdivisions.Four: - spheresubdivs = SlicedSphere.eSubdivisions.Four; - HoseSubDivs = 15; - break; - } - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - - OpenTK.Graphics.OpenGL.PrimitiveType TemporaryMode; - VertexT2dN3dV3d[] TemporaryVBO; - uint[] TemporaryIBO; - - List AllChunks = new List(); - Vector3d offset1 = new Vector3d( 0.0, 0.0, height ), - offset2 = new Vector3d( 0.0, 0.0, -height ); - for ( int i = 0; i < 4; i++ ) - { - SlicedHose.eSide tempSide = SlicedHose.eSide.FrontTop; - switch ( i ) - { - case 0: - tempSide = SlicedHose.eSide.FrontBottom; - break; - case 1: - tempSide = SlicedHose.eSide.BackBottom; - break; - case 2: - tempSide = SlicedHose.eSide.BackTop; - break; - case 3: - tempSide = SlicedHose.eSide.FrontTop; - break; - } - SlicedHose tempHose = new SlicedHose( tempSide, HoseSubDivs, radius, offset1, offset2, false ); - tempHose.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO ); - tempHose.Dispose(); - AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) ); - } - - SlicedSphere front = new SlicedSphere( radius, offset1, spheresubdivs, - new SlicedSphere.eDir[] { - SlicedSphere.eDir.BackBottomRight, - SlicedSphere.eDir.FrontTopRight, - SlicedSphere.eDir.BackTopRight, - SlicedSphere.eDir.FrontBottomRight, - }, - false ); - - front.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO ); - AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) ); - front.Dispose(); - - SlicedSphere back = new SlicedSphere( radius, offset2, spheresubdivs, - new SlicedSphere.eDir[] { - SlicedSphere.eDir.FrontBottomLeft, - SlicedSphere.eDir.FrontTopLeft, - SlicedSphere.eDir.BackTopLeft, - SlicedSphere.eDir.BackBottomLeft }, - false ); - back.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO ); - AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) ); - back.Dispose(); - - Chunk.GetArray( ref AllChunks, out VertexArray, out IndexArray ); - AllChunks.Clear(); - } - } -} diff --git a/Source/Examples/Shapes/ChamferCube.cs b/Source/Examples/Shapes/ChamferCube.cs deleted file mode 100644 index 08383af0..00000000 --- a/Source/Examples/Shapes/ChamferCube.cs +++ /dev/null @@ -1,280 +0,0 @@ -using System; -using System.Collections.Generic; - -using OpenTK; - -namespace Examples.Shapes -{ - public sealed class ChamferCube: DrawableShape - { - - public enum SubDivs: byte - { - Zero, - One, - Two, - Three, - Four, - } - - public ChamferCube( double Width, double Height, double Length, SubDivs subdivs, double radius, bool useDL ) - : base( useDL ) - { - SlicedSphere.eSubdivisions sphereSubDivs = SlicedSphere.eSubdivisions.Zero; - uint hoseSubDivs = 0; - - switch ( subdivs ) - { - case SubDivs.Zero: - sphereSubDivs = SlicedSphere.eSubdivisions.Zero; - hoseSubDivs = 0; - break; - case SubDivs.One: - sphereSubDivs = SlicedSphere.eSubdivisions.One; - hoseSubDivs = 1; - break; - case SubDivs.Two: - sphereSubDivs = SlicedSphere.eSubdivisions.Two; - hoseSubDivs = 3; - break; - case SubDivs.Three: - sphereSubDivs = SlicedSphere.eSubdivisions.Three; - hoseSubDivs = 7; - break; - case SubDivs.Four: - sphereSubDivs = SlicedSphere.eSubdivisions.Four; - hoseSubDivs = 15; - break; - } - - #region Temporary Storage - - List AllChunks = new List(); - OpenTK.Graphics.OpenGL.PrimitiveType TemporaryMode; - VertexT2dN3dV3d[] TemporaryVBO; - uint[] TemporaryIBO; - - #endregion Temporary Storage - - Vector3d FrontTopRightEdge = new Vector3d( +Width - radius, +Height - radius, +Length - radius ); - Vector3d FrontTopLeftEdge = new Vector3d( +Width - radius, +Height - radius, -Length + radius ); - Vector3d FrontBottomRightEdge = new Vector3d( +Width - radius, -Height + radius, +Length - radius ); - Vector3d FrontBottomLeftEdge = new Vector3d( +Width - radius, -Height + radius, -Length + radius ); - Vector3d BackTopRightEdge = new Vector3d( -Width + radius, +Height - radius, +Length - radius ); - Vector3d BackTopLeftEdge = new Vector3d( -Width + radius, +Height - radius, -Length + radius ); - Vector3d BackBottomRightEdge = new Vector3d( -Width + radius, -Height + radius, +Length - radius ); - Vector3d BackBottomLeftEdge = new Vector3d( -Width + radius, -Height + radius, -Length + radius ); - - #region 8 sliced Spheres - SlicedSphere tempSphere; - Vector3d tempVector = Vector3d.Zero; - SlicedSphere.eDir[] tempEdge = new SlicedSphere.eDir[1]; - - for ( int i = 0; i < 8; i++ ) - { - switch ( i ) - { - case 0: - tempVector = FrontTopRightEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontTopRight }; - break; - case 1: - tempVector = FrontTopLeftEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontTopLeft }; - break; - case 2: - tempVector = FrontBottomRightEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontBottomRight }; - break; - case 3: - tempVector = FrontBottomLeftEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontBottomLeft }; - break; - case 4: - tempVector = BackBottomRightEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackBottomRight }; - break; - case 5: - tempVector = BackBottomLeftEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackBottomLeft }; - break; - case 6: - tempVector = BackTopRightEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackTopRight }; - break; - case 7: - tempVector = BackTopLeftEdge; - tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackTopLeft }; - break; - } - tempSphere = new SlicedSphere( radius, - tempVector, - sphereSubDivs, - tempEdge, - false ); - tempSphere.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO ); - tempSphere.Dispose(); - AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) ); - } - #endregion 8 sliced Spheres - - #region 12 sliced Hoses - - SlicedHose tempHose; - SlicedHose.eSide tempSide = SlicedHose.eSide.BackBottom; - Vector3d tempHoseStart = Vector3d.Zero; - Vector3d tempHoseEnd = Vector3d.Zero; - - for ( int i = 0; i < 12; i++ ) - { - switch ( i ) - { - #region Around X Axis - case 0: - tempSide = SlicedHose.eSide.BottomRight; - tempHoseStart = BackBottomRightEdge; - tempHoseEnd = FrontBottomRightEdge; - break; - case 1: - tempSide = SlicedHose.eSide.TopRight; - tempHoseStart = BackTopRightEdge; - tempHoseEnd = FrontTopRightEdge; - break; - case 2: - tempSide = SlicedHose.eSide.TopLeft; - tempHoseStart = BackTopLeftEdge; - tempHoseEnd = FrontTopLeftEdge; - break; - case 3: - tempSide = SlicedHose.eSide.BottomLeft; - tempHoseStart = BackBottomLeftEdge; - tempHoseEnd = FrontBottomLeftEdge; - break; - #endregion Around X Axis - #region Around Y Axis - case 4: - tempSide = SlicedHose.eSide.FrontRight; - tempHoseStart = FrontBottomRightEdge; - tempHoseEnd = FrontTopRightEdge; - break; - case 5: - tempSide = SlicedHose.eSide.BackRight; - tempHoseStart = BackBottomRightEdge; - tempHoseEnd = BackTopRightEdge; - break; - case 6: - tempSide = SlicedHose.eSide.BackLeft; - tempHoseStart = BackBottomLeftEdge; - tempHoseEnd = BackTopLeftEdge; - break; - case 7: - tempSide = SlicedHose.eSide.FrontLeft; - tempHoseStart = FrontBottomLeftEdge; - tempHoseEnd = FrontTopLeftEdge; - break; - #endregion Around Y Axis - #region Around Z Axis - case 8: - tempSide = SlicedHose.eSide.FrontTop; - tempHoseStart = FrontTopRightEdge; - tempHoseEnd = FrontTopLeftEdge; - break; - case 9: - tempSide = SlicedHose.eSide.BackTop; - tempHoseStart = BackTopRightEdge; - tempHoseEnd = BackTopLeftEdge; - break; - case 10: - tempSide = SlicedHose.eSide.BackBottom; - tempHoseStart = BackBottomRightEdge; - tempHoseEnd = BackBottomLeftEdge; - break; - case 11: - tempSide = SlicedHose.eSide.FrontBottom; - tempHoseStart = FrontBottomRightEdge; - tempHoseEnd = FrontBottomLeftEdge; - break; - #endregion Around Z Axis - } - tempHose = new SlicedHose( tempSide, - hoseSubDivs, - radius, - tempHoseStart, - tempHoseEnd, - false ); - tempHose.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO ); - tempHose.Dispose(); - AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) ); - } - #endregion 12 sliced Hoses - - #region 6 quads for the sides - - VertexT2dN3dV3d[] tempVBO = new VertexT2dN3dV3d[4]; - uint[] tempIBO = new uint[6] { 0, 1, 2, 0, 2, 3 }; // all quads share this IBO - - // all quads use the same texcoords - tempVBO[0].TexCoord = new Vector2d( 0.0, 1.0 ); - tempVBO[1].TexCoord = new Vector2d( 0.0, 0.0 ); - tempVBO[2].TexCoord = new Vector2d( 1.0, 0.0 ); - tempVBO[3].TexCoord = new Vector2d( 1.0, 1.0 ); - - // front face - tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = Vector3d.UnitX; - tempVBO[0].Position = FrontTopRightEdge + new Vector3d( radius, 0.0, 0.0 ); - tempVBO[1].Position = FrontBottomRightEdge + new Vector3d( radius, 0.0, 0.0 ); - tempVBO[2].Position = FrontBottomLeftEdge + new Vector3d( radius, 0.0, 0.0 ); - tempVBO[3].Position = FrontTopLeftEdge + new Vector3d( radius, 0.0, 0.0 ); - AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) ); - - // back face - tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = -Vector3d.UnitX; - tempVBO[0].Position = BackTopLeftEdge - new Vector3d( radius, 0.0, 0.0 ); - tempVBO[1].Position = BackBottomLeftEdge - new Vector3d( radius, 0.0, 0.0 ); - tempVBO[2].Position = BackBottomRightEdge - new Vector3d( radius, 0.0, 0.0 ); - tempVBO[3].Position = BackTopRightEdge - new Vector3d( radius, 0.0, 0.0 ); - AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) ); - - // top face - tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = Vector3d.UnitY; - tempVBO[0].Position = BackTopRightEdge + new Vector3d( 0.0, radius, 0.0 ); - tempVBO[1].Position = FrontTopRightEdge + new Vector3d( 0.0, radius, 0.0 ); - tempVBO[2].Position = FrontTopLeftEdge + new Vector3d( 0.0, radius, 0.0 ); - tempVBO[3].Position = BackTopLeftEdge + new Vector3d( 0.0, radius, 0.0 ); - AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) ); - - // bottom face - tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = -Vector3d.UnitY; - tempVBO[0].Position = BackBottomLeftEdge - new Vector3d( 0.0, radius, 0.0 ); - tempVBO[1].Position = FrontBottomLeftEdge - new Vector3d( 0.0, radius, 0.0 ); - tempVBO[2].Position = FrontBottomRightEdge - new Vector3d( 0.0, radius, 0.0 ); - tempVBO[3].Position = BackBottomRightEdge - new Vector3d( 0.0, radius, 0.0 ); - AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) ); - - // right face - tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = Vector3d.UnitZ; - tempVBO[0].Position = BackTopRightEdge + new Vector3d( 0.0, 0.0, radius ); - tempVBO[1].Position = BackBottomRightEdge + new Vector3d( 0.0, 0.0, radius ); - tempVBO[2].Position = FrontBottomRightEdge + new Vector3d( 0.0, 0.0, radius ); - tempVBO[3].Position = FrontTopRightEdge + new Vector3d( 0.0, 0.0, radius ); - AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) ); - - // left face - tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = -Vector3d.UnitZ; - tempVBO[0].Position = FrontTopLeftEdge - new Vector3d( 0.0, 0.0, radius ); - tempVBO[1].Position = FrontBottomLeftEdge - new Vector3d( 0.0, 0.0, radius ); - tempVBO[2].Position = BackBottomLeftEdge - new Vector3d( 0.0, 0.0, radius ); - tempVBO[3].Position = BackTopLeftEdge - new Vector3d( 0.0, 0.0, radius ); - AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) ); - - - #endregion 6 quads for the sides - - #region Final Assembly of Chunks - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - Chunk.GetArray( ref AllChunks, out VertexArray, out IndexArray ); - AllChunks.Clear(); - #endregion Final Assembly of Chunks - } - } -} diff --git a/Source/Examples/Shapes/Helpers/Chunk.cs b/Source/Examples/Shapes/Helpers/Chunk.cs deleted file mode 100644 index 466bff99..00000000 --- a/Source/Examples/Shapes/Helpers/Chunk.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Examples.Shapes -{ - public class Chunk - { - public VertexT2dN3dV3d[] Vertices; - public uint[] Indices; - - public uint VertexCount - { - get - { - return (uint)Vertices.Length; - } - } - public uint IndexCount - { - get - { - return (uint)Indices.Length; - } - } - - public Chunk( uint vertexcount, uint indexcount ) - { - Vertices = new VertexT2dN3dV3d[vertexcount]; - Indices = new uint[indexcount]; - } - - public Chunk( ref VertexT2dN3dV3d[] vbo, ref uint[] ibo ) - { - Vertices = new VertexT2dN3dV3d[vbo.Length]; - for ( int i = 0; i < Vertices.Length; i++ ) - { - Vertices[i] = vbo[i]; - } - Indices = new uint[ibo.Length]; - for ( int i = 0; i < Indices.Length; i++ ) - { - Indices[i] = ibo[i]; - } - } - - public static void GetArray( ref List c, out VertexT2dN3dV3d[] vbo, out uint[] ibo ) - { - - uint VertexCounter = 0; - uint IndexCounter = 0; - - foreach ( Chunk ch in c ) - { - VertexCounter += ch.VertexCount; - IndexCounter += ch.IndexCount; - } - - vbo = new VertexT2dN3dV3d[VertexCounter]; - ibo = new uint[IndexCounter]; - - VertexCounter = 0; - IndexCounter = 0; - - foreach ( Chunk ch in c ) - { - for ( int i = 0; i < ch.Vertices.Length; i++ ) - { - vbo[VertexCounter + i] = ch.Vertices[i]; - } - - for ( int i = 0; i < ch.Indices.Length; i++ ) - { - ibo[IndexCounter + i] = ch.Indices[i] + VertexCounter; - } - - VertexCounter += (uint)ch.VertexCount; - IndexCounter += (uint)ch.IndexCount; - } - } - } -} diff --git a/Source/Examples/Shapes/Helpers/MengerCube.cs b/Source/Examples/Shapes/Helpers/MengerCube.cs deleted file mode 100644 index 763ddc45..00000000 --- a/Source/Examples/Shapes/Helpers/MengerCube.cs +++ /dev/null @@ -1,420 +0,0 @@ -using System; -using System.Collections.Generic; - -using OpenTK; - -namespace Examples.Shapes -{ - public sealed partial class MengerSponge - { - private struct MengerCube - { - private Vector3d Center; - private double SideLength; - private eSides[] VisibleSides; - private eSides[] VisibilityToInherit; - - public void GetArraySizes( out uint vertexcount, out uint indexcount ) - { - vertexcount = (uint)VisibleSides.Length * 8 + 6 * 12; - indexcount = (uint)VisibleSides.Length * 8 * 3 + 6 * 8 * 3; - } - - public MengerCube( Vector3d center, double sidelength, eSides[] visibleSides, eSides[] parentsVisibility ) - { - Center = center; - SideLength = sidelength; - - /* List Sides = new List(); - foreach ( eSides s in visibleSides ) - { - bool isVisible = false; - foreach ( eSides p in parentsVisibility ) - { - if ( (int)p == (int)s ) - { - isVisible = true; - break; - } - } - if ( isVisible ) - { - Sides.Add( s ); - } - } - VisibleSides = Sides.ToArray();*/ - VisibleSides = visibleSides; - VisibilityToInherit = visibleSides; - } - - public void Subdivide( out MengerCube[] cubes ) - { - cubes = new MengerCube[20]; // 8 + 4 + 8 - - double NewLength = this.SideLength / 3.0; - double six = this.SideLength * 2.0 / 3.0; - // we got 3x3x3 cubes. All center cubes who touch the XYZ-Axis are removed. - - // front - cubes[0] = new MengerCube( new Vector3d( Center.X - six, Center.Y + six, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Left, eSides.Top }, this.VisibilityToInherit ); - cubes[1] = new MengerCube( new Vector3d( Center.X + 0.0, Center.Y + six, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Bottom, eSides.Back, eSides.Top }, this.VisibilityToInherit ); - cubes[2] = new MengerCube( new Vector3d( Center.X + six, Center.Y + six, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Right, eSides.Top }, this.VisibilityToInherit ); - - cubes[3] = new MengerCube( new Vector3d( Center.X - six, Center.Y + 0.0, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Right, eSides.Back, eSides.Left }, this.VisibilityToInherit ); - cubes[4] = new MengerCube( new Vector3d( Center.X + six, Center.Y + 0.0, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Right, eSides.Back, eSides.Left }, this.VisibilityToInherit ); - - cubes[5] = new MengerCube( new Vector3d( Center.X - six, Center.Y - six, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Left, eSides.Bottom } , this.VisibilityToInherit ); - cubes[6] = new MengerCube( new Vector3d( Center.X + 0.0, Center.Y - six, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Top, eSides.Back, eSides.Bottom }, this.VisibilityToInherit ); - cubes[7] = new MengerCube( new Vector3d( Center.X + six, Center.Y - six, Center.Z + six ), NewLength, new eSides[] { eSides.Front, eSides.Right, eSides.Bottom }, this.VisibilityToInherit ); - - // center - cubes[8] = new MengerCube( new Vector3d( Center.X - six, Center.Y + six, Center.Z + 0.0 ), NewLength, new eSides[] { eSides.Top, eSides.Right, eSides.Bottom, eSides.Left }, this.VisibilityToInherit ); - - cubes[9] = new MengerCube( new Vector3d( Center.X + six, Center.Y + six, Center.Z + 0.0 ), NewLength, new eSides[] { eSides.Top, eSides.Right, eSides.Bottom, eSides.Left }, this.VisibilityToInherit ); - - cubes[10] = new MengerCube( new Vector3d( Center.X - six, Center.Y - six, Center.Z + 0.0 ), NewLength, new eSides[] { eSides.Top, eSides.Right, eSides.Bottom, eSides.Left }, this.VisibilityToInherit ); - - cubes[11] = new MengerCube( new Vector3d( Center.X + six, Center.Y - six, Center.Z + 0.0 ), NewLength, new eSides[] { eSides.Top, eSides.Right, eSides.Bottom, eSides.Left }, this.VisibilityToInherit ); - - // back - cubes[12] = new MengerCube( new Vector3d( Center.X - six, Center.Y + six, Center.Z - six ), NewLength, new eSides[] { eSides.Top, eSides.Back, eSides.Left }, this.VisibilityToInherit ); - cubes[13] = new MengerCube( new Vector3d( Center.X + 0.0, Center.Y + six, Center.Z - six ), NewLength, new eSides[] { eSides.Top, eSides.Back, eSides.Bottom, eSides.Front }, this.VisibilityToInherit ); - cubes[14] = new MengerCube( new Vector3d( Center.X + six, Center.Y + six, Center.Z - six ), NewLength, new eSides[] { eSides.Top, eSides.Back, eSides.Right }, this.VisibilityToInherit ); - - cubes[15] = new MengerCube( new Vector3d( Center.X - six, Center.Y + 0.0, Center.Z - six ), NewLength, new eSides[] { eSides.Front, eSides.Right, eSides.Back, eSides.Left } , this.VisibilityToInherit ); - cubes[16] = new MengerCube( new Vector3d( Center.X + six, Center.Y + 0.0, Center.Z - six ), NewLength, new eSides[] { eSides.Front, eSides.Right, eSides.Back, eSides.Left } , this.VisibilityToInherit ); - - cubes[17] = new MengerCube( new Vector3d( Center.X - six, Center.Y - six, Center.Z - six ), NewLength, new eSides[] { eSides.Back, eSides.Bottom, eSides.Left } , this.VisibilityToInherit ); - cubes[18] = new MengerCube( new Vector3d( Center.X + 0.0, Center.Y - six, Center.Z - six ), NewLength, new eSides[] { eSides.Top, eSides.Back, eSides.Bottom, eSides.Front }, this.VisibilityToInherit ); - cubes[19] = new MengerCube( new Vector3d( Center.X + six, Center.Y - six, Center.Z - six ), NewLength, new eSides[] { eSides.Back, eSides.Bottom, eSides.Right }, this.VisibilityToInherit ); - - } - - public enum eSides: byte - { - Front, - Back, - Right, - Left, - Top, - Bottom - } - - internal static readonly eSides[] AllSides = new eSides[] { eSides.Front, eSides.Back, eSides.Right, eSides.Left, eSides.Top, eSides.Bottom }; - - public void GetVboAndIbo( ref List chunks ) - { - foreach ( eSides s in AllSides ) - { - DrawSide( s, ref chunks ); - } - } - - private void DrawSide( eSides side, ref List chunks ) - { - #region Setup constants for current direction - - double _Zero = 0.0; // 0/3 - double _Three = 0.3333333333333; // 1/3 - double _Six = 0.66666666666666; // 2/3 - double _One = 1.0; // 3/3 - - Vector3d C0 = Center + new Vector3d( -SideLength, -SideLength, +SideLength ); - Vector3d C1 = Center + new Vector3d( +SideLength, -SideLength, +SideLength ); - Vector3d C2 = Center + new Vector3d( +SideLength, +SideLength, +SideLength ); - Vector3d C3 = Center + new Vector3d( -SideLength, +SideLength, +SideLength ); - - Vector3d C4 = Center + new Vector3d( -SideLength, -SideLength, -SideLength ); - Vector3d C5 = Center + new Vector3d( +SideLength, -SideLength, -SideLength ); - Vector3d C6 = Center + new Vector3d( +SideLength, +SideLength, -SideLength ); - Vector3d C7 = Center + new Vector3d( -SideLength, +SideLength, -SideLength ); - - Vector3d P0, P1, P2, P3, P4, P5, P6, P7; - - switch ( side ) - { - case eSides.Front: - P0 = C0; - P1 = C1; - P2 = C2; - P3 = C3; - - P4 = C4; - P5 = C5; - P6 = C6; - P7 = C7; - break; - case eSides.Back: - P0 = C5; - P1 = C4; - P2 = C7; - P3 = C6; - - P4 = C1; - P5 = C0; - P6 = C3; - P7 = C2; - break; - case eSides.Right: - P0 = C1; - P1 = C5; - P2 = C6; - P3 = C2; - - P4 = C0; - P5 = C4; - P6 = C7; - P7 = C3; - break; - case eSides.Left: - P0 = C4; - P1 = C0; - P2 = C3; - P3 = C7; - - P4 = C5; - P5 = C1; - P6 = C2; - P7 = C6; - break; - case eSides.Top: - P0 = C3; - P1 = C2; - P2 = C6; - P3 = C7; - - P4 = C0; - P5 = C1; - P6 = C5; - P7 = C4; - break; - case eSides.Bottom: - P0 = C1; - P1 = C0; - P2 = C4; - P3 = C5; - - P4 = C2; - P5 = C3; - P6 = C7; - P7 = C6; - break; - default: - throw new NotImplementedException( "Unknown enum value: " + side ); - } - - #endregion Setup constants for current direction - - #region Set Normal - - Vector3d FaceNormal; - - switch ( side ) - { - case eSides.Front: - FaceNormal = Vector3d.UnitZ; - break; - case eSides.Back: - FaceNormal = -Vector3d.UnitZ; - break; - case eSides.Right: - FaceNormal = Vector3d.UnitX; - break; - case eSides.Left: - FaceNormal = -Vector3d.UnitX; - break; - case eSides.Top: - FaceNormal = Vector3d.UnitY; - break; - case eSides.Bottom: - FaceNormal = -Vector3d.UnitY; - break; - default: - throw new NotImplementedException( "Unknown enum value: " + side ); - } - #endregion Set Normal - - bool FaceIsVisible = false; - foreach ( eSides s in VisibleSides ) - { - if ( s == side ) - { - FaceIsVisible = true; - break; - } - } - - if ( FaceIsVisible ) - { - #region Define Layer1 Vertices - Chunk Layer1 = new Chunk( 8, 8 * 3 ); - - Layer1.Vertices[0].TexCoord = new Vector2d( _Zero, _Zero ); - Layer1.Vertices[0].Normal = FaceNormal; - Layer1.Vertices[0].Position = P0; - - Layer1.Vertices[1].TexCoord = new Vector2d( _One, _Zero ); - Layer1.Vertices[1].Normal = FaceNormal; - Layer1.Vertices[1].Position = P1; - - Layer1.Vertices[2].TexCoord = new Vector2d( _One, _One ); - Layer1.Vertices[2].Normal = FaceNormal; - Layer1.Vertices[2].Position = P2; - - Layer1.Vertices[3].TexCoord = new Vector2d( _Zero, _One ); - Layer1.Vertices[3].Normal = FaceNormal; - Layer1.Vertices[3].Position = P3; - - Layer1.Vertices[4].TexCoord = new Vector2d( _Three, _Three ); - Layer1.Vertices[4].Normal = FaceNormal; - Vector3d.Lerp( ref P0, ref P2, _Three, out Layer1.Vertices[4].Position ); - - Layer1.Vertices[5].TexCoord = new Vector2d( _Six, _Three ); - Layer1.Vertices[5].Normal = FaceNormal; - Vector3d.Lerp( ref P1, ref P3, _Three, out Layer1.Vertices[5].Position ); - - Layer1.Vertices[6].TexCoord = new Vector2d( _Six, _Six ); - Layer1.Vertices[6].Normal = FaceNormal; - Vector3d.Lerp( ref P0, ref P2, _Six, out Layer1.Vertices[6].Position ); - - Layer1.Vertices[7].TexCoord = new Vector2d( _Three, _Six ); - Layer1.Vertices[7].Normal = FaceNormal; - Vector3d.Lerp( ref P1, ref P3, _Six, out Layer1.Vertices[7].Position ); - #endregion Define Layer1 Vertices - - #region Define Layer1 Indices - Layer1.Indices[0] = 0; - Layer1.Indices[1] = 5; - Layer1.Indices[2] = 4; - - Layer1.Indices[3] = 0; - Layer1.Indices[4] = 1; - Layer1.Indices[5] = 5; - - Layer1.Indices[6] = 5; - Layer1.Indices[7] = 1; - Layer1.Indices[8] = 2; - - Layer1.Indices[9] = 6; - Layer1.Indices[10] = 5; - Layer1.Indices[11] = 2; - - Layer1.Indices[12] = 7; - Layer1.Indices[13] = 6; - Layer1.Indices[14] = 2; - - Layer1.Indices[15] = 3; - Layer1.Indices[16] = 7; - Layer1.Indices[17] = 2; - - Layer1.Indices[18] = 0; - Layer1.Indices[19] = 7; - Layer1.Indices[20] = 3; - - Layer1.Indices[21] = 0; - Layer1.Indices[22] = 4; - Layer1.Indices[23] = 7; - - chunks.Add( Layer1 ); - #endregion Define Layer1 Indices - } - - #region Define Layer2 Vertices - Chunk Layer2 = new Chunk( 12, 8 * 3 ); - - Vector3d T0, T1, T2, T3; - Vector3d.Lerp( ref P0, ref P4, _Six, out T0 ); - Vector3d.Lerp( ref P1, ref P5, _Six, out T1 ); - Vector3d.Lerp( ref P2, ref P6, _Six, out T2 ); - Vector3d.Lerp( ref P3, ref P7, _Six, out T3 ); - - Layer2.Vertices[0].TexCoord = new Vector2d( _Three, _Zero ); - Layer2.Vertices[0].Normal = FaceNormal; - Vector3d.Lerp( ref T0, ref T1, _Three, out Layer2.Vertices[0].Position ); - - Layer2.Vertices[1].TexCoord = new Vector2d( _Six, _Zero ); - Layer2.Vertices[1].Normal = FaceNormal; - Vector3d.Lerp( ref T0, ref T1, _Six, out Layer2.Vertices[1].Position ); - - Layer2.Vertices[3].TexCoord = new Vector2d( _One, _Three ); - Layer2.Vertices[3].Normal = FaceNormal; - Vector3d.Lerp( ref T1, ref T2, _Three, out Layer2.Vertices[3].Position ); - - Layer2.Vertices[4].TexCoord = new Vector2d( _One, _Six ); - Layer2.Vertices[4].Normal = FaceNormal; - Vector3d.Lerp( ref T1, ref T2, _Six, out Layer2.Vertices[4].Position ); - - Layer2.Vertices[6].TexCoord = new Vector2d( _Six, _One ); - Layer2.Vertices[6].Normal = FaceNormal; - Vector3d.Lerp( ref T2, ref T3, _Three, out Layer2.Vertices[6].Position ); - - Layer2.Vertices[7].TexCoord = new Vector2d( _Three, _One ); - Layer2.Vertices[7].Normal = FaceNormal; - Vector3d.Lerp( ref T2, ref T3, _Six, out Layer2.Vertices[7].Position ); - - Layer2.Vertices[9].TexCoord = new Vector2d( _Zero, _Six ); - Layer2.Vertices[9].Normal = FaceNormal; - Vector3d.Lerp( ref T3, ref T0, _Three, out Layer2.Vertices[9].Position ); - - Layer2.Vertices[10].TexCoord = new Vector2d( _Zero, _Three ); - Layer2.Vertices[10].Normal = FaceNormal; - Vector3d.Lerp( ref T3, ref T0, _Six, out Layer2.Vertices[10].Position ); - - Layer2.Vertices[2].TexCoord = new Vector2d( _Six, _Three ); - Layer2.Vertices[2].Normal = FaceNormal; - Vector3d.Lerp( ref Layer2.Vertices[1].Position, ref Layer2.Vertices[6].Position, _Three, out Layer2.Vertices[2].Position ); - - Layer2.Vertices[5].TexCoord = new Vector2d( _Six, _Six ); - Layer2.Vertices[5].Normal = FaceNormal; - Vector3d.Lerp( ref Layer2.Vertices[1].Position, ref Layer2.Vertices[6].Position, _Six, out Layer2.Vertices[5].Position ); - - Layer2.Vertices[8].TexCoord = new Vector2d( _Three, _Six ); - Layer2.Vertices[8].Normal = FaceNormal; - Vector3d.Lerp( ref Layer2.Vertices[7].Position, ref Layer2.Vertices[0].Position, _Three, out Layer2.Vertices[8].Position ); - - Layer2.Vertices[11].TexCoord = new Vector2d( _Three, _Three ); - Layer2.Vertices[11].Normal = FaceNormal; - Vector3d.Lerp( ref Layer2.Vertices[7].Position, ref Layer2.Vertices[0].Position, _Six, out Layer2.Vertices[11].Position ); - #endregion Define Layer2 Vertices - - #region Define Layer2 Indices - Layer2.Indices[0] = 0; - Layer2.Indices[1] = 2; - Layer2.Indices[2] = 11; - - Layer2.Indices[3] = 0; - Layer2.Indices[4] = 1; - Layer2.Indices[5] = 2; - - Layer2.Indices[6] = 2; - Layer2.Indices[7] = 3; - Layer2.Indices[8] = 4; - - Layer2.Indices[9] = 2; - Layer2.Indices[10] = 4; - Layer2.Indices[11] = 5; - - Layer2.Indices[12] = 5; - Layer2.Indices[13] = 6; - Layer2.Indices[14] = 8; - - Layer2.Indices[15] = 8; - Layer2.Indices[16] = 6; - Layer2.Indices[17] = 7; - - Layer2.Indices[18] = 11; - Layer2.Indices[19] = 8; - Layer2.Indices[20] = 10; - - Layer2.Indices[21] = 10; - Layer2.Indices[22] = 8; - Layer2.Indices[23] = 9; - - chunks.Add( Layer2 ); - #endregion Define Layer2 Indices - } - } - } - - -} diff --git a/Source/Examples/Shapes/Helpers/TetrahedronFace.cs b/Source/Examples/Shapes/Helpers/TetrahedronFace.cs deleted file mode 100644 index dabfe06f..00000000 --- a/Source/Examples/Shapes/Helpers/TetrahedronFace.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System; - -using OpenTK; - -namespace Examples.Shapes -{ - - /// winding always assumed CCW (Counter-ClockWise) - internal struct TetrahedronFace - { - private Vector3d APosition, BPosition, CPosition; - private Vector3d DPosition, Normal; - private Vector2d ATexCoord, BTexCoord, CTexCoord; - - public TetrahedronFace( ref Vector3d apos, ref Vector2d atc, - ref Vector3d bpos, ref Vector2d btc, - ref Vector3d cpos, ref Vector2d ctc, - ref Vector3d dpos, - ref Vector3d normal ) - { - APosition = apos; ATexCoord = atc; - BPosition = bpos; BTexCoord = btc; - CPosition = cpos; CTexCoord = ctc; - DPosition = dpos; - Normal = normal; - } - - /// Expects CCW triangle order as input, emits 4 new CCW triangles. - /// 1st output Triangle - /// 2nd output Triangle - /// 3rd output Triangle - /// 4th output Triangle - public void SubdivideSierpinski( out TetrahedronFace first, out TetrahedronFace second, out TetrahedronFace third, out TetrahedronFace fourth ) - { - Vector3d temp; - - // find the 3 points AB, BC, CA - Vector3d CenterAB; - Vector3d.Add( ref this.APosition, ref this.BPosition, out temp ); - Vector3d.Multiply( ref temp, 0.5f, out CenterAB ); - - Vector3d CenterBC; - Vector3d.Add( ref this.BPosition, ref this.CPosition, out temp ); - Vector3d.Multiply( ref temp, 0.5f, out CenterBC ); - - Vector3d CenterCA; - Vector3d.Add( ref this.CPosition, ref this.APosition, out temp ); - Vector3d.Multiply( ref temp, 0.5f, out CenterCA ); - - // find the 3 points AD, BD, CD - Vector3d CenterAD; - Vector3d.Lerp( ref this.APosition, ref this.DPosition, 0.5, out CenterAD ); - - Vector3d CenterBD; - Vector3d.Lerp( ref this.BPosition, ref this.DPosition, 0.5, out CenterBD ); - - Vector3d CenterCD; - Vector3d.Lerp( ref this.CPosition, ref this.DPosition, 0.5, out CenterCD ); - - // emit 4 new CCW triangles - first = new TetrahedronFace( ref this.APosition, ref this.ATexCoord, - ref CenterAB, ref this.BTexCoord, - ref CenterCA, ref this.CTexCoord, - ref CenterAD, - ref this.Normal ); - - second = new TetrahedronFace( ref CenterAB, ref this.ATexCoord, - ref this.BPosition, ref this.BTexCoord, - ref CenterBC, ref this.CTexCoord, - ref CenterBD, - ref this.Normal ); - - third = new TetrahedronFace( ref CenterCA, ref this.ATexCoord, - ref CenterBC, ref this.BTexCoord, - ref this.CPosition, ref this.CTexCoord, - ref CenterCD, - ref this.Normal ); - - fourth = new TetrahedronFace( ref CenterAD, ref this.ATexCoord, - ref CenterBD, ref this.BTexCoord, - ref CenterCD, ref this.CTexCoord, - ref this.DPosition, - ref this.Normal ); - } - - - internal void SubdivideKoch( double height, out TetrahedronFace first, out TetrahedronFace second, out TetrahedronFace third, out TetrahedronFace fourth, out TetrahedronFace fifth, out TetrahedronFace sixth ) - { - Vector3d CenterAB, CenterBC, CenterCA, CenterD; - Vector2d TexCoordAB, TexCoordBC, TexCoordCA, TexCoordD; - - Vector3d.Lerp( ref this.APosition, ref this.BPosition, 0.5, out CenterAB ); - Vector3d.Lerp( ref this.BPosition, ref this.CPosition, 0.5, out CenterBC ); - Vector3d.Lerp( ref this.CPosition, ref this.APosition, 0.5, out CenterCA ); - CenterD = CenterAB; - Vector3d.Add(ref CenterD, ref CenterBC, out CenterD); - Vector3d.Add(ref CenterD, ref CenterCA, out CenterD); - CenterD /= 3.0; - Vector3d E = CenterD + ( this.Normal * 0.5 ); - Vector3d temp = this.Normal; - temp *= height; - Vector3d.Add(ref CenterD, ref temp, out CenterD); - - Vector2d.Lerp( ref this.ATexCoord, ref this.BTexCoord, 0.5, out TexCoordAB ); - Vector2d.Lerp( ref this.BTexCoord, ref this.CTexCoord, 0.5, out TexCoordBC ); - Vector2d.Lerp( ref this.CTexCoord, ref this.ATexCoord, 0.5, out TexCoordCA ); - TexCoordD = TexCoordAB; - Vector2d.Add(ref TexCoordD, ref TexCoordBC, out TexCoordD); - Vector2d.Add(ref TexCoordD, ref TexCoordCA, out TexCoordD); - TexCoordD /= 3.0; - #region 1 - first.APosition = this.APosition; - first.ATexCoord = this.ATexCoord; - - first.BPosition = CenterAB; - first.BTexCoord = TexCoordAB; - - first.CPosition = CenterCA; - first.CTexCoord = TexCoordCA; - - first.Normal = this.Normal; - temp = ( this.APosition + CenterAB + CenterCA ); - temp /= 3.0; - temp += this.Normal * -1.0; - first.DPosition = temp; - #endregion 1 - #region 2 - second.APosition = CenterAB; - second.ATexCoord = TexCoordAB; - - second.BPosition = this.BPosition; - second.BTexCoord = this.BTexCoord; - - second.CPosition = CenterBC; - second.CTexCoord = TexCoordBC; - - second.Normal = this.Normal; - - temp = CenterAB + this.BPosition + CenterBC; - temp /= 3.0; - temp += this.Normal * -1.0; - second.DPosition = temp; - - #endregion 2 - #region 3 - third.APosition = CenterBC; - third.ATexCoord = TexCoordBC; - - third.BPosition = this.CPosition; - third.BTexCoord = this.CTexCoord; - - third.CPosition = CenterCA; - third.CTexCoord = TexCoordCA; - - third.Normal = this.Normal; - temp = CenterBC + this.CPosition + CenterCA; - temp /= 3.0; - temp += this.Normal * -1.0; - third.DPosition = temp; - #endregion 3 - #region 4 - fourth.APosition = CenterAB; - fourth.ATexCoord = TexCoordAB; - - fourth.BPosition = CenterD; - fourth.BTexCoord = TexCoordD; - - fourth.CPosition = CenterCA; - fourth.CTexCoord = TexCoordCA; - - SierpinskiTetrahedron.FindNormal( ref CenterAB, ref CenterD, ref CenterCA, out fourth.Normal ); - fourth.DPosition = E; - #endregion 4 - #region 5 - fifth.APosition = CenterAB; - fifth.ATexCoord = TexCoordAB; - - fifth.BPosition = CenterBC; - fifth.BTexCoord = TexCoordBC; - - fifth.CPosition = CenterD; - fifth.CTexCoord = TexCoordD; - - SierpinskiTetrahedron.FindNormal( ref CenterAB, ref CenterBC, ref CenterD, out fifth.Normal ); - fifth.DPosition = E; - - #endregion 5 - #region 6 - sixth.APosition = CenterBC; - sixth.ATexCoord = TexCoordBC; - - sixth.BPosition = CenterCA; - sixth.BTexCoord = TexCoordCA; - - sixth.CPosition = CenterD; - sixth.CTexCoord = TexCoordD; - - SierpinskiTetrahedron.FindNormal( ref CenterBC, ref CenterCA, ref CenterD, out sixth.Normal ); - sixth.DPosition = E; - #endregion 6 - } - - /// Returns 3 Vertices which form a CCW triangle. - public void GetVertices( out VertexT2dN3dV3d first, out VertexT2dN3dV3d second, out VertexT2dN3dV3d third ) - { - first.TexCoord = this.ATexCoord; - first.Normal = this.Normal; - first.Position = this.APosition; - - second.TexCoord = this.BTexCoord; - second.Normal = this.Normal; - second.Position = this.BPosition; - - third.TexCoord = this.CTexCoord; - third.Normal = this.Normal; - third.Position = this.CPosition; - } - - /// Debugging Aid, no real purpose - public override string ToString() - { - return "A= " + this.APosition.ToString() + " TexCoord: " + this.ATexCoord.ToString() + "\n" + - "B= " + this.BPosition.ToString() + " TexCoord: " + this.ATexCoord.ToString() + "\n" + - "C= " + this.CPosition.ToString() + " TexCoord: " + this.ATexCoord.ToString() + "\n" + - "Normal= " + this.Normal.ToString(); - } - } - - -} diff --git a/Source/Examples/Shapes/Helpers/VboShape.cs b/Source/Examples/Shapes/Helpers/VboShape.cs deleted file mode 100644 index 23c4b21a..00000000 --- a/Source/Examples/Shapes/Helpers/VboShape.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Examples.Shapes -{ - public sealed class VboShape: DrawableShape - { - public VboShape(ref OpenTK.Graphics.OpenGL.PrimitiveType primitives, ref VertexT2dN3dV3d[] vertices, ref uint[] indices, bool useDL) - : base( useDL ) - { - PrimitiveMode = primitives; - - VertexArray = new VertexT2dN3dV3d[vertices.Length]; - for ( uint i = 0; i < vertices.Length; i++ ) - { - VertexArray[i] = vertices[i]; - } - - IndexArray = new uint[indices.Length]; - for ( uint i = 0; i < indices.Length; i++ ) - { - IndexArray[i] = indices[i]; - } - } - } -} diff --git a/Source/Examples/Shapes/KochTetrahedron.cs b/Source/Examples/Shapes/KochTetrahedron.cs deleted file mode 100644 index 8d3f2fab..00000000 --- a/Source/Examples/Shapes/KochTetrahedron.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Examples.Shapes -{ - public sealed class KochTetrahedron: DrawableShape - { - - public enum eSubdivisions - { - Zero = 0, - One = 1, - Two = 2, - Three = 3, - Four = 4, - Five=5, - Six=6, - Seven=7, - Eight=8, - } - - public KochTetrahedron( double scale, double extrusionHeight, double extrusionMultiplier, eSubdivisions subdivs, bool useDL ) - : base( useDL ) - { - TetrahedronFace[] Triangles; - - switch ( subdivs ) - { - case eSubdivisions.Zero: - SierpinskiTetrahedron.CreateDefaultTetrahedron( scale, out Triangles ); - break; - case eSubdivisions.One: - case eSubdivisions.Two: - case eSubdivisions.Three: - case eSubdivisions.Four: - case eSubdivisions.Five: - case eSubdivisions.Six: - case eSubdivisions.Seven: - case eSubdivisions.Eight: - SierpinskiTetrahedron.CreateDefaultTetrahedron( scale, out Triangles ); - for ( int i = 0; i < (int)subdivs; i++ ) - { - TetrahedronFace[] temp; - this.SubdivideKoch( extrusionHeight, ref Triangles, out temp ); - Triangles = temp; - extrusionHeight *= extrusionMultiplier; - } - break; - default: throw new ArgumentOutOfRangeException( "Subdivisions other than contained in the enum cause overflows and are not allowed." ); - - } - - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - SierpinskiTetrahedron.GetVertexArray( ref Triangles, out VertexArray ); - IndexArray = null; - } - - private void SubdivideKoch( double height, ref TetrahedronFace[] input, out TetrahedronFace[] output ) - { - output = new TetrahedronFace[input.Length * 6]; - - int counter = 0; - for ( int i = 0; i < input.Length; i++ ) - { - input[i].SubdivideKoch(height, out output[counter + 0], out output[counter + 1], out output[counter + 2], out output[counter + 3], out output[counter + 4], out output[counter + 5] ); - counter += 6; // every source triangle emits 6 new triangles - } - - } - } -} diff --git a/Source/Examples/Shapes/MengerSponge.cs b/Source/Examples/Shapes/MengerSponge.cs deleted file mode 100644 index dd78af82..00000000 --- a/Source/Examples/Shapes/MengerSponge.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; - -using OpenTK; - -namespace Examples.Shapes -{ - public sealed partial class MengerSponge: DrawableShape - { - - public enum eSubdivisions - { - None = 0, - One = 1, - Two = 2, - Three = 3, - } - - public MengerSponge( double scale, eSubdivisions subdivs, bool useDL ) - : base( useDL ) - { - List Cubes; - switch ( subdivs ) - { - case eSubdivisions.None: - CreateDefaultMengerSponge( scale, out Cubes ); - break; - case eSubdivisions.One: - case eSubdivisions.Two: - case eSubdivisions.Three: - CreateDefaultMengerSponge( scale, out Cubes ); - for ( int i = 0; i < (int)subdivs; i++ ) - { - List temp; - SubdivideMengerSponge( ref Cubes, out temp ); - Cubes = temp; - } - break; - default: throw new ArgumentOutOfRangeException( "Subdivisions other than contained in the enum cause overflows and are not allowed." ); - } - - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - - #region Get Array Dimensions - uint - VertexCount = 0, - IndexCount = 0; - - foreach ( MengerCube c in Cubes ) - { - uint t1, t2; - c.GetArraySizes( out t1, out t2 ); - VertexCount += t1; - IndexCount += t2; - } - - VertexArray = new VertexT2dN3dV3d[VertexCount]; - IndexArray = new uint[IndexCount]; - #endregion Get Array Dimensions - - List AllChunks = new List(); - - #region Build a temporary List of all loose pieces - foreach ( MengerCube c in Cubes ) - { - c.GetVboAndIbo( ref AllChunks ); - } - #endregion Build a temporary List of all loose pieces - - #region Assemble pieces into a single VBO and IBO - VertexCount = 0; - IndexCount = 0; - - foreach ( Chunk ch in AllChunks ) - { - for ( int i = 0; i < ch.Vertices.Length; i++ ) - { - VertexArray[VertexCount + i] = ch.Vertices[i]; - } - - for ( int i = 0; i < ch.Indices.Length; i++ ) - { - IndexArray[IndexCount + i] = ch.Indices[i] + VertexCount; - } - - VertexCount += (uint)ch.Vertices.Length; - IndexCount += (uint)ch.Indices.Length; - } - - #endregion Assemble pieces into a single VBO and IBO - - AllChunks.Clear(); - } - - private void CreateDefaultMengerSponge( double halfwidth, out List output ) - { - output = new List( 1 ); - output.Add( new MengerCube( Vector3d.Zero, halfwidth, MengerCube.AllSides, MengerCube.AllSides ) ); - } - - private void SubdivideMengerSponge( ref List input, out List output ) - { - output = new List( input.Count * 20 ); - foreach ( MengerCube InputCube in input ) - { - MengerCube[] SubdividedCubes; - InputCube.Subdivide( out SubdividedCubes ); - for ( int i = 0; i < SubdividedCubes.Length; i++ ) - { - output.Add( SubdividedCubes[i] ); - } - } - } - - } -} diff --git a/Source/Examples/Shapes/Old/Cube.cs b/Source/Examples/Shapes/Old/Cube.cs deleted file mode 100644 index a77f888f..00000000 --- a/Source/Examples/Shapes/Old/Cube.cs +++ /dev/null @@ -1,75 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; - -using System.Runtime.InteropServices; - -using OpenTK; - -namespace Examples.Shapes -{ - public class Cube : Shape - { - public Cube() - { - Vertices = new Vector3[] - { - new Vector3(-1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, 1.0f, -1.0f), - new Vector3(-1.0f, 1.0f, -1.0f) - }; - - Indices = new int[] - { - // front face - 0, 1, 2, 2, 3, 0, - // top face - 3, 2, 6, 6, 7, 3, - // back face - 7, 6, 5, 5, 4, 7, - // left face - 4, 0, 3, 3, 7, 4, - // bottom face - 0, 1, 5, 5, 4, 0, - // right face - 1, 5, 6, 6, 2, 1, - }; - - Normals = new Vector3[] - { - new Vector3(-1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, -1.0f, 1.0f), - new Vector3( 1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, 1.0f, 1.0f), - new Vector3(-1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, -1.0f, -1.0f), - new Vector3( 1.0f, 1.0f, -1.0f), - new Vector3(-1.0f, 1.0f, -1.0f), - }; - - Colors = new int[] - { - Utilities.ColorToRgba32(Color.DarkRed), - Utilities.ColorToRgba32(Color.DarkRed), - Utilities.ColorToRgba32(Color.Gold), - Utilities.ColorToRgba32(Color.Gold), - Utilities.ColorToRgba32(Color.DarkRed), - Utilities.ColorToRgba32(Color.DarkRed), - Utilities.ColorToRgba32(Color.Gold), - Utilities.ColorToRgba32(Color.Gold), - }; - } - } -} diff --git a/Source/Examples/Shapes/Old/IsoSphere.cs b/Source/Examples/Shapes/Old/IsoSphere.cs deleted file mode 100644 index 8372af88..00000000 --- a/Source/Examples/Shapes/Old/IsoSphere.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; - -using OpenTK; - -namespace Examples.Shapes -{ - class IsoSphere : Shape - { - const double DoublePI = System.Math.PI * 2.0; - - public IsoSphere(int s_steps, int t_steps, float x_scale, float y_scale, float z_scale) - { - int count = 4 * s_steps * t_steps ; - - Vertices = new Vector3[count]; - Normals = new Vector3[count]; - Texcoords = new Vector2[count]; - Indices = new int[6 * count / 4]; - - int i = 0; - for (double t = -System.Math.PI; (float)t < (float)System.Math.PI - Single.Epsilon; t += System.Math.PI / (double)t_steps) - { - for (double s = 0.0; (float)s < (float)DoublePI; s += System.Math.PI / (double)s_steps) - { - Vertices[i].X = x_scale * (float)(System.Math.Cos(s) * System.Math.Sin(t)); - Vertices[i].Y = y_scale * (float)(System.Math.Sin(s) * System.Math.Sin(t)); - Vertices[i].Z = z_scale * (float)System.Math.Cos(t); - //vertices[i] = vertices[i].Scale(x_scale, y_scale, z_scale); - Normals[i] = Vector3.Normalize(Vertices[i]); - - ++i; - } - } - - for (i = 0; i < 6*count/4; i+=6) - { - Indices[i] = i; - Indices[i + 1] = i + 1; - Indices[i + 2] = i + 2 * s_steps + 1; - Indices[i + 3] = i + 2 * s_steps; - Indices[i + 4] = i; - Indices[i + 5] = i + 2 * s_steps + 1; - } - } - } -} diff --git a/Source/Examples/Shapes/Old/Plane.cs b/Source/Examples/Shapes/Old/Plane.cs deleted file mode 100644 index 633bcb0e..00000000 --- a/Source/Examples/Shapes/Old/Plane.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; - -using OpenTK; - -namespace Examples.Shapes -{ - public class Plane : Shape - { - public Plane(int x_res, int y_res, float x_scale, float y_scale) - { - Vertices = new Vector3[x_res * y_res]; - Normals = new Vector3[x_res * y_res]; - Indices = new int[6 * x_res * y_res]; - Texcoords = new Vector2[x_res * y_res]; - - int i = 0; - for (int y = -y_res / 2; y < y_res / 2; y++) - { - for (int x = -x_res / 2; x < x_res / 2; x++) - { - Vertices[i].X = x_scale * (float)x / (float)x_res; - Vertices[i].Y = y_scale * (float)y / (float)y_res; - Vertices[i].Z = 0; - Normals[i].X = Normals[i].Y = 0; - Normals[i].Z = 1; - i++; - } - } - - i = 0; - for (int y = 0; y < y_res - 1; y++) - { - for (int x = 0; x < x_res - 1; x++) - { - Indices[i++] = (y + 0) * x_res + x; - Indices[i++] = (y + 1) * x_res + x; - Indices[i++] = (y + 0) * x_res + x + 1; - - Indices[i++] = (y + 0) * x_res + x + 1; - Indices[i++] = (y + 1) * x_res + x; - Indices[i++] = (y + 1) * x_res + x + 1; - } - } - } - } -} diff --git a/Source/Examples/Shapes/Old/Shape.cs b/Source/Examples/Shapes/Old/Shape.cs deleted file mode 100644 index faa7d2b7..00000000 --- a/Source/Examples/Shapes/Old/Shape.cs +++ /dev/null @@ -1,70 +0,0 @@ -#region --- License --- -/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos - * See license.txt for license info - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; - -using System.Runtime.InteropServices; -using System.Drawing; - -using OpenTK; - -namespace Examples.Shapes -{ - public abstract class Shape - { - private Vector3[] vertices, normals; - private Vector2[] texcoords; - private int[] indices; - private int[] colors; - - public Vector3[] Vertices - { - get { return vertices; } - protected set - { - vertices = value; - } - } - - public Vector3[] Normals - { - get { return normals; } - protected set - { - normals = value; - } - } - - public Vector2[] Texcoords - { - get { return texcoords; } - protected set - { - texcoords = value; - } - } - - public int[] Indices - { - get { return indices; } - protected set - { - indices = value; - } - } - - public int[] Colors - { - get { return colors; } - protected set - { - colors = value; - } - } - } -} diff --git a/Source/Examples/Shapes/Old/SierpinskiTetrahedron.cs b/Source/Examples/Shapes/Old/SierpinskiTetrahedron.cs deleted file mode 100644 index 22f59cfe..00000000 --- a/Source/Examples/Shapes/Old/SierpinskiTetrahedron.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Diagnostics; - -using OpenTK; - -namespace Examples.Shapes -{ - public sealed partial class SierpinskiTetrahedron: DrawableShape - { - - public enum eSubdivisions - { - /// Creates a Sierpinski Tetrahedron using 4 triangles. - Zero = 0, - /// Creates a Sierpinski Tetrahedron using 16 triangles. - One = 1, - /// Creates a Sierpinski Tetrahedron using 64 triangles. - Two = 2, - /// Creates a Sierpinski Tetrahedron using 256 triangles. - Three = 3, - /// Creates a Sierpinski Tetrahedron using 1024 triangles. - Four = 4, - /// Creates a Sierpinski Tetrahedron using 4096 triangles. - Five = 5, - /// Creates a Sierpinski Tetrahedron using 16384 triangles. - Six = 6, - /// Creates a Sierpinski Tetrahedron using 65536 triangles. - Seven = 7, - /// Creates a Sierpinski Tetrahedron using 262144 triangles. - Eight = 8, - /// Creates a Sierpinski Tetrahedron using 1048576 triangles. - Nine = 9, - } - - /// Creates a Sierpinski Tetrahedron which is centered at (0,0,0) and fits into a sphere of radius 1f, or a diameter of 2f - /// Default: 1f. - /// The number of subdivisions of the Tetrahedron. - /// - public SierpinskiTetrahedron( double scale, eSubdivisions subdivs, bool useDL ) - : base( useDL ) - { - TetrahedronFace[] Triangles; - - switch ( subdivs ) - { - case eSubdivisions.Zero: - CreateDefaultTetrahedron( scale, out Triangles ); - break; - case eSubdivisions.One: - case eSubdivisions.Two: - case eSubdivisions.Three: - case eSubdivisions.Four: - case eSubdivisions.Five: - case eSubdivisions.Six: - case eSubdivisions.Seven: - case eSubdivisions.Eight: - case eSubdivisions.Nine: - CreateDefaultTetrahedron( scale, out Triangles ); - for ( int i = 0; i < (int)subdivs; i++ ) - { - TetrahedronFace[] temp; - SubdivideTetrahedron( ref Triangles, out temp ); - Triangles = temp; - } - break; - default: throw new ArgumentOutOfRangeException( "Subdivisions other than contained in the enum cause overflows and are not allowed." ); - } - - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - SierpinskiTetrahedron.GetVertexArray( ref Triangles, out VertexArray ); - IndexArray = null; - } - - internal static void GetVertexArray( ref TetrahedronFace[] input, out VertexT2dN3dV3d[] output ) - { - output = new VertexT2dN3dV3d[input.Length * 3]; - int counter = 0; - for ( int i = 0; i < input.Length; i++ ) - { - input[i].GetVertices( out output[counter + 0], out output[counter + 1], out output[counter + 2] ); - counter += 3; - } - } - - /// Generates the lowest subdivision mesh, which consists of 4 Triangles. - internal static void CreateDefaultTetrahedron( double scale, out TetrahedronFace[] array ) - { - Vector3d[] Points = new Vector3d[4]; - Points[0] = new Vector3d( 0.0 * scale, 0.0 * scale, 1.0 * scale ); - Points[1] = new Vector3d( -0.816 * scale, 0.471 * scale, -0.333 * scale ); - Points[2] = new Vector3d( 0.816 * scale, 0.471 * scale, -0.333 * scale ); - Points[3] = new Vector3d( 0.0 * scale, -0.943 * scale, -0.333 * scale ); - - Vector2d[] TexCoords = new Vector2d[4]; - TexCoords[0] = new Vector2d( 0.0, 0.0 ); - TexCoords[1] = new Vector2d( 1.0, 0.0 ); - TexCoords[2] = new Vector2d( 0.0, 1.0 ); - TexCoords[3] = new Vector2d( 1.0, 1.0 ); - - Vector3d Normal; - array = new TetrahedronFace[4]; - - FindNormal( ref Points[0], ref Points[2], ref Points[1], ref Points[3], out Normal ); - array[0] = new TetrahedronFace( ref Points[0], ref TexCoords[2], - ref Points[2], ref TexCoords[0], - ref Points[1], ref TexCoords[1], - ref Points[3], - ref Normal ); - - FindNormal( ref Points[0], ref Points[3], ref Points[2], ref Points[1], out Normal ); - array[1] = new TetrahedronFace( ref Points[0], ref TexCoords[0], - ref Points[3], ref TexCoords[1], - ref Points[2], ref TexCoords[2], - ref Points[1], - ref Normal ); - - FindNormal( ref Points[0], ref Points[1], ref Points[3], ref Points[2], out Normal ); - array[2] = new TetrahedronFace( ref Points[0], ref TexCoords[2], - ref Points[1], ref TexCoords[1], - ref Points[3], ref TexCoords[3], - ref Points[2], - ref Normal ); - - FindNormal( ref Points[1], ref Points[2], ref Points[3], ref Points[0], out Normal ); - array[3] = new TetrahedronFace( ref Points[1], ref TexCoords[3], - ref Points[2], ref TexCoords[2], - ref Points[3], ref TexCoords[1], - ref Points[0], - ref Normal ); - } - - /// Subdivides each triangle into 4 new ones. - private void SubdivideTetrahedron( ref TetrahedronFace[] source, out TetrahedronFace[] output ) - { - - output = new TetrahedronFace[source.Length * 4]; - - int counter = 0; - for ( int i = 0; i < source.Length; i++ ) - { - source[i].SubdivideSierpinski( out output[counter + 0], out output[counter + 1], out output[counter + 2], out output[counter + 3] ); - counter += 4; // every source triangle emits 4 new triangles - } - } - - /// A, B and C are the triangle whos normal is to be determined. D is the 4th Point in the Tetraeder which does not belong to the triangle. - internal static void FindNormal( ref Vector3d A, ref Vector3d B, ref Vector3d C, ref Vector3d D, out Vector3d result ) - { - Vector3d temp1, temp2, temp3; - - Vector3d.Subtract( ref A, ref D, out temp1 ); - Vector3d.Subtract( ref B, ref D, out temp2 ); - Vector3d.Subtract( ref C, ref D, out temp3 ); - - Vector3d.Add( ref temp1, ref temp2, out result ); - Vector3d.Add(ref result, ref temp3, out result); - result.Normalize(); - } - - internal static void FindNormal( ref Vector3d A, ref Vector3d B, ref Vector3d C, out Vector3d result ) - { - Vector3d temp1, temp2; - Vector3d.Subtract( ref A, ref B, out temp1 ); - temp1.Normalize(); - Vector3d.Subtract(ref C, ref B, out temp2); - temp2.Normalize(); - Vector3d.Cross( ref temp1, ref temp2, out result ); - result *= -1.0; - result.Normalize(); - } - - } -} diff --git a/Source/Examples/Shapes/SlicedHose.cs b/Source/Examples/Shapes/SlicedHose.cs deleted file mode 100644 index a27ab67b..00000000 --- a/Source/Examples/Shapes/SlicedHose.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Collections.Generic; -using OpenTK; - -namespace Examples.Shapes -{ - public sealed class SlicedHose : DrawableShape - { - - public enum eSide:byte - { - // Around X Axis - BottomRight, - TopRight, - TopLeft, - BottomLeft, - - // Around Y Axis - - FrontRight, - BackRight, - BackLeft, - FrontLeft, - - // Around Z Axis - FrontBottom, - BackBottom, - BackTop, - FrontTop, - } - - public SlicedHose( eSide side, uint subdivs, double scale, Vector3d offset1, Vector3d offset2, bool useDL ) - : base( useDL ) - { - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - - Vector3d start = Vector3d.Zero, - end = Vector3d.Zero; - double TexCoordStart=0f, TexCoordEnd=0f; - - switch ( side ) - { - #region Around X Axis - case eSide.BottomRight: - start = -Vector3d.UnitY; - end = Vector3d.UnitZ; - TexCoordStart = 0.0; - TexCoordEnd = 0.25; - break; - case eSide.TopRight: - start = Vector3d.UnitZ; - end = Vector3d.UnitY; - TexCoordStart = 0.25; - TexCoordEnd = 0.5; - break; - case eSide.TopLeft: - start = Vector3d.UnitY; - end = -Vector3d.UnitZ; - TexCoordStart = 0.5; - TexCoordEnd = 0.75; - break; - case eSide.BottomLeft: - start = -Vector3d.UnitZ; - end = -Vector3d.UnitY; - TexCoordStart = 0.75; - TexCoordEnd = 1.0; - break; - #endregion Around X Axis - #region Around Y Axis - case eSide.FrontRight: - start = Vector3d.UnitX; - end = Vector3d.UnitZ; - TexCoordStart = 0.0; - TexCoordEnd = 0.25; - break; - case eSide.BackRight: - start = Vector3d.UnitZ; - end = -Vector3d.UnitX; - TexCoordStart = 0.25; - TexCoordEnd = 0.5; - break; - case eSide.BackLeft: - start = -Vector3d.UnitX; - end = -Vector3d.UnitZ; - TexCoordStart = 0.5; - TexCoordEnd = 0.75; - break; - case eSide.FrontLeft: - start = -Vector3d.UnitZ; - end = Vector3d.UnitX; - TexCoordStart = 0.75; - TexCoordEnd = 1.0; - break; -#endregion Around Y Axis - #region Around Z Axis - case eSide.FrontBottom: - start = -Vector3d.UnitY; - end = Vector3d.UnitX; - TexCoordStart = 0.0; - TexCoordEnd = 0.25; - break; - case eSide.BackBottom: - start = -Vector3d.UnitX; - end = -Vector3d.UnitY; - TexCoordStart = 0.25; - TexCoordEnd = 0.5; - break; - case eSide.BackTop: - start = Vector3d.UnitY; - end = -Vector3d.UnitX; - TexCoordStart = 0.5; - TexCoordEnd = 0.75; - break; - case eSide.FrontTop: - start = Vector3d.UnitX; - end = Vector3d.UnitY; - TexCoordStart = 0.75; - TexCoordEnd = 1.0; - break; -#endregion Around Z Axis - - } - - VertexT2dN3dV3d[] temp = new VertexT2dN3dV3d[2 + subdivs]; - - double divisor = 1.0/ ((double)temp.Length-1.0); - for ( int i = 0; i < temp.Length; i++ ) - { - float Multiplier = (float)( i * divisor ); - - temp[i].TexCoord.X = TexCoordStart * Multiplier + TexCoordEnd * ( 1.0f- Multiplier); - - Slerp( ref start, ref end, Multiplier, out temp[i].Normal ); - temp[i].Normal.Normalize(); - temp[i].Position = temp[i].Normal; - temp[i].Position *= scale; - } - - VertexArray = new VertexT2dN3dV3d[temp.Length * 2]; - IndexArray = new uint[( temp.Length - 1 ) * 2 * 3]; - - uint VertexCounter = 0, - IndexCounter = 0, - QuadCounter = 0; - - for ( int i = 0; i < temp.Length; i++ ) - { - VertexArray[VertexCounter + 0].TexCoord.X = temp[i].TexCoord.X; - VertexArray[VertexCounter + 0].TexCoord.Y = 0.0; - VertexArray[VertexCounter + 0].Normal = temp[i].Normal; - VertexArray[VertexCounter + 0].Position = temp[i].Position + offset1; - - - VertexArray[VertexCounter + 1].TexCoord.X = temp[i].TexCoord.X; - VertexArray[VertexCounter + 1].TexCoord.Y = 1.0; - VertexArray[VertexCounter + 1].Normal = temp[i].Normal; - VertexArray[VertexCounter + 1].Position = temp[i].Position + offset2; - VertexCounter += 2; - - if ( i < temp.Length - 1 ) - { - IndexArray[IndexCounter + 0] = QuadCounter + 0; - IndexArray[IndexCounter + 1] = QuadCounter + 1; - IndexArray[IndexCounter + 2] = QuadCounter + 2; - - IndexArray[IndexCounter + 3] = QuadCounter + 2; - IndexArray[IndexCounter + 4] = QuadCounter + 1; - IndexArray[IndexCounter + 5] = QuadCounter + 3; - - IndexCounter += 6; - QuadCounter += 2; - } - } - - } - - private void Slerp( ref Vector3d a, ref Vector3d b, double factor, out Vector3d result) - { - double t1; - Vector3d.Dot( ref a, ref b, out t1 ); - double theta = System.Math.Acos( t1 ); - - double temp = 1.0 / System.Math.Sin( theta ); - double t2 = System.Math.Sin( ( 1.0 - factor ) * theta ) * temp; - double t3 = System.Math.Sin( factor * theta ) * temp; - - Vector3d v1 = Vector3d.Multiply( a, t2); - Vector3d v2 = Vector3d.Multiply( b, t3 ); - result = Vector3d.Add( v1, v2 ); - } - - - } -} diff --git a/Source/Examples/Shapes/SlicedSphere.cs b/Source/Examples/Shapes/SlicedSphere.cs deleted file mode 100644 index 818d981c..00000000 --- a/Source/Examples/Shapes/SlicedSphere.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -using OpenTK; - -namespace Examples.Shapes -{ - public sealed class SlicedSphere: DrawableShape - { - public enum eSubdivisions - { - Zero = 0, - One = 1, - Two = 2, - Three = 3, - Four = 4, - Five=5, - Six=6, - Seven=7, - Eight=8, - } - - public enum eDir - { - All, - FrontTopRight, - FrontBottomRight, - FrontBottomLeft, - FrontTopLeft, - BackTopRight, - BackBottomRight, - BackBottomLeft, - BackTopLeft, - - } - - public SlicedSphere( double radius, Vector3d offset, eSubdivisions subdivs, eDir[] sides, bool useDL ) - : base( useDL ) - { - double Diameter = radius; - - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles; - - if ( sides[0] == eDir.All ) - { - sides = new eDir[] { eDir.FrontTopRight, - eDir.FrontBottomRight, - eDir.FrontBottomLeft, - eDir.FrontTopLeft, - eDir.BackTopRight, - eDir.BackBottomRight, - eDir.BackBottomLeft, - eDir.BackTopLeft,}; - } - - VertexArray = new VertexT2dN3dV3d[sides.Length * 3]; - IndexArray = new uint[sides.Length * 3]; - - uint counter = 0; - foreach ( eDir s in sides ) - { - GetDefaultVertices( s, Diameter, out VertexArray[counter + 0], out VertexArray[counter + 1], out VertexArray[counter + 2] ); - IndexArray[counter + 0] = counter + 0; - IndexArray[counter + 1] = counter + 1; - IndexArray[counter + 2] = counter + 2; - counter += 3; - } - - if ( subdivs != eSubdivisions.Zero ) - { - - for ( int s = 0; s < (int)subdivs; s++ ) - { - #region Assemble Chunks and convert to Arrays - List AllChunks = new List(); - for ( uint i = 0; i < IndexArray.Length; i += 3 ) - { - Chunk chu; - Subdivide( Diameter, - ref VertexArray[IndexArray[i + 0]], - ref VertexArray[IndexArray[i + 1]], - ref VertexArray[IndexArray[i + 2]], - out chu ); - AllChunks.Add( chu ); - } - - Chunk.GetArray( ref AllChunks, out VertexArray, out IndexArray ); - AllChunks.Clear(); - #endregion Assemble Chunks and convert to Arrays - } - } - - for (int i=0; i= MINPathSteps, "A Path must have at least " + MINPathSteps + " Steps to form a volume." ); - Trace.Assert( shapevertices >= MINShapeVertices, "A Shape must contain at least " + MINShapeVertices + " Vertices to be considered valid and create a volume." ); - Trace.Assert( TexCount >= 1, "at least 1 Texture set is required." ); - - PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.TriangleStrip; - - Vector3d[] PathPositions = new Vector3d[pathsteps]; - - #region Find the center Points for each step on the path - - for ( int i = 0; i < pathsteps; i++ ) - { - double Angle = ( i / (double)pathsteps ) * TwoPi; - double AngleTimesP = Angle * p; - double AngleTimesQ = Angle * q; - double r = ( 0.5 * ( 2.0 + System.Math.Sin( AngleTimesQ ) ) ); - - PathPositions[i] = new Vector3d( ( r * System.Math.Cos( AngleTimesP ) ), - ( r * System.Math.Cos( AngleTimesQ ) ), - ( r * System.Math.Sin( AngleTimesP ) ) ); - - } - #endregion Find the center Points for each step on the path - - #region Find the Torus length - Vector3d result; - double[] Lengths = new double[pathsteps]; - Vector3d.Subtract( ref PathPositions[pathsteps - 1], ref PathPositions[0], out result ); - Lengths[0] = result.Length; - double TotalLength = result.Length; - for ( int i = 1; i < pathsteps; i++ ) // skipping - { - Vector3d.Subtract( ref PathPositions[i - 1], ref PathPositions[i], out result ); - Lengths[i] = result.Length; - TotalLength += result.Length; - } - Trace.WriteLine( "the TorusKnot's length is: " + TotalLength + " " ); - #endregion Find the Torus length - - VertexArray = new VertexT2dN3dV3d[pathsteps * shapevertices]; - - #region Loft a circle Shape along the path - double TwoPiThroughVert = TwoPi / shapevertices; // precalc for reuse - for ( uint i = 0; i < pathsteps; i++ ) - { - Vector3d last, next, normal, tangent; - if ( i == pathsteps - 1 ) - next = PathPositions[0]; - else - next = PathPositions[i + 1]; - if ( i == 0 ) - last = PathPositions[pathsteps - 1]; - else - last = PathPositions[i - 1]; - - Vector3d.Subtract( ref next, ref last, out tangent ); // Guesstimate tangent - tangent.Normalize(); - - Vector3d.Add( ref next, ref last, out normal ); // Approximate N - normal.Normalize(); - Vector3d.Multiply( ref normal, radius, out normal );// scale the shape to desired radius - - for ( uint j = 0; j < shapevertices; j++ ) - { - uint index = i * (uint)shapevertices + j; - - // Create a point on the plane and rotate it - Matrix4d RotationMatrix = Matrix4d.Rotate( tangent, -( j * TwoPiThroughVert ) ); - Vector3d point = Vector3d.TransformVector( normal, RotationMatrix ); - Vector3d.Add( ref PathPositions[i], ref point, out VertexArray[index].Position ); - // Since the used shape is a circle, the Vertex normal's heading is easy to find - Vector3d.Subtract( ref VertexArray[index].Position, ref PathPositions[i], out VertexArray[index].Normal ); - VertexArray[index].Normal.Normalize(); - // just generate some semi-useful UVs to fill blanks - VertexArray[index].TexCoord = new Vector2d( (double)( i / TotalLength/ TexCount ), j / ( shapevertices - 1.0 ) ); - } - } - #endregion Loft a circle Shape along the path - - PathPositions = null; // not needed anymore - - uint currentindex = 0; - - #region Build a Triangle strip from the Vertices - IndexArray = new uint[pathsteps * ( shapevertices * 2 + 2 )]; // 2 triangles per vertex, +2 due to added degenerate triangles - for ( uint i = 0; i < pathsteps; i++ ) - { - uint RowCurrent = i * (uint)shapevertices; - uint RowBelow; - if ( i == pathsteps - 1 ) - RowBelow = 0; // for the last row, the first row is the following - else - RowBelow = ( i + 1 ) * (uint)shapevertices; - - // new ring begins here - for ( uint j = 0; j < shapevertices; j++ ) - { - IndexArray[currentindex++] = RowCurrent + j; - IndexArray[currentindex++] = RowBelow + j; - } - // ring ends here, repeat first 2 vertices to insert 2 degenerate triangles to reach following ring - IndexArray[currentindex++] = RowCurrent; - IndexArray[currentindex++] = RowBelow; - } - #endregion Build a Triangle strip from the Vertices - } - - } -} diff --git a/Source/Examples/Shapes/VertexPositionColor.cs b/Source/Examples/Shapes/VertexPositionColor.cs deleted file mode 100644 index 7ad5df57..00000000 --- a/Source/Examples/Shapes/VertexPositionColor.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2010 the Open Toolkit library, except where noted. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System.Drawing; -using System.Runtime.InteropServices; -using OpenTK; - -namespace Examples.Tutorial -{ - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct VertexPositionColor - { - public Vector3 Position; - public uint Color; - - public VertexPositionColor(float x, float y, float z, Color color) - { - Position = new Vector3(x, y, z); - Color = ToRgba(color); - } - - static uint ToRgba(Color color) - { - return (uint)color.A << 24 | (uint)color.B << 16 | (uint)color.G << 8 | (uint)color.R; - } - } -} diff --git a/Source/Examples/TextBoxTraceListener.cs b/Source/Examples/TextBoxTraceListener.cs deleted file mode 100644 index bd4cad21..00000000 --- a/Source/Examples/TextBoxTraceListener.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2009 the Open Toolkit library. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using System.Windows.Forms; -using System.Threading; - -namespace Examples -{ - public class TextBoxTraceListener : TraceListener - { - TextBox _target; - StringSendDelegate _invokeWrite; - - public TextBoxTraceListener(TextBox target) - { - _target = target; - _invokeWrite = new StringSendDelegate(SendString); - } - - public override void Write(string message) - { - if (_target.Created) - _target.BeginInvoke(_invokeWrite, new object[] { message }); - } - - public override void WriteLine(string message) - { - if (_target.Created) - _target.BeginInvoke(_invokeWrite, new object[] { message + Environment.NewLine }); - } - - private delegate void StringSendDelegate(string message); - private void SendString(string message) - { - if (_target.Created) - { - // No need to lock text box as this function will only - // ever be executed from the UI thread - _target.Text += message; - } - } - } -} diff --git a/Source/Examples/Utilities.cs b/Source/Examples/Utilities.cs deleted file mode 100644 index 83e64fbd..00000000 --- a/Source/Examples/Utilities.cs +++ /dev/null @@ -1,64 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK Team. - * This notice may not be removed from any source distribution. - * See license.txt for licensing details. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; - -using OpenTK; -using OpenTK.Input; - -namespace Examples -{ - public static class Utilities - { - /// - /// Converts a System.Drawing.Color to a System.Int32. - /// - /// The System.Drawing.Color to convert. - /// A System.Int32 containing the R, G, B, A values of the - /// given System.Drawing.Color in the Rbga32 format. - public static int ColorToRgba32(Color c) - { - return (int)((c.A << 24) | (c.B << 16) | (c.G << 8) | c.R); - } - - /// - /// Sets the window title to the name of the sample. - /// - /// - public static void SetWindowTitle(GameWindow window) - { - ExampleAttribute info = GetExampleAttribute(window.GetType()); - window.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - window.Icon = OpenTK.Examples.Properties.Resources.Game; - } - - /// - /// Sets the window title to the name of the sample. - /// - /// - public static void SetWindowTitle(System.Windows.Forms.Form window) - { - ExampleAttribute info = GetExampleAttribute(window.GetType()); - window.Text = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); - window.Icon = OpenTK.Examples.Properties.Resources.Game; - } - - static ExampleAttribute GetExampleAttribute(Type type) - { - object[] attributes = type.GetCustomAttributes(false); - foreach (object attr in attributes) - if (attr is ExampleAttribute) - return attr as ExampleAttribute; - - return null; - } - } -} diff --git a/Source/Examples/Utilities/LoaderDDS.cs b/Source/Examples/Utilities/LoaderDDS.cs deleted file mode 100644 index 2840ca84..00000000 --- a/Source/Examples/Utilities/LoaderDDS.cs +++ /dev/null @@ -1,711 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK Team. - * This notice may not be removed from any source distribution. - * See license.txt for licensing details. - */ -#endregion - -// #define READALL -// uncomment so ALL fields read from file are interpreted and filled. Necessary to implement uncompressed DDS - -// TODO: Find app that can build compressed dds cubemaps and verify that the import code works. - -using System; -using System.IO; -using System.Diagnostics; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.TextureLoaders -{ - /// - /// Expects the presence of a valid OpenGL Context and Texture Compression Extensions (GL 1.5) and Cube Maps (GL 1.3). - /// You will get what you give. No automatic Mipmap generation or automatic compression is done. (both bad quality) - /// Textures are never rescaled or checked if Power of 2, but you should make the Width and Height a multiple of 4 because DXTn uses 4x4 blocks. - /// (Image displays correctly but runs extremely slow with non-power-of-two Textures on FX5600, Cache misses?) - /// CubeMap support is experimental and the file must specify all 6 faces to work at all. - /// - static class ImageDDS - { - #region Constants - private const byte HeaderSizeInBytes = 128; // all non-image data together is 128 Bytes - private const uint BitMask = 0x00000007; // bits = 00 00 01 11 - - - private static NotImplementedException Unfinished = new NotImplementedException( "ERROR: Only 2 Dimensional DXT1/3/5 compressed images for now. 1D/3D Textures may not be compressed according to spec." ); - #endregion Constants - - #region Simplified In-Memory representation of the Image - private static bool _IsCompressed; - private static int _Width, _Height, _Depth, _MipMapCount; - private static int _BytesForMainSurface; // must be handled with care when implementing uncompressed formats! - private static byte _BytesPerBlock; - private static PixelInternalFormat _PixelInternalFormat; - #endregion Simplified In-Memory representation of the Image - - #region Flag Enums - [Flags] // Surface Description - private enum eDDSD: uint - { - CAPS = 0x00000001, // is always present - HEIGHT = 0x00000002, // is always present - WIDTH = 0x00000004, // is always present - PITCH = 0x00000008, // is set if the image is uncompressed - PIXELFORMAT = 0x00001000, // is always present - MIPMAPCOUNT = 0x00020000, // is set if the image contains MipMaps - LINEARSIZE = 0x00080000, // is set if the image is compressed - DEPTH = 0x00800000 // is set for 3D Volume Textures - } - - [Flags] // Pixelformat - private enum eDDPF: uint - { - NONE = 0x00000000, // not part of DX, added for convenience - ALPHAPIXELS = 0x00000001, - FOURCC = 0x00000004, - RGB = 0x00000040, - RGBA = 0x00000041 - } - - /// This list was derived from nVidia OpenGL SDK - [Flags] // Texture types - private enum eFOURCC: uint - { - UNKNOWN = 0, -#if READALL - R8G8B8 = 20, - A8R8G8B8 = 21, - X8R8G8B8 = 22, - R5G6B5 = 23, - X1R5G5B5 = 24, - A1R5G5B5 = 25, - A4R4G4B4 = 26, - R3G3B2 = 27, - A8 = 28, - A8R3G3B2 = 29, - X4R4G4B4 = 30, - A2B10G10R10 = 31, - A8B8G8R8 = 32, - X8B8G8R8 = 33, - G16R16 = 34, - A2R10G10B10 = 35, - A16B16G16R16 = 36, - - L8 = 50, - A8L8 = 51, - A4L4 = 52, - - D16_LOCKABLE = 70, - D32 = 71, - D24X8 = 77, - D16 = 80, - - D32F_LOCKABLE = 82, - L16 = 81, - - // s10e5 formats (16-bits per channel) - R16F = 111, - G16R16F = 112, - A16B16G16R16F = 113, - - // IEEE s23e8 formats (32-bits per channel) - R32F = 114, - G32R32F = 115, - A32B32G32R32F = 116 -#endif - DXT1 = 0x31545844, - DXT2 = 0x32545844, - DXT3 = 0x33545844, - DXT4 = 0x34545844, - DXT5 = 0x35545844, - } - - [Flags] // dwCaps1 - private enum eDDSCAPS: uint - { - NONE = 0x00000000, // not part of DX, added for convenience - COMPLEX = 0x00000008, // should be set for any DDS file with more than one main surface - TEXTURE = 0x00001000, // should always be set - MIPMAP = 0x00400000 // only for files with MipMaps - } - - [Flags] // dwCaps2 - private enum eDDSCAPS2: uint - { - NONE = 0x00000000, // not part of DX, added for convenience - CUBEMAP = 0x00000200, - CUBEMAP_POSITIVEX = 0x00000400, - CUBEMAP_NEGATIVEX = 0x00000800, - CUBEMAP_POSITIVEY = 0x00001000, - CUBEMAP_NEGATIVEY = 0x00002000, - CUBEMAP_POSITIVEZ = 0x00004000, - CUBEMAP_NEGATIVEZ = 0x00008000, - CUBEMAP_ALL_FACES = 0x0000FC00, - VOLUME = 0x00200000 // for 3D Textures - } - #endregion Flag Enums - - #region Private Members - private static string idString; // 4 bytes, must be "DDS " - private static UInt32 dwSize; // Size of structure is 124 bytes, 128 including all sub-structs and the header - private static UInt32 dwFlags; // Flags to indicate valid fields. - private static UInt32 dwHeight; // Height of the main image in pixels - private static UInt32 dwWidth; // Width of the main image in pixels - private static UInt32 dwPitchOrLinearSize; // For compressed formats, this is the total number of bytes for the main image. - private static UInt32 dwDepth; // For volume textures, this is the depth of the volume. - private static UInt32 dwMipMapCount; // total number of levels in the mipmap chain of the main image. -#if READALL - private static UInt32[] dwReserved1; // 11 UInt32s -#endif - // Pixelformat sub-struct, 32 bytes - private static UInt32 pfSize; // Size of Pixelformat structure. This member must be set to 32. - private static UInt32 pfFlags; // Flags to indicate valid fields. - private static UInt32 pfFourCC; // This is the four-character code for compressed formats. -#if READALL - private static UInt32 pfRGBBitCount; // For RGB formats, this is the total number of bits in the format. dwFlags should include DDpf_RGB in this case. This value is usually 16, 24, or 32. For A8R8G8B8, this value would be 32. - private static UInt32 pfRBitMask; // For RGB formats, these three fields contain the masks for the red, green, and blue channels. For A8R8G8B8, these values would be 0x00ff0000, 0x0000ff00, and 0x000000ff respectively. - private static UInt32 pfGBitMask; // .. - private static UInt32 pfBBitMask; // .. - private static UInt32 pfABitMask; // For RGB formats, this contains the mask for the alpha channel, if any. dwFlags should include DDpf_ALPHAPIXELS in this case. For A8R8G8B8, this value would be 0xff000000. -#endif - // Capabilities sub-struct, 16 bytes - private static UInt32 dwCaps1; // always includes DDSCAPS_TEXTURE. with more than one main surface DDSCAPS_COMPLEX should also be set. - private static UInt32 dwCaps2; // For cubic environment maps, DDSCAPS2_CUBEMAP should be included as well as one or more faces of the map (DDSCAPS2_CUBEMAP_POSITIVEX, DDSCAPS2_CUBEMAP_NEGATIVEX, DDSCAPS2_CUBEMAP_POSITIVEY, DDSCAPS2_CUBEMAP_NEGATIVEY, DDSCAPS2_CUBEMAP_POSITIVEZ, DDSCAPS2_CUBEMAP_NEGATIVEZ). For volume textures, DDSCAPS2_VOLUME should be included. -#if READALL - private static UInt32[] dwReserved2; // 3 = 2 + 1 UInt32 -#endif - #endregion Private Members - - /// - /// This function will generate, bind and fill a Texture Object with a DXT1/3/5 compressed Texture in .dds Format. - /// MipMaps below 4x4 Pixel Size are discarded, because DXTn's smallest unit is a 4x4 block of Pixel data. - /// It will set correct MipMap parameters, Filtering, Wrapping and EnvMode for the Texture. - /// The only call inside this function affecting OpenGL State is GL.BindTexture(); - /// - /// The name of the file you wish to load, including path and file extension. - /// 0 if invalid, otherwise a Texture Object usable with GL.BindTexture(). - /// 0 if invalid, will output what was loaded (typically Texture1D/2D/3D or Cubemap) - public static void LoadFromDisk( string filename, out uint texturehandle, out TextureTarget dimension ) - { - #region Prep data - // invalidate whatever it was before - dimension = (TextureTarget) 0; - texturehandle = TextureLoaderParameters.OpenGLDefaultTexture; - ErrorCode GLError = ErrorCode.NoError; - - _IsCompressed = false; - _Width = 0; - _Height = 0; - _Depth = 0; - _MipMapCount = 0; - _BytesForMainSurface = 0; - _BytesPerBlock = 0; - _PixelInternalFormat = PixelInternalFormat.Rgba8; - byte[] _RawDataFromFile; - #endregion - - #region Try - try // Exceptions will be thrown if any Problem occurs while working on the file. - { - _RawDataFromFile = File.ReadAllBytes( @filename ); - - #region Translate Header to less cryptic representation - ConvertDX9Header( ref _RawDataFromFile ); // The first 128 Bytes of the file is non-image data - - // start by checking if all forced flags are present. Flags indicate valid fields, but aren't written by every tool ..... - if ( idString != "DDS " || // magic key - dwSize != 124 || // constant size of struct, never reused - pfSize != 32 || // constant size of struct, never reused - !CheckFlag( dwFlags, (uint) eDDSD.CAPS ) || // must know it's caps - !CheckFlag( dwFlags, (uint) eDDSD.PIXELFORMAT ) || // must know it's format - !CheckFlag( dwCaps1, (uint) eDDSCAPS.TEXTURE ) // must be a Texture - ) - throw new ArgumentException( "ERROR: File has invalid signature or missing Flags." ); - - #region Examine Flags - if ( CheckFlag( dwFlags, (uint) eDDSD.WIDTH ) ) - _Width = (int) dwWidth; - else - throw new ArgumentException( "ERROR: Flag for Width not set." ); - - if ( CheckFlag( dwFlags, (uint) eDDSD.HEIGHT ) ) - _Height = (int) dwHeight; - else - throw new ArgumentException( "ERROR: Flag for Height not set." ); - - if ( CheckFlag( dwFlags, (uint) eDDSD.DEPTH ) && CheckFlag( dwCaps2, (uint) eDDSCAPS2.VOLUME ) ) - { - dimension = TextureTarget.Texture3D; // image is 3D Volume - _Depth = (int) dwDepth; - throw Unfinished; - } else - {// image is 2D or Cube - if ( CheckFlag( dwCaps2, (uint) eDDSCAPS2.CUBEMAP ) ) - { - dimension = TextureTarget.TextureCubeMap; - _Depth = 6; - } else - { - dimension = TextureTarget.Texture2D; - _Depth = 1; - } - } - - // these flags must be set for mipmaps to be included - if ( CheckFlag( dwCaps1, (uint) eDDSCAPS.MIPMAP ) && CheckFlag( dwFlags, (uint) eDDSD.MIPMAPCOUNT ) ) - _MipMapCount = (int) dwMipMapCount; // image contains MipMaps - else - _MipMapCount = 1; // only 1 main image - - // Should never happen - if ( CheckFlag( dwFlags, (uint) eDDSD.PITCH ) && CheckFlag( dwFlags, (uint) eDDSD.LINEARSIZE ) ) - throw new ArgumentException( "INVALID: Pitch AND Linear Flags both set. Image cannot be uncompressed and DTXn compressed at the same time." ); - - // This flag is set if format is uncompressed RGB RGBA etc. - if ( CheckFlag( dwFlags, (uint) eDDSD.PITCH ) ) - { - // _BytesForMainSurface = (int) dwPitchOrLinearSize; // holds bytes-per-scanline for uncompressed - _IsCompressed = false; - throw Unfinished; - } - - // This flag is set if format is compressed DXTn. - if ( CheckFlag( dwFlags, (uint) eDDSD.LINEARSIZE ) ) - { - _BytesForMainSurface = (int) dwPitchOrLinearSize; - _IsCompressed = true; - } - #endregion Examine Flags - - #region Examine Pixel Format, anything but DXTn will fail atm. - if ( CheckFlag( pfFlags, (uint) eDDPF.FOURCC ) ) - switch ( (eFOURCC) pfFourCC ) - { - case eFOURCC.DXT1: - _PixelInternalFormat = (PixelInternalFormat) ExtTextureCompressionS3tc.CompressedRgbS3tcDxt1Ext; - _BytesPerBlock = 8; - _IsCompressed = true; - break; - //case eFOURCC.DXT2: - case eFOURCC.DXT3: - _PixelInternalFormat = (PixelInternalFormat) ExtTextureCompressionS3tc.CompressedRgbaS3tcDxt3Ext; - _BytesPerBlock = 16; - _IsCompressed = true; - break; - //case eFOURCC.DXT4: - case eFOURCC.DXT5: - _PixelInternalFormat = (PixelInternalFormat) ExtTextureCompressionS3tc.CompressedRgbaS3tcDxt5Ext; - _BytesPerBlock = 16; - _IsCompressed = true; - break; - default: - throw Unfinished; // handle uncompressed formats - } else - throw Unfinished; - // pf*Bitmasks should be examined here - #endregion - - // Works, but commented out because some texture authoring tools don't set this flag. - /* Safety Check, if file is only 1x 2D surface without mipmaps, eDDSCAPS.COMPLEX should not be set - if ( CheckFlag( dwCaps1, (uint) eDDSCAPS.COMPLEX ) ) - { - if ( result == eTextureDimension.Texture2D && _MipMapCount == 1 ) // catch potential problem - Trace.WriteLine( "Warning: Image is declared complex, but contains only 1 surface." ); - }*/ - - if ( TextureLoaderParameters.Verbose ) - Trace.WriteLine( "\n" + GetDescriptionFromMemory( filename, dimension ) ); - #endregion Translate Header to less cryptic representation - - #region send the Texture to GL - #region Generate and Bind Handle - GL.GenTextures( 1, out texturehandle ); - GL.BindTexture( dimension, texturehandle ); - #endregion Generate and Bind Handle - - int Cursor = HeaderSizeInBytes; - // foreach face in the cubemap, get all it's mipmaps levels. Only one iteration for Texture2D - for ( int Slices = 0 ; Slices < _Depth ; Slices++ ) - { - int trueMipMapCount = _MipMapCount - 1; // TODO: triplecheck correctness - int Width = _Width; - int Height = _Height; - for ( int Level = 0 ; Level < _MipMapCount ; Level++ ) // start at base image - { - #region determine Dimensions - int BlocksPerRow = ( Width + 3 ) >> 2; - int BlocksPerColumn = ( Height + 3 ) >> 2; - int SurfaceBlockCount = BlocksPerRow * BlocksPerColumn; // // DXTn stores Texels in 4x4 blocks, a Color block is 8 Bytes, an Alpha block is 8 Bytes for DXT3/5 - int SurfaceSizeInBytes = SurfaceBlockCount * _BytesPerBlock; - - // this check must evaluate to false for 2D and Cube maps, or it's impossible to determine MipMap sizes. - if ( TextureLoaderParameters.Verbose && Level == 0 && _IsCompressed && _BytesForMainSurface != SurfaceSizeInBytes ) - Trace.WriteLine( "Warning: Calculated byte-count of main image differs from what was read from file." ); - #endregion determine Dimensions - - // skip mipmaps smaller than a 4x4 Pixels block, which is the smallest DXTn unit. - if ( Width > 2 && Height > 2 ) - { // Note: there could be a potential problem with non-power-of-two cube maps - #region Prepare Array for TexImage - byte[] RawDataOfSurface = new byte[SurfaceSizeInBytes]; - if ( !TextureLoaderParameters.FlipImages ) - { // no changes to the image, copy as is - Array.Copy( _RawDataFromFile, Cursor, RawDataOfSurface, 0, SurfaceSizeInBytes ); - } else - { // Turn the blocks upside down and the rows aswell, done in a single pass through all blocks - for ( int sourceColumn = 0 ; sourceColumn < BlocksPerColumn ; sourceColumn++ ) - { - int targetColumn = BlocksPerColumn - sourceColumn - 1; - for ( int row = 0 ; row < BlocksPerRow ; row++ ) - { - int target = ( targetColumn * BlocksPerRow + row ) * _BytesPerBlock; - int source = ( sourceColumn * BlocksPerRow + row ) * _BytesPerBlock + Cursor; - #region Swap Bytes - switch ( _PixelInternalFormat ) - { - case (PixelInternalFormat) ExtTextureCompressionS3tc.CompressedRgbS3tcDxt1Ext: - // Color only - RawDataOfSurface[target + 0] = _RawDataFromFile[source + 0]; - RawDataOfSurface[target + 1] = _RawDataFromFile[source + 1]; - RawDataOfSurface[target + 2] = _RawDataFromFile[source + 2]; - RawDataOfSurface[target + 3] = _RawDataFromFile[source + 3]; - RawDataOfSurface[target + 4] = _RawDataFromFile[source + 7]; - RawDataOfSurface[target + 5] = _RawDataFromFile[source + 6]; - RawDataOfSurface[target + 6] = _RawDataFromFile[source + 5]; - RawDataOfSurface[target + 7] = _RawDataFromFile[source + 4]; - break; - case (PixelInternalFormat) ExtTextureCompressionS3tc.CompressedRgbaS3tcDxt3Ext: - // Alpha - RawDataOfSurface[target + 0] = _RawDataFromFile[source + 6]; - RawDataOfSurface[target + 1] = _RawDataFromFile[source + 7]; - RawDataOfSurface[target + 2] = _RawDataFromFile[source + 4]; - RawDataOfSurface[target + 3] = _RawDataFromFile[source + 5]; - RawDataOfSurface[target + 4] = _RawDataFromFile[source + 2]; - RawDataOfSurface[target + 5] = _RawDataFromFile[source + 3]; - RawDataOfSurface[target + 6] = _RawDataFromFile[source + 0]; - RawDataOfSurface[target + 7] = _RawDataFromFile[source + 1]; - - // Color - RawDataOfSurface[target + 8] = _RawDataFromFile[source + 8]; - RawDataOfSurface[target + 9] = _RawDataFromFile[source + 9]; - RawDataOfSurface[target + 10] = _RawDataFromFile[source + 10]; - RawDataOfSurface[target + 11] = _RawDataFromFile[source + 11]; - RawDataOfSurface[target + 12] = _RawDataFromFile[source + 15]; - RawDataOfSurface[target + 13] = _RawDataFromFile[source + 14]; - RawDataOfSurface[target + 14] = _RawDataFromFile[source + 13]; - RawDataOfSurface[target + 15] = _RawDataFromFile[source + 12]; - break; - case (PixelInternalFormat) ExtTextureCompressionS3tc.CompressedRgbaS3tcDxt5Ext: - // Alpha, the first 2 bytes remain - RawDataOfSurface[target + 0] = _RawDataFromFile[source + 0]; - RawDataOfSurface[target + 1] = _RawDataFromFile[source + 1]; - - // extract 3 bits each and flip them - GetBytesFromUInt24( ref RawDataOfSurface, (uint) target + 5, FlipUInt24( GetUInt24( ref _RawDataFromFile, (uint) source + 2 ) ) ); - GetBytesFromUInt24( ref RawDataOfSurface, (uint) target + 2, FlipUInt24( GetUInt24( ref _RawDataFromFile, (uint) source + 5 ) ) ); - - // Color - RawDataOfSurface[target + 8] = _RawDataFromFile[source + 8]; - RawDataOfSurface[target + 9] = _RawDataFromFile[source + 9]; - RawDataOfSurface[target + 10] = _RawDataFromFile[source + 10]; - RawDataOfSurface[target + 11] = _RawDataFromFile[source + 11]; - RawDataOfSurface[target + 12] = _RawDataFromFile[source + 15]; - RawDataOfSurface[target + 13] = _RawDataFromFile[source + 14]; - RawDataOfSurface[target + 14] = _RawDataFromFile[source + 13]; - RawDataOfSurface[target + 15] = _RawDataFromFile[source + 12]; - break; - default: - throw new ArgumentException( "ERROR: Should have never arrived here! Bad _PixelInternalFormat! Should have been dealt with much earlier." ); - } - #endregion Swap Bytes - } - } - } - #endregion Prepare Array for TexImage - - #region Create TexImage - switch ( dimension ) - { - case TextureTarget.Texture2D: - GL.CompressedTexImage2D( TextureTarget.Texture2D, - Level, - _PixelInternalFormat, - Width, - Height, - TextureLoaderParameters.Border, - SurfaceSizeInBytes, - RawDataOfSurface ); - break; - case TextureTarget.TextureCubeMap: - GL.CompressedTexImage2D( TextureTarget.TextureCubeMapPositiveX + Slices, - Level, - _PixelInternalFormat, - Width, - Height, - TextureLoaderParameters.Border, - SurfaceSizeInBytes, - RawDataOfSurface ); - break; - case TextureTarget.Texture1D: // Untested - case TextureTarget.Texture3D: // Untested - default: - throw new ArgumentException( "ERROR: Use DXT for 2D Images only. Cannot evaluate " + dimension ); - } - GL.Finish( ); - #endregion Create TexImage - - #region Query Success - int width, height, internalformat, compressed; - switch ( dimension ) - { - case TextureTarget.Texture1D: - case TextureTarget.Texture2D: - case TextureTarget.Texture3D: - GL.GetTexLevelParameter( dimension, Level, GetTextureParameter.TextureWidth, out width ); - GL.GetTexLevelParameter( dimension, Level, GetTextureParameter.TextureHeight, out height ); - GL.GetTexLevelParameter( dimension, Level, GetTextureParameter.TextureInternalFormat, out internalformat ); - GL.GetTexLevelParameter( dimension, Level, GetTextureParameter.TextureCompressed, out compressed ); - break; - case TextureTarget.TextureCubeMap: - GL.GetTexLevelParameter( TextureTarget.TextureCubeMapPositiveX + Slices, Level, GetTextureParameter.TextureWidth, out width ); - GL.GetTexLevelParameter( TextureTarget.TextureCubeMapPositiveX + Slices, Level, GetTextureParameter.TextureHeight, out height ); - GL.GetTexLevelParameter( TextureTarget.TextureCubeMapPositiveX + Slices, Level, GetTextureParameter.TextureInternalFormat, out internalformat ); - GL.GetTexLevelParameter( TextureTarget.TextureCubeMapPositiveX + Slices, Level, GetTextureParameter.TextureCompressed, out compressed ); - break; - default: - throw Unfinished; - } - GLError = GL.GetError( ); - if ( TextureLoaderParameters.Verbose ) - Trace.WriteLine( "GL: " + GLError.ToString( ) + " Level: " + Level + " DXTn: " + ( ( compressed == 1 ) ? "Yes" : "No" ) + " Frmt:" + (ExtTextureCompressionS3tc) internalformat + " " + width + "*" + height ); - if ( GLError != ErrorCode.NoError || compressed == 0 || width == 0 || height == 0 || internalformat == 0 ) - { - GL.DeleteTextures( 1, ref texturehandle ); - throw new ArgumentException( "ERROR: Something went wrong after GL.CompressedTexImage(); Last GL Error: " + GLError.ToString( ) ); - } - #endregion Query Success - } else - { - if ( trueMipMapCount > Level ) - trueMipMapCount = Level - 1; // The current Level is invalid - } - - #region Prepare the next MipMap level - Width /= 2; - if ( Width < 1 ) - Width = 1; - Height /= 2; - if ( Height < 1 ) - Height = 1; - Cursor += SurfaceSizeInBytes; - #endregion Prepare the next MipMap level - } - - #region Set States properly - GL.TexParameter( dimension, (TextureParameterName) All.TextureBaseLevel, 0 ); - GL.TexParameter( dimension, (TextureParameterName) All.TextureMaxLevel, trueMipMapCount ); - - int TexMaxLevel; - GL.GetTexParameter( dimension, GetTextureParameter.TextureMaxLevel, out TexMaxLevel ); - - if ( TextureLoaderParameters.Verbose ) - Trace.WriteLine( "Verification: GL: " + GL.GetError( ).ToString( ) + " TextureMaxLevel: " + TexMaxLevel + ( ( TexMaxLevel == trueMipMapCount ) ? " (Correct.)" : " (Wrong!)" ) ); - #endregion Set States properly - } - - #region Set Texture Parameters - GL.TexParameter( dimension, TextureParameterName.TextureMinFilter, (int) TextureLoaderParameters.MinificationFilter ); - GL.TexParameter( dimension, TextureParameterName.TextureMagFilter, (int) TextureLoaderParameters.MagnificationFilter ); - - GL.TexParameter( dimension, TextureParameterName.TextureWrapS, (int) TextureLoaderParameters.WrapModeS ); - GL.TexParameter( dimension, TextureParameterName.TextureWrapT, (int) TextureLoaderParameters.WrapModeT ); - - GL.TexEnv( TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int) TextureLoaderParameters.EnvMode ); - - GLError = GL.GetError( ); - if ( GLError != ErrorCode.NoError ) - { - throw new ArgumentException( "Error setting Texture Parameters. GL Error: " + GLError ); - } - #endregion Set Texture Parameters - - // If it made it here without throwing any Exception the result is a valid Texture. - return; // success - #endregion send the Texture to GL - } catch ( Exception e ) - { - dimension = (TextureTarget) 0; - texturehandle = TextureLoaderParameters.OpenGLDefaultTexture; - throw new ArgumentException( "ERROR: Exception caught when attempting to load file " + filename + ".\n" + e + "\n" + GetDescriptionFromFile( filename ) ); - // return; // failure - } finally - { - _RawDataFromFile = null; // clarity, not really needed - } - #endregion Try - } - - #region Helpers - private static void ConvertDX9Header( ref byte[] input ) - { - UInt32 offset = 0; - idString = GetString( ref input, offset ); - offset += 4; - dwSize = GetUInt32( ref input, offset ); - offset += 4; - dwFlags = GetUInt32( ref input, offset ); - offset += 4; - dwHeight = GetUInt32( ref input, offset ); - offset += 4; - dwWidth = GetUInt32( ref input, offset ); - offset += 4; - dwPitchOrLinearSize = GetUInt32( ref input, offset ); - offset += 4; - dwDepth = GetUInt32( ref input, offset ); - offset += 4; - dwMipMapCount = GetUInt32( ref input, offset ); - offset += 4; -#if READALL - dwReserved1 = new UInt32[11]; // reserved -#endif - offset += 4 * 11; - pfSize = GetUInt32( ref input, offset ); - offset += 4; - pfFlags = GetUInt32( ref input, offset ); - offset += 4; - pfFourCC = GetUInt32( ref input, offset ); - offset += 4; -#if READALL - pfRGBBitCount = GetUInt32( ref input, offset ); - offset += 4; - pfRBitMask = GetUInt32( ref input, offset ); - offset += 4; - pfGBitMask = GetUInt32( ref input, offset ); - offset += 4; - pfBBitMask = GetUInt32( ref input, offset ); - offset += 4; - pfABitMask = GetUInt32( ref input, offset ); - offset += 4; -#else - offset += 20; -#endif - dwCaps1 = GetUInt32( ref input, offset ); - offset += 4; - dwCaps2 = GetUInt32( ref input, offset ); - offset += 4; -#if READALL - dwReserved2 = new UInt32[3]; // offset is 4+112 here, + 12 = 4+124 -#endif - offset += 4 * 3; - } - - /// Returns true if the flag is set, false otherwise - private static bool CheckFlag( uint variable, uint flag ) - { - return ( variable & flag ) > 0 ? true : false; - } - - private static string GetString( ref byte[] input, uint offset ) - { - return "" + (char) input[offset + 0] + (char) input[offset + 1] + (char) input[offset + 2] + (char) input[offset + 3]; - } - - private static uint GetUInt32( ref byte[] input, uint offset ) - { - return (uint) ( ( ( input[offset + 3] * 256 + input[offset + 2] ) * 256 + input[offset + 1] ) * 256 + input[offset + 0] ); - } - - private static uint GetUInt24( ref byte[] input, uint offset ) - { - return (uint) ( ( input[offset + 2] * 256 + input[offset + 1] ) * 256 + input[offset + 0] ); - } - - private static void GetBytesFromUInt24( ref byte[] input, uint offset, uint splitme ) - { - input[offset + 0] = (byte) ( splitme & 0x000000ff ); - input[offset + 1] = (byte) ( ( splitme & 0x0000ff00 ) >> 8 ); - input[offset + 2] = (byte) ( ( splitme & 0x00ff0000 ) >> 16 ); - return; - } - - /// DXT5 Alpha block flipping, inspired by code from Evan Hart (nVidia SDK) - private static uint FlipUInt24( uint inputUInt24 ) - { - byte[][] ThreeBits = new byte[2][]; - for ( int i = 0 ; i < 2 ; i++ ) - ThreeBits[i] = new byte[4]; - - // extract 3 bits each into the array - ThreeBits[0][0] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[0][1] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[0][2] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[0][3] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[1][0] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[1][1] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[1][2] = (byte) ( inputUInt24 & BitMask ); - inputUInt24 >>= 3; - ThreeBits[1][3] = (byte) ( inputUInt24 & BitMask ); - - // stuff 8x 3bits into 3 bytes - uint Result = 0; - Result = Result | (uint) ( ThreeBits[1][0] << 0 ); - Result = Result | (uint) ( ThreeBits[1][1] << 3 ); - Result = Result | (uint) ( ThreeBits[1][2] << 6 ); - Result = Result | (uint) ( ThreeBits[1][3] << 9 ); - Result = Result | (uint) ( ThreeBits[0][0] << 12 ); - Result = Result | (uint) ( ThreeBits[0][1] << 15 ); - Result = Result | (uint) ( ThreeBits[0][2] << 18 ); - Result = Result | (uint) ( ThreeBits[0][3] << 21 ); - return Result; - } - #endregion Helpers - - #region String Representations - private static string GetDescriptionFromFile( string filename ) - { - return "\n--> Header of " + filename + - "\nID: " + idString + - "\nSize: " + dwSize + - "\nFlags: " + dwFlags + " (" + (eDDSD) dwFlags + ")" + - "\nHeight: " + dwHeight + - "\nWidth: " + dwWidth + - "\nPitch: " + dwPitchOrLinearSize + - "\nDepth: " + dwDepth + - "\nMipMaps: " + dwMipMapCount + - "\n\n---PixelFormat---" + filename + - "\nSize: " + pfSize + - "\nFlags: " + pfFlags + " (" + (eDDPF) pfFlags + ")" + - "\nFourCC: " + pfFourCC + " (" + (eFOURCC) pfFourCC + ")" + -#if READALL - "\nBitcount: " + pfRGBBitCount + - "\nBitMask Red: " + pfRBitMask + - "\nBitMask Green: " + pfGBitMask + - "\nBitMask Blue: " + pfBBitMask + - "\nBitMask Alpha: " + pfABitMask + -#endif - "\n\n---Capabilities---" + filename + - "\nCaps1: " + dwCaps1 + " (" + (eDDSCAPS) dwCaps1 + ")" + - "\nCaps2: " + dwCaps2 + " (" + (eDDSCAPS2) dwCaps2 + ")"; - } - - private static string GetDescriptionFromMemory( string filename, TextureTarget Dimension ) - { - return "\nFile: " + filename + - "\nDimension: " + Dimension + - "\nSize: " + _Width + " * " + _Height + " * " + _Depth + - "\nCompressed: " + _IsCompressed + - "\nBytes for Main Image: " + _BytesForMainSurface + - "\nMipMaps: " + _MipMapCount; - } - #endregion String Representations - } -} diff --git a/Source/Examples/Utilities/LoaderGDI.cs b/Source/Examples/Utilities/LoaderGDI.cs deleted file mode 100644 index f966c5b4..00000000 --- a/Source/Examples/Utilities/LoaderGDI.cs +++ /dev/null @@ -1,152 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK Team. - * This notice may not be removed from any source distribution. - * See license.txt for licensing details. - */ -#endregion - -// TODO: Find paint program that can properly export 8/16-bit Textures and make sure they are loaded correctly. - -using System; -using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; - -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace Examples.TextureLoaders -{ - class ImageGDI - { - - public static void LoadFromDisk( string filename, out uint texturehandle, out TextureTarget dimension ) - { - dimension = (TextureTarget) 0; - texturehandle = TextureLoaderParameters.OpenGLDefaultTexture; - ErrorCode GLError = ErrorCode.NoError; - - Bitmap CurrentBitmap = null; - - try // Exceptions will be thrown if any Problem occurs while working on the file. - { - CurrentBitmap = new Bitmap( filename ); - if ( TextureLoaderParameters.FlipImages ) - CurrentBitmap.RotateFlip( RotateFlipType.RotateNoneFlipY ); - - if ( CurrentBitmap.Height > 1 ) - dimension = TextureTarget.Texture2D; - else - dimension = TextureTarget.Texture1D; - - GL.GenTextures( 1, out texturehandle ); - GL.BindTexture( dimension, texturehandle ); - - #region Load Texture - OpenTK.Graphics.OpenGL.PixelInternalFormat pif; - OpenTK.Graphics.OpenGL.PixelFormat pf; - OpenTK.Graphics.OpenGL.PixelType pt; - - if (TextureLoaderParameters.Verbose) - Trace.WriteLine( "File: " + filename + " Format: " + CurrentBitmap.PixelFormat ); - - switch ( CurrentBitmap.PixelFormat ) - { - case System.Drawing.Imaging.PixelFormat.Format8bppIndexed: // misses glColorTable setup - pif = OpenTK.Graphics.OpenGL.PixelInternalFormat.Rgb8; - pf = OpenTK.Graphics.OpenGL.PixelFormat.ColorIndex; - pt = OpenTK.Graphics.OpenGL.PixelType.Bitmap; - break; - case System.Drawing.Imaging.PixelFormat.Format16bppArgb1555: - case System.Drawing.Imaging.PixelFormat.Format16bppRgb555: // does not work - pif = OpenTK.Graphics.OpenGL.PixelInternalFormat.Rgb5A1; - pf = OpenTK.Graphics.OpenGL.PixelFormat.Bgr; - pt = OpenTK.Graphics.OpenGL.PixelType.UnsignedShort5551Ext; - break; - /* case System.Drawing.Imaging.PixelFormat.Format16bppRgb565: - pif = OpenTK.Graphics.OpenGL.PixelInternalFormat.R5G6B5IccSgix; - pf = OpenTK.Graphics.OpenGL.PixelFormat.R5G6B5IccSgix; - pt = OpenTK.Graphics.OpenGL.PixelType.UnsignedByte; - break; -*/ - case System.Drawing.Imaging.PixelFormat.Format24bppRgb: // works - pif = OpenTK.Graphics.OpenGL.PixelInternalFormat.Rgb8; - pf = OpenTK.Graphics.OpenGL.PixelFormat.Bgr; - pt = OpenTK.Graphics.OpenGL.PixelType.UnsignedByte; - break; - case System.Drawing.Imaging.PixelFormat.Format32bppRgb: // has alpha too? wtf? - case System.Drawing.Imaging.PixelFormat.Canonical: - case System.Drawing.Imaging.PixelFormat.Format32bppArgb: // works - pif = OpenTK.Graphics.OpenGL.PixelInternalFormat.Rgba; - pf = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; - pt = OpenTK.Graphics.OpenGL.PixelType.UnsignedByte; - break; - default: - throw new ArgumentException( "ERROR: Unsupported Pixel Format " + CurrentBitmap.PixelFormat ); - } - - BitmapData Data = CurrentBitmap.LockBits( new System.Drawing.Rectangle( 0, 0, CurrentBitmap.Width, CurrentBitmap.Height ), ImageLockMode.ReadOnly, CurrentBitmap.PixelFormat ); - - if ( Data.Height > 1 ) - { // image is 2D - if (TextureLoaderParameters.BuildMipmapsForUncompressed) - { - throw new Exception("Cannot build mipmaps, Glu is deprecated."); - // Glu.Build2DMipmap(dimension, (int)pif, Data.Width, Data.Height, pf, pt, Data.Scan0); - } - else - GL.TexImage2D(dimension, 0, pif, Data.Width, Data.Height, TextureLoaderParameters.Border, pf, pt, Data.Scan0); - } else - { // image is 1D - if (TextureLoaderParameters.BuildMipmapsForUncompressed) - { - throw new Exception("Cannot build mipmaps, Glu is deprecated."); - // Glu.Build1DMipmap(dimension, (int)pif, Data.Width, pf, pt, Data.Scan0); - } - else - GL.TexImage1D(dimension, 0, pif, Data.Width, TextureLoaderParameters.Border, pf, pt, Data.Scan0); - } - - GL.Finish( ); - GLError = GL.GetError( ); - if ( GLError != ErrorCode.NoError ) - { - throw new ArgumentException( "Error building TexImage. GL Error: " + GLError ); - } - - CurrentBitmap.UnlockBits( Data ); - #endregion Load Texture - - #region Set Texture Parameters - GL.TexParameter( dimension, TextureParameterName.TextureMinFilter, (int) TextureLoaderParameters.MinificationFilter ); - GL.TexParameter( dimension, TextureParameterName.TextureMagFilter, (int) TextureLoaderParameters.MagnificationFilter ); - - GL.TexParameter( dimension, TextureParameterName.TextureWrapS, (int) TextureLoaderParameters.WrapModeS ); - GL.TexParameter( dimension, TextureParameterName.TextureWrapT, (int) TextureLoaderParameters.WrapModeT ); - - GL.TexEnv( TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int) TextureLoaderParameters.EnvMode ); - - GLError = GL.GetError( ); - if ( GLError != ErrorCode.NoError ) - { - throw new ArgumentException( "Error setting Texture Parameters. GL Error: " + GLError ); - } - #endregion Set Texture Parameters - - return; // success - } catch ( Exception e ) - { - dimension = (TextureTarget) 0; - texturehandle = TextureLoaderParameters.OpenGLDefaultTexture; - throw new ArgumentException( "Texture Loading Error: Failed to read file " + filename + ".\n" + e ); - // return; // failure - } finally - { - CurrentBitmap = null; - } - } - - } -} \ No newline at end of file diff --git a/Source/Examples/Utilities/LoaderStatics.cs b/Source/Examples/Utilities/LoaderStatics.cs deleted file mode 100644 index 603bbc69..00000000 --- a/Source/Examples/Utilities/LoaderStatics.cs +++ /dev/null @@ -1,50 +0,0 @@ -#region --- License --- -/* Licensed under the MIT/X11 license. - * Copyright (c) 2006-2008 the OpenTK Team. - * This notice may not be removed from any source distribution. - * See license.txt for licensing details. - */ -#endregion - -using System; - -using OpenTK.Graphics.OpenGL; - -namespace Examples.TextureLoaders -{ - - /// The parameters in this class have only effect on the following Texture loads. - public static class TextureLoaderParameters - { - /// (Debug Aid, should be set to false) If set to false only Errors will be printed. If set to true, debug information (Warnings and Queries) will be printed in addition to Errors. - public static bool Verbose = false; - - /// Always-valid fallback parameter for GL.BindTexture (Default: 0). This number will be returned if loading the Texture failed. You can set this to a checkerboard texture or similar, which you have already loaded. - public static uint OpenGLDefaultTexture = 0; - - /// Compressed formats must have a border of 0, so this is constant. - public const int Border = 0; - - /// false==DirectX TexCoords, true==OpenGL TexCoords (Default: true) - public static bool FlipImages = true; - - /// When enabled, will use Glu to create MipMaps for images loaded with GDI+ (Default: false) - public static bool BuildMipmapsForUncompressed = false; - - /// Selects the Magnification filter for following Textures to be loaded. (Default: Nearest) - public static TextureMagFilter MagnificationFilter = TextureMagFilter.Nearest; - - /// Selects the Minification filter for following Textures to be loaded. (Default: Nearest) - public static TextureMinFilter MinificationFilter = TextureMinFilter.Nearest; - - /// Selects the S Wrapping for following Textures to be loaded. (Default: Repeat) - public static TextureWrapMode WrapModeS = TextureWrapMode.Repeat; - - /// Selects the T Wrapping for following Textures to be loaded. (Default: Repeat) - public static TextureWrapMode WrapModeT = TextureWrapMode.Repeat; - - /// Selects the Texture Environment Mode for the following Textures to be loaded. Default: Modulate) - public static TextureEnvMode EnvMode = TextureEnvMode.Modulate; - } - -} diff --git a/Source/Examples/app.manifest b/Source/Examples/app.manifest deleted file mode 100644 index da81b27d..00000000 --- a/Source/Examples/app.manifest +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - -