From f7a1a114e396735b468d082787c6a88b8ed613f0 Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Sun, 11 Oct 2020 17:50:13 -0400 Subject: [PATCH 01/52] Initial commit --- .gitattributes | 63 -- .gitignore | 837 ------------------ .../FeedbackGravityExample.cs | 158 ---- Examples/AdvancedExamples/LoaderDDS.cs | 708 --------------- Examples/AdvancedExamples/LoaderStatics.cs | 48 - .../ParallaxMappingExample.cs | 248 ------ .../RenderToTextureExample.cs | 124 --- .../BufferLayoutTexturingExample.cs | 142 --- Examples/BasicExamples/MinimalExample.cs | 85 -- .../RotatingTexturedCubeExample.cs | 134 --- Examples/BasicExamples/SkyboxExample.cs | 88 -- Examples/BasicExamples/TextureGridExample.cs | 104 --- Examples/Data/Shaders/ExampleShader.glsl | 21 - Examples/Data/Shaders/Gravity.glsl | 51 -- Examples/Data/Shaders/Parallax.glsl | 107 --- Examples/Data/Shaders/SimpleColor.glsl | 25 - Examples/Data/Shaders/SimpleTexture.glsl | 31 - Examples/Data/Shaders/Skybox.glsl | 34 - Examples/Data/Shaders/TextureGrid.glsl | 63 -- Examples/Data/Textures/checker.jpg | Bin 2441 -> 0 bytes Examples/Data/Textures/city0.jpg | Bin 34449 -> 0 bytes Examples/Data/Textures/city1.jpg | Bin 36815 -> 0 bytes Examples/Data/Textures/city2.jpg | Bin 30510 -> 0 bytes Examples/Data/Textures/city3.jpg | Bin 28435 -> 0 bytes Examples/Data/Textures/city4.jpg | Bin 35810 -> 0 bytes Examples/Data/Textures/city5.jpg | Bin 30269 -> 0 bytes Examples/Data/Textures/crate.png | Bin 344272 -> 0 bytes Examples/Data/Textures/empty.png | Bin 9875 -> 0 bytes Examples/Data/Textures/flag.png | Bin 17390 -> 0 bytes Examples/Data/Textures/mine.png | Bin 40830 -> 0 bytes .../Textures/swizzled-rock-diffuse-height.dds | Bin 349648 -> 0 bytes .../Textures/swizzled-rock-normal-gloss.dds | Bin 87536 -> 0 bytes Examples/ExampleBrowser.Designer.cs | 78 -- Examples/ExampleBrowser.cs | 76 -- Examples/ExampleBrowserEntry.cs | 28 - Examples/ExampleProjectAttribute.cs | 16 - Examples/ExampleWindow.cs | 95 -- Examples/Examples.csproj | 130 --- Examples/Properties/AssemblyInfo.cs | 31 - Examples/Shaders/ExampleProgram.cs | 19 - Examples/Shaders/GravityProgram.cs | 32 - Examples/Shaders/ParallaxProgram.cs | 38 - Examples/Shaders/SimpleColorProgram.cs | 21 - Examples/Shaders/SimpleTextureProgram.cs | 25 - Examples/Shaders/SkyboxProgram.cs | 21 - Examples/Shaders/TextureGridProgram.cs | 24 - Examples/app.config | 24 - Examples/packages.config | 5 - LICENSE | 21 - ObjectTK.Compiler/ObjectTK.Compiler.csproj | 64 -- ObjectTK.Compiler/Properties/AssemblyInfo.cs | 48 - ObjectTK.Compiler/ShaderCompiler.cs | 102 --- ObjectTK.Compiler/app.config | 6 - ObjectTK.Compiler/packages.config | 4 - ObjectTK.Tools/Cameras/Camera.cs | 122 --- ObjectTK.Tools/Cameras/CameraBehavior.cs | 37 - ObjectTK.Tools/Cameras/CameraState.cs | 35 - .../Cameras/FreeLookAlignedBehavior.cs | 30 - ObjectTK.Tools/Cameras/FreeLookBehavior.cs | 42 - ObjectTK.Tools/Cameras/GimbalBehavior.cs | 33 - ObjectTK.Tools/Cameras/ThirdPersonBehavior.cs | 54 -- ObjectTK.Tools/DerpWindow.cs | 62 -- ObjectTK.Tools/FrameTimer.cs | 99 --- ObjectTK.Tools/ObjectTK.Tools.csproj | 90 -- ObjectTK.Tools/Properties/AssemblyInfo.cs | 48 - ObjectTK.Tools/Shapes/Circle.cs | 35 - ObjectTK.Tools/Shapes/ColorCube.cs | 45 - ObjectTK.Tools/Shapes/ColoredShape.cs | 35 - ObjectTK.Tools/Shapes/Cube.cs | 51 -- ObjectTK.Tools/Shapes/IndexedShape.cs | 35 - ObjectTK.Tools/Shapes/LayeredQuads.cs | 38 - ObjectTK.Tools/Shapes/Quad.cs | 34 - ObjectTK.Tools/Shapes/Rect.cs | 36 - ObjectTK.Tools/Shapes/Shape.cs | 44 - ObjectTK.Tools/Shapes/TexturedCube.cs | 45 - ObjectTK.Tools/Shapes/TexturedQuad.cs | 42 - ObjectTK.Tools/Shapes/TexturedShape.cs | 35 - ObjectTK.Tools/packages.config | 4 - ObjectTK.sln | 45 - ObjectTK.sln.DotSettings | 19 - ObjectTK/Buffers/Buffer.cs | 259 ------ ObjectTK/Buffers/BufferPod.cs | 109 --- ObjectTK/Buffers/Framebuffer.cs | 193 ---- ObjectTK/Buffers/Renderbuffer.cs | 46 - ObjectTK/Buffers/TransformFeedback.cs | 132 --- ObjectTK/Buffers/VertexArray.cs | 237 ----- .../Exceptions/ObjectNotBoundException.cs | 26 - ObjectTK/Exceptions/ObjectTKException.cs | 26 - ObjectTK/Exceptions/ProgramException.cs | 36 - ObjectTK/Exceptions/ProgramLinkException.cs | 26 - ObjectTK/Exceptions/QueryException.cs | 26 - ObjectTK/Exceptions/ShaderCompileException.cs | 26 - .../UniformTypeNotSupportedException.cs | 40 - ObjectTK/Extensions.cs | 69 -- ObjectTK/GLObject.cs | 55 -- ObjectTK/GLResource.cs | 91 -- ObjectTK/Logging/DefaultLogImpl.cs | 135 --- ObjectTK/Logging/IObjectTKLogger.cs | 45 - ObjectTK/Logging/LogFactory.cs | 31 - ObjectTK/MathF.cs | 52 -- ObjectTK/ObjectTK.csproj | 128 --- ObjectTK/Properties/AssemblyInfo.cs | 48 - ObjectTK/Queries/QueryIndexer.cs | 69 -- ObjectTK/Queries/QueryMapping.cs | 166 ---- ObjectTK/Shaders/ComputeProgram.cs | 125 --- ObjectTK/Shaders/Effect.cs | 156 ---- ObjectTK/Shaders/Program.cs | 133 --- ObjectTK/Shaders/ProgramFactory.cs | 163 ---- ObjectTK/Shaders/Shader.cs | 92 -- .../Sources/ComputeShaderSourceAttribute.cs | 29 - .../Sources/FragmentShaderSourceAttribute.cs | 29 - .../Sources/GeometryShaderSourceAttribute.cs | 29 - .../Shaders/Sources/ShaderSourceAttribute.cs | 56 -- .../TessControlShaderSourceAttribute.cs | 29 - .../TessEvaluationShaderSourceAttribute.cs | 29 - .../Sources/VertexShaderSourceAttribute.cs | 29 - ObjectTK/Shaders/TransformProgram.cs | 80 -- ObjectTK/Shaders/Variables/BufferBinding.cs | 98 -- ObjectTK/Shaders/Variables/FragData.cs | 40 - ObjectTK/Shaders/Variables/ImageUniform.cs | 138 --- ObjectTK/Shaders/Variables/ProgramVariable.cs | 59 -- ObjectTK/Shaders/Variables/ShaderStorage.cs | 43 - ObjectTK/Shaders/Variables/TextureUniform.cs | 54 -- ObjectTK/Shaders/Variables/TransformOut.cs | 37 - ObjectTK/Shaders/Variables/Uniform.cs | 85 -- ObjectTK/Shaders/Variables/UniformBuffer.cs | 68 -- ObjectTK/Shaders/Variables/UniformSetter.cs | 80 -- ObjectTK/Shaders/Variables/VertexAttrib.cs | 71 -- .../Variables/VertexAttribAttribute.cs | 93 -- ObjectTK/Textures/BitmapFormat.cs | 64 -- ObjectTK/Textures/BitmapTexture.cs | 179 ---- ObjectTK/Textures/LayeredTexture.cs | 28 - ObjectTK/Textures/Sampler.cs | 74 -- ObjectTK/Textures/Texture.cs | 218 ----- ObjectTK/Textures/Texture1D.cs | 43 - ObjectTK/Textures/Texture1DArray.cs | 54 -- ObjectTK/Textures/Texture2D.cs | 61 -- ObjectTK/Textures/Texture2DArray.cs | 59 -- ObjectTK/Textures/Texture2DMultisample.cs | 65 -- .../Textures/Texture2DMultisampleArray.cs | 71 -- ObjectTK/Textures/Texture3D.cs | 57 -- ObjectTK/Textures/TextureBuffer.cs | 61 -- ObjectTK/Textures/TextureCubemap.cs | 44 - ObjectTK/Textures/TextureCubemapArray.cs | 54 -- ObjectTK/Textures/TextureFactory.cs | 50 -- ObjectTK/Textures/TextureRectangle.cs | 51 -- ObjectTK/Utility.cs | 36 - ObjectTK/Vector3i.cs | 413 --------- ObjectTK/packages.config | 5 - README.md | 33 - packages/repositories.config | 7 - 151 files changed, 10817 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 Examples/AdvancedExamples/FeedbackGravityExample.cs delete mode 100644 Examples/AdvancedExamples/LoaderDDS.cs delete mode 100644 Examples/AdvancedExamples/LoaderStatics.cs delete mode 100644 Examples/AdvancedExamples/ParallaxMappingExample.cs delete mode 100644 Examples/AdvancedExamples/RenderToTextureExample.cs delete mode 100644 Examples/BasicExamples/BufferLayoutTexturingExample.cs delete mode 100644 Examples/BasicExamples/MinimalExample.cs delete mode 100644 Examples/BasicExamples/RotatingTexturedCubeExample.cs delete mode 100644 Examples/BasicExamples/SkyboxExample.cs delete mode 100644 Examples/BasicExamples/TextureGridExample.cs delete mode 100644 Examples/Data/Shaders/ExampleShader.glsl delete mode 100644 Examples/Data/Shaders/Gravity.glsl delete mode 100644 Examples/Data/Shaders/Parallax.glsl delete mode 100644 Examples/Data/Shaders/SimpleColor.glsl delete mode 100644 Examples/Data/Shaders/SimpleTexture.glsl delete mode 100644 Examples/Data/Shaders/Skybox.glsl delete mode 100644 Examples/Data/Shaders/TextureGrid.glsl delete mode 100644 Examples/Data/Textures/checker.jpg delete mode 100644 Examples/Data/Textures/city0.jpg delete mode 100644 Examples/Data/Textures/city1.jpg delete mode 100644 Examples/Data/Textures/city2.jpg delete mode 100644 Examples/Data/Textures/city3.jpg delete mode 100644 Examples/Data/Textures/city4.jpg delete mode 100644 Examples/Data/Textures/city5.jpg delete mode 100644 Examples/Data/Textures/crate.png delete mode 100644 Examples/Data/Textures/empty.png delete mode 100644 Examples/Data/Textures/flag.png delete mode 100644 Examples/Data/Textures/mine.png delete mode 100644 Examples/Data/Textures/swizzled-rock-diffuse-height.dds delete mode 100644 Examples/Data/Textures/swizzled-rock-normal-gloss.dds delete mode 100644 Examples/ExampleBrowser.Designer.cs delete mode 100644 Examples/ExampleBrowser.cs delete mode 100644 Examples/ExampleBrowserEntry.cs delete mode 100644 Examples/ExampleProjectAttribute.cs delete mode 100644 Examples/ExampleWindow.cs delete mode 100644 Examples/Examples.csproj delete mode 100644 Examples/Properties/AssemblyInfo.cs delete mode 100644 Examples/Shaders/ExampleProgram.cs delete mode 100644 Examples/Shaders/GravityProgram.cs delete mode 100644 Examples/Shaders/ParallaxProgram.cs delete mode 100644 Examples/Shaders/SimpleColorProgram.cs delete mode 100644 Examples/Shaders/SimpleTextureProgram.cs delete mode 100644 Examples/Shaders/SkyboxProgram.cs delete mode 100644 Examples/Shaders/TextureGridProgram.cs delete mode 100644 Examples/app.config delete mode 100644 Examples/packages.config delete mode 100644 LICENSE delete mode 100644 ObjectTK.Compiler/ObjectTK.Compiler.csproj delete mode 100644 ObjectTK.Compiler/Properties/AssemblyInfo.cs delete mode 100644 ObjectTK.Compiler/ShaderCompiler.cs delete mode 100644 ObjectTK.Compiler/app.config delete mode 100644 ObjectTK.Compiler/packages.config delete mode 100644 ObjectTK.Tools/Cameras/Camera.cs delete mode 100644 ObjectTK.Tools/Cameras/CameraBehavior.cs delete mode 100644 ObjectTK.Tools/Cameras/CameraState.cs delete mode 100644 ObjectTK.Tools/Cameras/FreeLookAlignedBehavior.cs delete mode 100644 ObjectTK.Tools/Cameras/FreeLookBehavior.cs delete mode 100644 ObjectTK.Tools/Cameras/GimbalBehavior.cs delete mode 100644 ObjectTK.Tools/Cameras/ThirdPersonBehavior.cs delete mode 100644 ObjectTK.Tools/DerpWindow.cs delete mode 100644 ObjectTK.Tools/FrameTimer.cs delete mode 100644 ObjectTK.Tools/ObjectTK.Tools.csproj delete mode 100644 ObjectTK.Tools/Properties/AssemblyInfo.cs delete mode 100644 ObjectTK.Tools/Shapes/Circle.cs delete mode 100644 ObjectTK.Tools/Shapes/ColorCube.cs delete mode 100644 ObjectTK.Tools/Shapes/ColoredShape.cs delete mode 100644 ObjectTK.Tools/Shapes/Cube.cs delete mode 100644 ObjectTK.Tools/Shapes/IndexedShape.cs delete mode 100644 ObjectTK.Tools/Shapes/LayeredQuads.cs delete mode 100644 ObjectTK.Tools/Shapes/Quad.cs delete mode 100644 ObjectTK.Tools/Shapes/Rect.cs delete mode 100644 ObjectTK.Tools/Shapes/Shape.cs delete mode 100644 ObjectTK.Tools/Shapes/TexturedCube.cs delete mode 100644 ObjectTK.Tools/Shapes/TexturedQuad.cs delete mode 100644 ObjectTK.Tools/Shapes/TexturedShape.cs delete mode 100644 ObjectTK.Tools/packages.config delete mode 100644 ObjectTK.sln delete mode 100644 ObjectTK.sln.DotSettings delete mode 100644 ObjectTK/Buffers/Buffer.cs delete mode 100644 ObjectTK/Buffers/BufferPod.cs delete mode 100644 ObjectTK/Buffers/Framebuffer.cs delete mode 100644 ObjectTK/Buffers/Renderbuffer.cs delete mode 100644 ObjectTK/Buffers/TransformFeedback.cs delete mode 100644 ObjectTK/Buffers/VertexArray.cs delete mode 100644 ObjectTK/Exceptions/ObjectNotBoundException.cs delete mode 100644 ObjectTK/Exceptions/ObjectTKException.cs delete mode 100644 ObjectTK/Exceptions/ProgramException.cs delete mode 100644 ObjectTK/Exceptions/ProgramLinkException.cs delete mode 100644 ObjectTK/Exceptions/QueryException.cs delete mode 100644 ObjectTK/Exceptions/ShaderCompileException.cs delete mode 100644 ObjectTK/Exceptions/UniformTypeNotSupportedException.cs delete mode 100644 ObjectTK/Extensions.cs delete mode 100644 ObjectTK/GLObject.cs delete mode 100644 ObjectTK/GLResource.cs delete mode 100644 ObjectTK/Logging/DefaultLogImpl.cs delete mode 100644 ObjectTK/Logging/IObjectTKLogger.cs delete mode 100644 ObjectTK/Logging/LogFactory.cs delete mode 100644 ObjectTK/MathF.cs delete mode 100644 ObjectTK/ObjectTK.csproj delete mode 100644 ObjectTK/Properties/AssemblyInfo.cs delete mode 100644 ObjectTK/Queries/QueryIndexer.cs delete mode 100644 ObjectTK/Queries/QueryMapping.cs delete mode 100644 ObjectTK/Shaders/ComputeProgram.cs delete mode 100644 ObjectTK/Shaders/Effect.cs delete mode 100644 ObjectTK/Shaders/Program.cs delete mode 100644 ObjectTK/Shaders/ProgramFactory.cs delete mode 100644 ObjectTK/Shaders/Shader.cs delete mode 100644 ObjectTK/Shaders/Sources/ComputeShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/Sources/FragmentShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/Sources/GeometryShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/Sources/ShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/Sources/TessControlShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/Sources/TessEvaluationShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/Sources/VertexShaderSourceAttribute.cs delete mode 100644 ObjectTK/Shaders/TransformProgram.cs delete mode 100644 ObjectTK/Shaders/Variables/BufferBinding.cs delete mode 100644 ObjectTK/Shaders/Variables/FragData.cs delete mode 100644 ObjectTK/Shaders/Variables/ImageUniform.cs delete mode 100644 ObjectTK/Shaders/Variables/ProgramVariable.cs delete mode 100644 ObjectTK/Shaders/Variables/ShaderStorage.cs delete mode 100644 ObjectTK/Shaders/Variables/TextureUniform.cs delete mode 100644 ObjectTK/Shaders/Variables/TransformOut.cs delete mode 100644 ObjectTK/Shaders/Variables/Uniform.cs delete mode 100644 ObjectTK/Shaders/Variables/UniformBuffer.cs delete mode 100644 ObjectTK/Shaders/Variables/UniformSetter.cs delete mode 100644 ObjectTK/Shaders/Variables/VertexAttrib.cs delete mode 100644 ObjectTK/Shaders/Variables/VertexAttribAttribute.cs delete mode 100644 ObjectTK/Textures/BitmapFormat.cs delete mode 100644 ObjectTK/Textures/BitmapTexture.cs delete mode 100644 ObjectTK/Textures/LayeredTexture.cs delete mode 100644 ObjectTK/Textures/Sampler.cs delete mode 100644 ObjectTK/Textures/Texture.cs delete mode 100644 ObjectTK/Textures/Texture1D.cs delete mode 100644 ObjectTK/Textures/Texture1DArray.cs delete mode 100644 ObjectTK/Textures/Texture2D.cs delete mode 100644 ObjectTK/Textures/Texture2DArray.cs delete mode 100644 ObjectTK/Textures/Texture2DMultisample.cs delete mode 100644 ObjectTK/Textures/Texture2DMultisampleArray.cs delete mode 100644 ObjectTK/Textures/Texture3D.cs delete mode 100644 ObjectTK/Textures/TextureBuffer.cs delete mode 100644 ObjectTK/Textures/TextureCubemap.cs delete mode 100644 ObjectTK/Textures/TextureCubemapArray.cs delete mode 100644 ObjectTK/Textures/TextureFactory.cs delete mode 100644 ObjectTK/Textures/TextureRectangle.cs delete mode 100644 ObjectTK/Utility.cs delete mode 100644 ObjectTK/Vector3i.cs delete mode 100644 ObjectTK/packages.config delete mode 100644 README.md delete mode 100644 packages/repositories.config diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1ff0c42..0000000 --- a/.gitattributes +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto - -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp - -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary - -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 593f090..0000000 --- a/.gitignore +++ /dev/null @@ -1,837 +0,0 @@ - -# Created by https://www.gitignore.io/api/vim,osx,linux,macos,emacs,fsharp,csharp,windows,android,monodevelop,intellij+all,visualstudio,xamarinstudio,visualstudiocode - -### Android ### -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Gradle files -.gradle/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# Intellij -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/dictionaries -.idea/libraries - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -### Android Patch ### -gen-external-apklibs - -### Csharp ### -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ -**/Properties/launchSettings.json - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Uncomment the next line to ignore your web deploy settings. -# By default, sensitive information, such as encrypted password -# should be stored in the .pubxml.user file. -#*.pubxml -*.pubxml.user -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Typescript v1 declaration files -typings/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ -*.Restore.targets - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -### Emacs ### -# -*- mode: gitignore; -*- -\#*\# -/.emacs.desktop -/.emacs.desktop.lock -*.elc -auto-save-list -tramp -.\#* - -# Org-mode -.org-id-locations -*_archive - -# flymake-mode -*_flymake.* - -# eshell files -/eshell/history -/eshell/lastdir - -# elpa packages -/elpa/ - -# reftex files -*.rel - -# AUCTeX auto folder -/auto/ - -# cask packages -.cask/ -dist/ - -# Flycheck -flycheck_*.el - -# server auth directory -/server/ - -# projectiles files -.projectile -projectile-bookmarks.eld - -# directory configuration -.dir-locals.el - -# saveplace -places - -# url cache -url/cache/ - -# cedet -ede-projects.el - -# smex -smex-items - -# company-statistics -company-statistics-cache.el - -# anaconda-mode -anaconda-mode/ - -### fsharp ### -lib/debug -lib/release -*.exe -!.paket/paket.bootstrapper.exe - -### Intellij+all ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff: -.idea/**/workspace.xml -.idea/**/tasks.xml - -# Sensitive or high-churn files: -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.xml -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml - -# Gradle: -.idea/**/gradle.xml -.idea/**/libraries - -# CMake -cmake-build-debug/ - -# Mongo Explorer plugin: -.idea/**/mongoSettings.xml - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# Ruby plugin and RubyMine -/.rakeTasks - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -### Linux ### - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### macOS ### -*.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### MonoDevelop ### -#User Specific -*.usertasks - -#Mono Project Files -*.resources -test-results/ - -### OSX ### - -# Icon must end with two \r - -# Thumbnails - -# Files that might appear in the root of a volume - -# Directories potentially created on remote AFP share - -### Vim ### -# swap -[._]*.s[a-v][a-z] -[._]*.sw[a-p] -[._]s[a-v][a-z] -[._]sw[a-p] -# session -Session.vim -# temporary -.netrwhist -# auto-generated tag files -tags - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - -### XamarinStudio ### -.packages - -### Mono Code Coverage ### -TestResults.xml - -### OpenTK Binding files ### -.bindingsGenerated -src/OpenTK/Graphics/ES10/Enums -src/OpenTK/Graphics/ES10/Wrappers -src/OpenTK/Graphics/ES11/Enums -src/OpenTK/Graphics/ES11/Wrappers -src/OpenTK/Graphics/ES20/Enums -src/OpenTK/Graphics/ES20/Wrappers -src/OpenTK/Graphics/ES30/Enums -src/OpenTK/Graphics/ES30/Wrappers -src/OpenTK/Graphics/ES31/Enums -src/OpenTK/Graphics/ES31/Wrappers -src/OpenTK/Graphics/OpenGL/Enums -src/OpenTK/Graphics/OpenGL/Wrappers -src/OpenTK/Graphics/OpenGL4/Enums -src/OpenTK/Graphics/OpenGL4/Wrappers - -### OpenTK AssemblyInfo files ### -**/AssemblyInfo.cs -**/AssemblyInfo.fs - -### Tooling files "" -tools/ - -### LaTeX ### -## Core latex/pdflatex auxiliary files: -*.aux -*.lof -*.lot -*.fls -*.out -*.toc -*.fmt -*.fot -*.cb -*.cb2 -.*.lb - -## Intermediate documents: -*.dvi -*.xdv -*-converted-to.* -# these rules might exclude image files for figures etc. -# *.ps -# *.eps -# *.pdf - -## Generated if empty string is given at "Please type another file name for output:" -.pdf - -## Bibliography auxiliary files (bibtex/biblatex/biber): -*.bbl -*.bcf -*.blg -*-blx.aux -*-blx.bib -*.run.xml - -## Build tool auxiliary files: -*.fdb_latexmk -*.synctex -*.synctex(busy) -*.synctex.gz -*.synctex.gz(busy) -*.pdfsync - -## Build tool directories for auxiliary files -# latexrun -latex.out/ - -## Auxiliary and intermediate files from other packages: -# algorithms -*.alg -*.loa - -# achemso -acs-*.bib - -# amsthm -*.thm - -# beamer -*.nav -*.pre -*.snm -*.vrb - -# changes -*.soc - -# cprotect -*.cpt - -# elsarticle (documentclass of Elsevier journals) -*.spl - -# endnotes -*.ent - -# fixme -*.lox - -# feynmf/feynmp -*.mf -*.mp -*.t[1-9] -*.t[1-9][0-9] -*.tfm - -# glossaries -*.acn -*.acr -*.glg -*.glo -*.gls -*.glsdefs - -# gnuplottex -*-gnuplottex-* - -# gregoriotex -*.gaux -*.gtex - -# htlatex -*.4ct -*.4tc -*.idv -*.lg -*.trc -*.xref - -# hyperref -*.brf - -# knitr -*-concordance.tex -# TODO Comment the next line if you want to keep your tikz graphics files -*.tikz -*-tikzDictionary - -# listings -*.lol - -# makeidx -*.idx -*.ilg -*.ind -*.ist - -# minitoc -*.maf -*.mlf -*.mlt -*.mtc[0-9]* -*.slf[0-9]* -*.slt[0-9]* -*.stc[0-9]* - -# minted -_minted* -*.pyg - -# morewrites -*.mw - -# nomencl -*.nlg -*.nlo -*.nls - -# pax -*.pax - -# pdfpcnotes -*.pdfpc - -# sagetex -*.sagetex.sage -*.sagetex.py -*.sagetex.scmd - -# scrwfile -*.wrt - -# sympy -*.sout -*.sympy -sympy-plots-for-*.tex/ - -# pdfcomment -*.upa -*.upb - -# pythontex -*.pytxcode -pythontex-files-*/ - -# thmtools -*.loe - -# TikZ & PGF -*.dpth -*.md5 -*.auxlock - -# todonotes -*.tdo - -# easy-todo -*.lod - -# xmpincl -*.xmpi - -# xindy -*.xdy - -# xypic precompiled matrices -*.xyc - -# endfloat -*.ttt -*.fff - -# Latexian -TSWLatexianTemp* - -## Editors: -# WinEdt -*.bak -*.sav - -# Texpad -.texpadtmp - -# LyX -*.lyx~ - -# Kile -*.backup - -# KBibTeX -*~[0-9]* - -# auto folder when using emacs and auctex -auto/* -*.el - -# expex forward references with \gathertags -*-tags.tex - -# standalone packages -*.sta - -### LaTeX Patch ### -# glossaries -*.glstex diff --git a/Examples/AdvancedExamples/FeedbackGravityExample.cs b/Examples/AdvancedExamples/FeedbackGravityExample.cs deleted file mode 100644 index 4a2c58e..0000000 --- a/Examples/AdvancedExamples/FeedbackGravityExample.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using OpenTK; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.AdvancedExamples -{ - [ExampleProject("Transform feedback with gravity simulation")] - public class FeedbackGravityExample - : ExampleWindow - { - [StructLayout(LayoutKind.Sequential)] - private struct Particle - { - public Vector3 Position; - private float _padding0; - public Vector3 Velocity; - private float _padding1; - } - - private readonly Random _random; - private GravityProgram _program; - private VertexArray _vao; - private BufferPod<Particle> _buffers; - private TransformFeedback _feedback; - - // simulation parameters - private float _centerMass = 0.8309f; //0.65f; - private int _particleCount = 64000; - - public FeedbackGravityExample() - { - _random = new Random(); - Load += OnLoad; - RenderFrame += OnRenderFrame; - Keyboard.KeyDown += OnKeyDown; - } - - private float Rand(float range) - { - return (float)(_random.NextDouble() * 2 * range - range); - } - - private void OnLoad(object sender, EventArgs e) - { - // initialize shader (load sources, create/compile/link shader program, error checking) - // when using the factory method the shader sources are retrieved from the ShaderSourceAttributes - _program = ProgramFactory.Create<GravityProgram>(); - // this program will be used all the time so just activate it once and for all - _program.Use(); - - // create and bind a vertex array - _vao = new VertexArray(); - _vao.Bind(); - - // create and bind transform feedback object - _feedback = new TransformFeedback(); - _feedback.Bind(); - - // Writing to a buffer while reading from it is not allowed - // so we need two buffer objects here, which can be achieved by using the BufferPod<T> type. - // It contains two buffers, Ping and Pong, to simplify this process. - _buffers = new BufferPod<Particle>(); - InitializeParticles(_particleCount); - - // enable point sprite rendering - GL.Enable(EnableCap.PointSprite); - // enable modification of the point sprite size from the program (vertex shader in this case) - GL.Enable(EnableCap.ProgramPointSize); - // enable depth testing - GL.Enable(EnableCap.DepthTest); - // set a nice clear color - GL.ClearColor(Color.Black); - - // set a nice camera angle - Camera.DefaultState.Position = new Vector3(0,2,-8); - Camera.ResetToDefault(); - } - - private void InitializeParticles(int n) - { - var particles = new Particle[n]; - for (var i = 0; i < particles.Length; i++) - { - // generate a flat random cube - particles[i].Position.X = Rand(0.2f); - particles[i].Position.Y = Rand(0.02f); - particles[i].Position.Z = Rand(0.2f); - // move particles outwards - particles[i].Position += particles[i].Position.Normalized()*0.8f; - // calculate velocity perpendicular to the direction towards the gravity center and the y-axis - particles[i].Velocity = Vector3.Cross(particles[i].Position, -Vector3.UnitY); - } - // upload data into the Ping buffer and initialize the pong buffer to the same size - _buffers.Init(BufferTarget.ArrayBuffer, particles); - } - - private void OnRenderFrame(object sender, FrameEventArgs e) - { - // set up viewport - GL.Viewport(0, 0, Width, Height); - // clear the back buffer - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - // set up modelview and perspective matrix - SetupPerspective(); - - // set uniforms - _program.CenterMass.Set(_centerMass); - _program.TimeStep.Set((float)e.Time); - _program.ModelViewProjectionMatrix.Set(ModelView * Projection); - - // set up binding of the shader variable to the buffer object - _vao.BindAttribute(_program.InPosition, _buffers.Ping); - _vao.BindAttribute(_program.InVelocity, _buffers.Ping, 16); - - // set target buffer for transform feedback - // the two outputs are interleaved into the same buffer - // so we only have to bind one of them as both binding indices are equal: - // _program.OutPosition.Index == _program.OutVelocity.Index - // when you choose to write into different buffers you need to bind all of them - _feedback.BindOutput(_program.OutPosition, _buffers.Pong); - - // render the buffer and capture transform feedback outputs - _feedback.Begin(TransformFeedbackPrimitiveType.Points); - _vao.DrawArrays(PrimitiveType.Points, 0, _buffers.Ping.ElementCount); - _feedback.End(); - - // swap all the buffers! - _buffers.Swap(); - SwapBuffers(); - } - - private void OnKeyDown(object sender, KeyboardKeyEventArgs e) - { - const float up = 1.1f; - const float down = 0.9f; - var reinitialize = false; - switch (e.Key) - { - case Key.Up: _centerMass *= up; break; - case Key.Down: _centerMass *= down; break; - case Key.Space: - case Key.Right: - case Key.Left: - if (e.Key == Key.Right) _particleCount = (int)(_particleCount * up); - if (e.Key == Key.Left) _particleCount = (int)(_particleCount * down); - reinitialize = true; - break; - } - if (reinitialize) InitializeParticles(_particleCount); - } - } -} \ No newline at end of file diff --git a/Examples/AdvancedExamples/LoaderDDS.cs b/Examples/AdvancedExamples/LoaderDDS.cs deleted file mode 100644 index ef64f1d..0000000 --- a/Examples/AdvancedExamples/LoaderDDS.cs +++ /dev/null @@ -1,708 +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.Diagnostics; -using System.IO; -using OpenTK.Graphics.OpenGL; - -namespace Examples.AdvancedExamples -{ - /// <summary> - /// 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. - /// </summary> - public 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 - } - - /// <summary>This list was derived from nVidia OpenGL SDK</summary> - [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 - - /// <summary> - /// 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(); - /// </summary> - /// <param name="filename">The name of the file you wish to load, including path and file extension.</param> - /// <param name="texturehandle">0 if invalid, otherwise a Texture Object usable with GL.BindTexture().</param> - /// <param name="dimension">0 if invalid, will output what was loaded (typically Texture1D/2D/3D or Cubemap)</param> - 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; - } - - /// <summary> Returns true if the flag is set, false otherwise</summary> - 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; - } - - /// <summary>DXT5 Alpha block flipping, inspired by code from Evan Hart (nVidia SDK)</summary> - 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/Examples/AdvancedExamples/LoaderStatics.cs b/Examples/AdvancedExamples/LoaderStatics.cs deleted file mode 100644 index fa74751..0000000 --- a/Examples/AdvancedExamples/LoaderStatics.cs +++ /dev/null @@ -1,48 +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 OpenTK.Graphics.OpenGL; - -namespace Examples.AdvancedExamples -{ - - /// <summary>The parameters in this class have only effect on the following Texture loads.</summary> - public static class TextureLoaderParameters - { - /// <summary>(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.</summary> - public static bool Verbose = false; - - /// <summary>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.</summary> - public static uint OpenGLDefaultTexture = 0; - - /// <summary>Compressed formats must have a border of 0, so this is constant.</summary> - public const int Border = 0; - - /// <summary>false==DirectX TexCoords, true==OpenGL TexCoords (Default: true)</summary> - public static bool FlipImages = true; - - /// <summary>When enabled, will use Glu to create MipMaps for images loaded with GDI+ (Default: false)</summary> - public static bool BuildMipmapsForUncompressed = false; - - /// <summary>Selects the Magnification filter for following Textures to be loaded. (Default: Nearest)</summary> - public static TextureMagFilter MagnificationFilter = TextureMagFilter.Nearest; - - /// <summary>Selects the Minification filter for following Textures to be loaded. (Default: Nearest)</summary> - public static TextureMinFilter MinificationFilter = TextureMinFilter.Nearest; - - /// <summary>Selects the S Wrapping for following Textures to be loaded. (Default: Repeat)</summary> - public static TextureWrapMode WrapModeS = TextureWrapMode.Repeat; - - /// <summary>Selects the T Wrapping for following Textures to be loaded. (Default: Repeat)</summary> - public static TextureWrapMode WrapModeT = TextureWrapMode.Repeat; - - /// <summary>Selects the Texture Environment Mode for the following Textures to be loaded. Default: Modulate)</summary> - public static TextureEnvMode EnvMode = TextureEnvMode.Modulate; - } - -} diff --git a/Examples/AdvancedExamples/ParallaxMappingExample.cs b/Examples/AdvancedExamples/ParallaxMappingExample.cs deleted file mode 100644 index ce299d6..0000000 --- a/Examples/AdvancedExamples/ParallaxMappingExample.cs +++ /dev/null @@ -1,248 +0,0 @@ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.AdvancedExamples -{ - [ExampleProject("Swizzled Parallax Mapping (ported from OpenTK examples)")] - public class ParallaxMappingExample - : ExampleWindow - { - [StructLayout(LayoutKind.Sequential)] - private struct Vertex - { - public Vector3 Position; - public Vector3 Normal; - public Vector3 Tangent; - public Vector2 TexCoord; - } - - private VertexArray _vao; - private Buffer<Vertex> _buffer; - private ParallaxProgram _program; - private Texture2D _textureDiffuseHeight; - private Texture2D _textureNormalGloss; - - const string TextureDiffuseHeightFilename = "Data/Textures/swizzled-rock-diffuse-height.dds"; - const string TextureNormalGlossFilename = "Data/Textures/swizzled-rock-normal-gloss.dds"; - - 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); - - // Material parameter - //private Vector3 _materialScaleAndBiasAndShininess = new Vector3( 0.07f, 0.0f, 38.0f ); // for Metal tex - private Vector3 _materialScaleAndBiasAndShininess = new Vector3(0.04f, 0.0f, 92.0f); // for Rock tex - - public ParallaxMappingExample() - { - Load += OnLoad; - Resize += OnResize; - UpdateFrame += OnUpdateFrame; - RenderFrame += OnRenderFrame; - } - - protected void OnLoad(object sender, EventArgs eventArgs) - { - VSync = VSyncMode.Off; - - // Check for necessary capabilities: - var 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."); - } - - var 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(""); - - // load textures - TextureLoaderParameters.MagnificationFilter = TextureMagFilter.Linear; - TextureLoaderParameters.MinificationFilter = TextureMinFilter.LinearMipmapLinear; - TextureLoaderParameters.WrapModeS = TextureWrapMode.ClampToBorder; - TextureLoaderParameters.WrapModeT = TextureWrapMode.ClampToBorder; - TextureLoaderParameters.EnvMode = TextureEnvMode.Modulate; - - uint handle; - TextureTarget target; - ImageDDS.LoadFromDisk(TextureDiffuseHeightFilename, out handle, out target); - _textureDiffuseHeight = TextureFactory.AquireTexture2D((int) handle); - Trace.WriteLine("Loaded " + TextureDiffuseHeightFilename + " with handle " + handle + " as " + target); - - ImageDDS.LoadFromDisk(TextureNormalGlossFilename, out handle, out target); - _textureNormalGloss = TextureFactory.AquireTexture2D((int) handle); - Trace.WriteLine("Loaded " + TextureNormalGlossFilename + " with handle " + handle + " as " + target); - - Trace.WriteLine("End of Texture Loading. GL Error: " + GL.GetError()); - Trace.WriteLine(""); - - // initialize buffer - var normal = Vector3.UnitZ; - var tangent = Vector3.UnitX; - var vertices = new[] - { - new Vertex - { - Position = new Vector3(-1,-1,0), - TexCoord = new Vector2(0,0), - Normal = normal, - Tangent = tangent - }, - new Vertex - { - Position = new Vector3(1,-1,0), - TexCoord = new Vector2(1,0), - Normal = normal, - Tangent = tangent - }, - new Vertex - { - Position = new Vector3(-1,1,0), - TexCoord = new Vector2(0,1), - Normal = normal, - Tangent = tangent - }, - new Vertex - { - Position = new Vector3(1,1,0), - TexCoord = new Vector2(1,1), - Normal = normal, - Tangent = tangent - } - }; - _buffer = new Buffer<Vertex>(); - _buffer.Init(BufferTarget.ArrayBuffer, vertices); - - // load shader - _program = ProgramFactory.Create<ParallaxProgram>(); - _program.Use(); - - // set up vertex array - _vao = new VertexArray(); - _vao.Bind(); - // bind vertex attributes - // the buffer layout is defined by the Vertex struct: - // data X Y Z NX NY NZ TX TY TZ U V *next vertex* - // offset 0 4 8 12 16 20 24 28 32 36 40 44 - // having to work with offsets could be prevented by using seperate buffer objects for each attribute, - // but that might reduce performance and can get annoying as well. - // performance increase could also be achieved by improving coherent read access - // by padding the struct so that each attribute begins at a multiple of 16 bytes, i.e. 4-floats - // because the GPU can then read all 4 floats at once. I did not do that here to keep it simple. - _vao.BindAttribute(_program.InPosition, _buffer); - _vao.BindAttribute(_program.InNormal, _buffer, 12); - _vao.BindAttribute(_program.InTangent, _buffer, 24); - _vao.BindAttribute(_program.InTexCoord, _buffer, 36); - - // set camera position - Camera.DefaultState.Position = new Vector3(0,0,3); - Camera.ResetToDefault(); - - // set 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); - } - - protected void OnResize(object sender, EventArgs e) - { - GL.Viewport(0, 0, Width, Height); - } - - protected void OnUpdateFrame(object sender, FrameEventArgs e) - { - if (Keyboard[Key.Space]) Trace.WriteLine("GL: " + GL.GetError()); - var factor = (float)e.Time; - if (Keyboard[Key.Q]) - { - _materialScaleAndBiasAndShininess.X += factor; - Trace.WriteLine("Scale: " + _materialScaleAndBiasAndShininess.X + " Bias: " + _materialScaleAndBiasAndShininess.Y); - } - if (Keyboard[Key.A]) - { - _materialScaleAndBiasAndShininess.X -= factor; - Trace.WriteLine("Scale: " + _materialScaleAndBiasAndShininess.X + " Bias: " + _materialScaleAndBiasAndShininess.Y); - } - if (Keyboard[Key.W]) - { - _materialScaleAndBiasAndShininess.Y += factor; - Trace.WriteLine("Scale: " + _materialScaleAndBiasAndShininess.X + " Bias: " + _materialScaleAndBiasAndShininess.Y); - } - if (Keyboard[Key.S]) - { - _materialScaleAndBiasAndShininess.Y -= factor; - Trace.WriteLine("Scale: " + _materialScaleAndBiasAndShininess.X + " Bias: " + _materialScaleAndBiasAndShininess.Y); - } - if (Keyboard[Key.E]) - { - _materialScaleAndBiasAndShininess.Z += factor*100; - Trace.WriteLine("Shininess: " + _materialScaleAndBiasAndShininess.Z); - } - if (Keyboard[Key.D]) - { - _materialScaleAndBiasAndShininess.Z -= factor*100; - Trace.WriteLine("Shininess: " + _materialScaleAndBiasAndShininess.Z); - } - - _lightPosition.X = (-(Width / 2) + Mouse.X) / 100f; - _lightPosition.Y = ((Height / 2) - Mouse.Y) / 100f; - } - - protected void OnRenderFrame(object sender, FrameEventArgs e) - { - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - // first Material's uniforms - _program.Material_DiffuseAndHeight.BindTexture(TextureUnit.Texture0, _textureDiffuseHeight); - _program.Material_NormalAndGloss.BindTexture(TextureUnit.Texture1, _textureNormalGloss); - _program.Material_ScaleBiasShininess.Set(_materialScaleAndBiasAndShininess); - - // the rest are vectors - _program.Camera_Position.Set(Camera.State.Position); - _program.Light_Position.Set(_lightPosition); - _program.Light_DiffuseColor.Set(_lightDiffuse); - _program.Light_SpecularColor.Set(_lightSpecular); - - // set up matrices - SetupPerspective(); - var normalMatrix = new Matrix3(ModelView).Inverted(); - normalMatrix.Transpose(); - _program.NormalMatrix.Set(normalMatrix); - _program.ModelViewMatrix.Set(ModelView); - _program.ModelViewProjectionMatrix.Set(ModelView * Projection); - - // render - _vao.DrawArrays(PrimitiveType.TriangleStrip, 0, _buffer.ElementCount); - - SwapBuffers(); - } - } -} diff --git a/Examples/AdvancedExamples/RenderToTextureExample.cs b/Examples/AdvancedExamples/RenderToTextureExample.cs deleted file mode 100644 index e4e196e..0000000 --- a/Examples/AdvancedExamples/RenderToTextureExample.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Drawing; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using ObjectTK.Textures; -using ObjectTK.Tools.Shapes; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.AdvancedExamples -{ - [ExampleProject("Render to texture")] - public class RenderToTextureExample - : ExampleWindow - { - private const int FramebufferWidth = 400; - private const int FramebufferHeight = 400; - - private Framebuffer _framebuffer; - private Renderbuffer _depthBuffer; - private Texture2D _texture; - - private SimpleColorProgram _colorProgram; - private SimpleTextureProgram _textureProgram; - - private ColorCube _cube; - private TexturedQuad _quad; - - private VertexArray _cubeVao; - private VertexArray _quadVao; - - public RenderToTextureExample() - { - Load += OnLoad; - RenderFrame += OnRenderFrame; - } - - private void OnLoad(object sender, EventArgs e) - { - // initialize and bind framebuffer - _framebuffer = new Framebuffer(); - _framebuffer.Bind(FramebufferTarget.Framebuffer); - - // initialize a renderbuffer and bind it to the depth attachment - // to support depth testing while rendering to the texture - _depthBuffer = new Renderbuffer(); - _depthBuffer.Init(RenderbufferStorage.DepthComponent, FramebufferWidth, FramebufferHeight); - _framebuffer.Attach(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, _depthBuffer); - - // initialize texture and bind it to the color attachment - _texture = new Texture2D(SizedInternalFormat.Rgba8, FramebufferWidth, FramebufferHeight, 1); - _framebuffer.Attach(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, _texture); - Framebuffer.Unbind(FramebufferTarget.Framebuffer); - - // initialize demonstration geometry - _cube = new ColorCube(); - _cube.UpdateBuffers(); - _quad = new TexturedQuad(); - _quad.UpdateBuffers(); - - // initialize shaders - _colorProgram = ProgramFactory.Create<SimpleColorProgram>(); - _textureProgram = ProgramFactory.Create<SimpleTextureProgram>(); - - // set up vertex attributes for the cube - _cubeVao = new VertexArray(); - _cubeVao.Bind(); - _cubeVao.BindAttribute(_colorProgram.InPosition, _cube.VertexBuffer); - _cubeVao.BindAttribute(_colorProgram.InColor, _cube.ColorBuffer); - _cubeVao.BindElementBuffer(_cube.IndexBuffer); - - // set up vertex attributes for the quad - _quadVao = new VertexArray(); - _quadVao.Bind(); - _quadVao.BindAttribute(_textureProgram.InPosition, _quad.VertexBuffer); - _quadVao.BindAttribute(_textureProgram.InTexCoord, _quad.TexCoordBuffer); - - // set camera position - Camera.DefaultState.Position = new Vector3(0,0,3); - Camera.ResetToDefault(); - - // enable depth testing - GL.Enable(EnableCap.DepthTest); - } - - private void OnRenderFrame(object sender, FrameEventArgs e) - { - // set up render to texture - _framebuffer.Bind(FramebufferTarget.Framebuffer); - GL.Viewport(0, 0, FramebufferWidth, FramebufferHeight); - GL.ClearColor(Color.Black); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - // render rotating cube to texture - _colorProgram.Use(); - _colorProgram.ModelViewProjectionMatrix.Set( - Matrix4.CreateRotationX((float) FrameTimer.TimeRunning/1000) - * Matrix4.CreateRotationY((float) FrameTimer.TimeRunning/1000) - * Matrix4.CreateTranslation(0,0,-5) - * Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, FramebufferWidth/(float)FramebufferHeight, 0.1f, 100)); - _cubeVao.Bind(); - _cubeVao.DrawElements(PrimitiveType.Triangles, _cube.IndexBuffer.ElementCount); - - // reset to default framebuffer - Framebuffer.Unbind(FramebufferTarget.Framebuffer); - - // set up viewport for the window - GL.Viewport(0, 0, Width, Height); - GL.ClearColor(Color.MidnightBlue); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - SetupPerspective(); - - // render quad with texture - _textureProgram.Use(); - _textureProgram.ModelViewProjectionMatrix.Set(ModelView * Projection); - _quadVao.Bind(); - _quadVao.DrawArrays(PrimitiveType.TriangleStrip, 0, _quad.VertexBuffer.ElementCount); - - // swap buffers - SwapBuffers(); - } - } -} \ No newline at end of file diff --git a/Examples/BasicExamples/BufferLayoutTexturingExample.cs b/Examples/BasicExamples/BufferLayoutTexturingExample.cs deleted file mode 100644 index 3cb316b..0000000 --- a/Examples/BasicExamples/BufferLayoutTexturingExample.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.BasicExamples -{ - [ExampleProject("Custom buffer memory layout and simple texturing")] - public class BufferLayoutTexturingExample - : ExampleWindow - { - /// <summary> - /// Defines a custom struct which is uploaded to a buffer object. - /// The StructLayout attributes makes sure that the order of data in memory is like it is defined here. - /// To prevent errors with byte-offsets read up on "packing". - /// </summary> - [StructLayout(LayoutKind.Sequential)] - private struct Vertex - { - public Vector3 Position; - public Vector2 TexCoord; - - public Vertex(float x, float y, float z, float u, float v) - { - Position = new Vector3(x,y,z); - TexCoord = new Vector2(u,v); - } - } - - private Texture2D _texture; - private Sampler _sampler; - private SimpleTextureProgram _program; - private Buffer<Vertex> _vbo; - private VertexArray _vao; - private bool _enableMipmapping; - - public BufferLayoutTexturingExample() - { - Load += OnLoad; - RenderFrame += OnRenderFrame; - KeyDown += OnKeyDown; - _enableMipmapping = true; - } - - private void OnKeyDown(object sender, KeyboardKeyEventArgs e) - { - switch (e.Key) - { - case Key.Space: _enableMipmapping = !_enableMipmapping; break; - } - } - - private void OnLoad(object sender, EventArgs e) - { - // load texture from file - using (var bitmap = new Bitmap("Data/Textures/checker.jpg")) - { - BitmapTexture.CreateCompatible(bitmap, out _texture); - _texture.LoadBitmap(bitmap); - } - _texture.GenerateMipMaps(); - - // initialize sampler - _sampler = new Sampler(); - _sampler.SetWrapMode(TextureWrapMode.Repeat); - - // create vertex data for a big plane - const int a = 10; - const int b = 10; - var vertices = new[] - { - new Vertex(-a, 0,-a, 0, 0), - new Vertex( a, 0,-a, b, 0), - new Vertex(-a, 0, a, 0, b), - new Vertex( a, 0, a, b, b) - }; - - // create buffer object and upload vertex data - _vbo = new Buffer<Vertex>(); - _vbo.Init(BufferTarget.ArrayBuffer, vertices); - - // initialize shader - _program = ProgramFactory.Create<SimpleTextureProgram>(); - // activate shader program - _program.Use(); - // bind sampler - _sampler.Bind(TextureUnit.Texture0); - // bind texture - _program.Texture.BindTexture(TextureUnit.Texture0, _texture); - // which is equivalent to - //_program.Texture.Set(TextureUnit.Texture0); - //_texture.Bind(TextureUnit.Texture0); - - // set up vertex array and attributes - _vao = new VertexArray(); - _vao.Bind(); - // memory layout of our data is XYZUVXYZUV... - // the buffer abstraction knows the total size of one "pack" of vertex data - // and if a vertex attribute is bound without further arguments the first N elements are taken from each pack - // where N is provided via the VertexAttribAttribute on the program property: - _vao.BindAttribute(_program.InPosition, _vbo); - // if data should not be taken from the start of each pack, the offset must be given in bytes - // to reach the texture coordinates UV the XYZ coordinates must be skipped, that is 3 floats, i.e. an offset of 12 bytes is needed - _vao.BindAttribute(_program.InTexCoord, _vbo, 12); - // if needed all the available arguments can be specified manually, e.g. - //_vao.BindAttribute(_program.InTexCoord, _vbo, 2, VertexAttribPointerType.Float, Marshal.SizeOf(typeof(Vertex)), 12, false); - - // set default camera - Camera.DefaultState.Position = new Vector3(0, 0.5f, 3); - Camera.ResetToDefault(); - - // set a nice clear color - GL.ClearColor(Color.MidnightBlue); - } - - private void OnRenderFrame(object sender, FrameEventArgs e) - { - // set up viewport - GL.Viewport(0, 0, Width, Height); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - SetupPerspective(); - - // enable/disable mipmapping on the sampler - _sampler.SetParameter(SamplerParameterName.TextureMinFilter, - (int)(_enableMipmapping ? TextureMinFilter.NearestMipmapLinear : TextureMinFilter.Nearest)); - - // set transformation matrix - _program.ModelViewProjectionMatrix.Set(ModelView*Projection); - // render vertex data - _vao.DrawArrays(PrimitiveType.TriangleStrip, 0, _vbo.ElementCount); - - // swap buffers - SwapBuffers(); - } - } -} \ No newline at end of file diff --git a/Examples/BasicExamples/MinimalExample.cs b/Examples/BasicExamples/MinimalExample.cs deleted file mode 100644 index 17dc7c1..0000000 --- a/Examples/BasicExamples/MinimalExample.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Drawing; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.BasicExamples -{ - [ExampleProject("Minimal example on shader and buffer usage")] - public class MinimalExample - : ExampleWindow - { - private ExampleProgram _program; - private VertexArray _vao; - private Buffer<Vector3> _vbo; - - public MinimalExample() - { - Load += OnLoad; - Unload += OnUnload; - RenderFrame += OnRenderFrame; - } - - private void OnLoad(object sender, EventArgs e) - { - // initialize shader (load sources, create/compile/link shader program, error checking) - // when using the factory method the shader sources are retrieved from the ShaderSourceAttributes - _program = ProgramFactory.Create<ExampleProgram>(); - // this program will be used all the time so just activate it once and for all - _program.Use(); - - // create vertices for a triangle - var vertices = new[] { new Vector3(-1,-1,0), new Vector3(1,-1,0), new Vector3(0,1,0) }; - - // create buffer object and upload vertex data - _vbo = new Buffer<Vector3>(); - _vbo.Init(BufferTarget.ArrayBuffer, vertices); - - // create and bind a vertex array - _vao = new VertexArray(); - _vao.Bind(); - // set up binding of the shader variable to the buffer object - _vao.BindAttribute(_program.InPosition, _vbo); - - // set camera position - Camera.DefaultState.Position = new Vector3(0,0,3); - Camera.ResetToDefault(); - - // set a nice clear color - GL.ClearColor(Color.MidnightBlue); - } - - private void OnUnload(object sender, EventArgs e) - { - // Always make sure to properly dispose gl resources to prevent memory leaks. - // Most of the examples do not explicitly dispose resources, because - // the base class (ExampleWindow) calls GLResource.DisposeAll(this). - // This will automatically dispose all objects referenced by class fields - // which derive from GLResource. Everything else still has to be disposed manually. - _program.Dispose(); - _vao.Dispose(); - _vbo.Dispose(); - } - - private void OnRenderFrame(object sender, FrameEventArgs e) - { - // set up viewport - GL.Viewport(0, 0, Width, Height); - // clear the back buffer - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - // set up modelview and perspective matrix - SetupPerspective(); - - // calculate the MVP matrix and set it to the shaders uniform - _program.ModelViewProjectionMatrix.Set(ModelView*Projection); - // draw the buffer which contains the triangle - _vao.DrawArrays(PrimitiveType.Triangles, 0, _vbo.ElementCount); - - // swap buffers - SwapBuffers(); - } - } -} \ No newline at end of file diff --git a/Examples/BasicExamples/RotatingTexturedCubeExample.cs b/Examples/BasicExamples/RotatingTexturedCubeExample.cs deleted file mode 100644 index 739f4d3..0000000 --- a/Examples/BasicExamples/RotatingTexturedCubeExample.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Diagnostics; -using System.Drawing; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using ObjectTK.Textures; -using ObjectTK.Tools.Shapes; -using OpenTK; -using OpenTK.Graphics.OpenGL; -using OpenTK.Input; - -namespace Examples.BasicExamples -{ - [ExampleProject("Rotating textured cube rendering")] - public class RotatingTexturedCubeExample - : ExampleWindow - { - private Texture2D _texture; - - private SimpleTextureProgram _textureProgram; - - private TexturedCube _cube; - private VertexArray _cubeVao; - - private Matrix4 _baseView; - private Matrix4 _objectView; - - private Vector3[] _rotateVectors = new[] { Vector3.Zero, Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ, Vector3.One }; - private const int _defaultRotateIndex = 4; - - private int _rotateIndex = _defaultRotateIndex; - private readonly Stopwatch _stopwatch = new Stopwatch(); - - public RotatingTexturedCubeExample() - { - Load += OnLoad; - RenderFrame += OnRenderFrame; - KeyDown += OnKeyDown; - } - - private void OnKeyDown(object sender, KeyboardKeyEventArgs e) - { - switch (e.Key) - { - case Key.R: - _objectView = _baseView = Matrix4.Identity; - _rotateIndex = _defaultRotateIndex; - _stopwatch.Restart(); - break; - - case Key.Space: - _baseView = _objectView; - _rotateIndex = (_rotateIndex + 1) % _rotateVectors.Length; - _stopwatch.Restart(); - break; - - case Key.Number0: - case Key.Number1: - case Key.Number2: - case Key.Number3: - case Key.Number4: - _baseView = _objectView; - _rotateIndex = (e.Key - Key.Number0) % _rotateVectors.Length; - _stopwatch.Restart(); - break; - } - } - - private void OnLoad(object sender, EventArgs e) - { - // load texture from file - using (var bitmap = new Bitmap("Data/Textures/crate.png")) - { - BitmapTexture.CreateCompatible(bitmap, out _texture); - _texture.LoadBitmap(bitmap); - } - - // initialize shaders - _textureProgram = ProgramFactory.Create<SimpleTextureProgram>(); - - // initialize cube object and base view matrix - _objectView = _baseView = Matrix4.Identity; - - // initialize demonstration geometry - _cube = new TexturedCube(); - _cube.UpdateBuffers(); - - // set up vertex attributes for the quad - _cubeVao = new VertexArray(); - _cubeVao.Bind(); - _cubeVao.BindAttribute(_textureProgram.InPosition, _cube.VertexBuffer); - _cubeVao.BindAttribute(_textureProgram.InTexCoord, _cube.TexCoordBuffer); - - // Enable culling, our cube vertices are defined inside out, so we flip them - GL.Enable(EnableCap.CullFace); - GL.CullFace(CullFaceMode.Back); - - // initialize camera position - Camera.DefaultState.Position = new Vector3(0, 0, 4); - Camera.ResetToDefault(); - - // set nice clear color - GL.ClearColor(Color.MidnightBlue); - - _stopwatch.Restart(); - } - - private void OnRenderFrame(object sender, OpenTK.FrameEventArgs e) - { - // set up viewport - GL.Viewport(0, 0, Width, Height); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - SetupPerspective(); - - // determinate object view rotation vectors and apply them - _objectView = _baseView; - var rotation = _rotateVectors[_rotateIndex]; - if (rotation != Vector3.Zero) - _objectView *= Matrix4.CreateFromAxisAngle(_rotateVectors[_rotateIndex], (float)(_stopwatch.Elapsed.TotalSeconds * 1.0)); - - // set transformation matrix - _textureProgram.Use(); - _textureProgram.ModelViewProjectionMatrix.Set(_objectView * ModelView * Projection); - - // render cube with texture - _cubeVao.Bind(); - _cubeVao.DrawArrays(_cube.DefaultMode, 0, _cube.VertexBuffer.ElementCount); - - // swap buffers - SwapBuffers(); - } - } -} diff --git a/Examples/BasicExamples/SkyboxExample.cs b/Examples/BasicExamples/SkyboxExample.cs deleted file mode 100644 index 59d20c7..0000000 --- a/Examples/BasicExamples/SkyboxExample.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Drawing; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using ObjectTK.Textures; -using ObjectTK.Tools.Shapes; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.BasicExamples -{ - [ExampleProject("Skybox rendering with cube map texture")] - public class SkyboxExample - : ExampleWindow - { - private SkyboxProgram _program; - private TextureCubemap _skybox; - private VertexArray _vao; - private Cube _cube; - - public SkyboxExample() - { - Load += OnLoad; - Unload += OnUnload; - RenderFrame += OnRender; - } - - private void OnLoad(object sender, EventArgs e) - { - // initialize shader - _program = ProgramFactory.Create<SkyboxProgram>(); - // initialize cube shape - _cube = new Cube(); - _cube.UpdateBuffers(); - // initialize vertex array and attributes - _vao = new VertexArray(); - _vao.Bind(); - _vao.BindAttribute(_program.InPosition, _cube.VertexBuffer); - _vao.BindElementBuffer(_cube.IndexBuffer); - // create cubemap texture and load all faces - for (var i = 0; i < 6; i++) - { - using (var bitmap = new Bitmap(string.Format("Data/Textures/city{0}.jpg", i))) - { - bitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); - if (_skybox == null) BitmapTexture.CreateCompatible(bitmap, out _skybox, 1); - _skybox.LoadBitmap(bitmap, i); - } - } - // activate shader and bind texture to it - _program.Use(); - _program.Texture.BindTexture(TextureUnit.Texture0, _skybox); - // enable seamless filtering to reduce artifacts at the edges of the cube faces - GL.Enable(EnableCap.TextureCubeMapSeamless); - // cull front faces because we are inside the cube - // this is not really necessary but removes some artifacts when the user leaves the cube - // which should be impossible for a real skybox, but in this demonstration it is possible by zooming out - GL.Enable(EnableCap.CullFace); - GL.CullFace(CullFaceMode.Front); - // set a nice clear color - GL.ClearColor(Color.MidnightBlue); - } - - private void OnUnload(object sender, EventArgs e) - { - _cube.VertexBuffer.Dispose(); - _cube.IndexBuffer.Dispose(); - } - - private void OnRender(object sender, FrameEventArgs e) - { - // set up viewport - GL.Viewport(0, 0, Width, Height); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - SetupPerspective(); - - // note: normally you want to clear the translation part of the ModelView matrix to prevent the user from leaving the cube - // to do that you can use ModelView.ClearTranslation() instead of the unmodified ModelView matrix - _program.ModelViewProjectionMatrix.Set(Matrix4.CreateScale(10) * ModelView * Projection); - // draw cube - _vao.DrawElements(_cube.DefaultMode, _cube.IndexBuffer.ElementCount); - - // swap buffers - SwapBuffers(); - } - } -} diff --git a/Examples/BasicExamples/TextureGridExample.cs b/Examples/BasicExamples/TextureGridExample.cs deleted file mode 100644 index 32fa4cc..0000000 --- a/Examples/BasicExamples/TextureGridExample.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Drawing; -using System.IO; -using System.Runtime.InteropServices; -using Examples.Shaders; -using ObjectTK.Buffers; -using ObjectTK.Shaders; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.BasicExamples -{ - [ExampleProject("Textured grid rendering")] - public class TextureGridExample - : ExampleWindow - { - [StructLayout(LayoutKind.Sequential)] - public struct Minefield - { - public Vector2 Position; - public int State; - - public Minefield(float x, float y, int texture) - { - Position = new Vector2(x, y); - State = texture; - } - } - - private TextureGridProgram _gridProgram; - private Texture2DArray _textureArray; - private Buffer<Minefield> _buffer; - private VertexArray _vao; - - private readonly string[] _stateTextures = { "empty.png", "flag.png", "mine.png" }; - - const int FieldWidth = 100; - const int FieldHeight = 100; - - public TextureGridExample() - { - Load += OnLoad; - RenderFrame += OnRenderFrame; - } - - protected void OnLoad(object sender, EventArgs e) - { - // load textures into array - for (var i = 0; i < _stateTextures.Length; i++) - { - using (var bitmap = new Bitmap(Path.Combine("Data/Textures/", _stateTextures[i]))) - { - bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); - if (_textureArray == null) BitmapTexture.CreateCompatible(bitmap, out _textureArray, _stateTextures.Length, 1); - _textureArray.LoadBitmap(bitmap, i); - } - } - // initialize buffer - var field = new Minefield[FieldWidth*FieldHeight]; - for (var i = 0; i < field.Length; i++) - { - field[i] = new Minefield(i%FieldWidth, i/FieldHeight, i%_stateTextures.Length); - } - _buffer = new Buffer<Minefield>(); - _buffer.Init(BufferTarget.ArrayBuffer, field); - // load program - _gridProgram = ProgramFactory.Create<TextureGridProgram>(); - _gridProgram.Use(); - // bind the texture and set uniform - _gridProgram.TextureData.BindTexture(TextureUnit.Texture0, _textureArray); - // set up vertex array and attributes - _vao = new VertexArray(); - _vao.Bind(); - _vao.BindAttribute(_gridProgram.InPosition, _buffer); - _vao.BindAttribute(_gridProgram.InTexture, _buffer, 8); - // set nice clear color - GL.ClearColor(Color.MidnightBlue); - // initialize camera position - Camera.DefaultState.Position = new Vector3(0, 5, 15); - Camera.ResetToDefault(); - } - - protected void OnRenderFrame(object sender, FrameEventArgs frameEventArgs) - { - // setup stuff - GL.Viewport(0, 0, Width, Height); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - SetupPerspective(); - - // update MVP matrix and render grid - // also move camera rotation center to the center of the plane - // and rotate the plane from the x-y plane to the x-z plane - _gridProgram.ModelViewProjectionMatrix.Set( - Matrix4.CreateTranslation(-FieldWidth/2, -FieldHeight/2, 0) - * Matrix4.CreateRotationX(-(float)Math.PI/2) - * ModelView * Projection); - _vao.DrawArrays(PrimitiveType.Points, 0, _buffer.ElementCount); - - // swap buffers - SwapBuffers(); - } - } -} \ No newline at end of file diff --git a/Examples/Data/Shaders/ExampleShader.glsl b/Examples/Data/Shaders/ExampleShader.glsl deleted file mode 100644 index 2f68514..0000000 --- a/Examples/Data/Shaders/ExampleShader.glsl +++ /dev/null @@ -1,21 +0,0 @@ --- Version -#version 140 - --- Vertex -#include ExampleShader.Version -in vec3 InPosition; -uniform mat4 ModelViewProjectionMatrix; - -void main() -{ - gl_Position = ModelViewProjectionMatrix * vec4(InPosition,1); -} - --- Fragment -#include ExampleShader.Version -out vec4 FragColor; - -void main() -{ - FragColor = vec4(1); -} \ No newline at end of file diff --git a/Examples/Data/Shaders/Gravity.glsl b/Examples/Data/Shaders/Gravity.glsl deleted file mode 100644 index ef99a0d..0000000 --- a/Examples/Data/Shaders/Gravity.glsl +++ /dev/null @@ -1,51 +0,0 @@ --- Vertex -#version 140 -in vec3 InPosition; -in vec3 InVelocity; - -out vec3 OutPosition; -out vec3 OutVelocity; - -uniform float CenterMass; -uniform float TimeStep; -uniform mat4 ModelViewProjectionMatrix; - -void main() -{ - // calculate acceleration by gravity G*m/r^2 - // define G to be 1 or include it in CenterMass, doesn't matter - float acceleration = CenterMass / dot(InPosition, InPosition); - - // perform simple forward euler integration and - // stream position and velocity via transform feedback into the pong buffer - OutVelocity = InVelocity + acceleration * TimeStep * -normalize(InPosition); - OutPosition = InPosition + OutVelocity * TimeStep; - - // pass through current position - gl_Position = ModelViewProjectionMatrix * vec4(OutPosition,1); - gl_PointSize = clamp(length(acceleration)*2, 4, 10); -} - --- Fragment -#version 140 -out vec4 FragColor; - -in vec3 OutVelocity; - -//note: could use uniforms to set the colors from the application -const vec3 ColorFast = vec3(1.0, 0.0, 0.0); -const vec3 ColorSlow = vec3(0.0, 0.0, 1.0); - -void main() -{ - // calculate position within the point sprite - vec2 spritePosition = gl_PointCoord * 2 - vec2(1); - float r2 = dot(spritePosition, spritePosition); - - // skip pixels outside the circle - if (r2 > 1) discard; - - // draw fragment using a color gradient controlled by the total speed of the particle - // and darken the color the closer the current fragment is to the edge of the particles circle - FragColor = vec4(mix(ColorSlow, ColorFast, length(OutVelocity)) * (1.0 - r2), 1.0); -} \ No newline at end of file diff --git a/Examples/Data/Shaders/Parallax.glsl b/Examples/Data/Shaders/Parallax.glsl deleted file mode 100644 index c8424bf..0000000 --- a/Examples/Data/Shaders/Parallax.glsl +++ /dev/null @@ -1,107 +0,0 @@ --- Vertex -#version 150 -// Copyright (c) 2008 the OpenTK Team. See license.txt for legal bla - -// custom vertex attribute -in vec3 InPosition; -in vec3 InNormal; -in vec3 InTangent; -in vec2 InTexCoord; - -// transformation matrix -uniform mat4 ModelViewMatrix; -uniform mat4 ModelViewProjectionMatrix; -uniform mat3 NormalMatrix; - -// world uniforms -uniform vec3 Light_Position; -uniform vec3 Camera_Position; - -// MUST be written to for FS -out vec2 TexCoord; -out vec3 VaryingLightVector; -out vec3 VaryingEyeVector; - -void main() -{ - gl_Position = ModelViewProjectionMatrix * vec4(InPosition,1); - TexCoord = InTexCoord; - - vec3 nor = normalize(NormalMatrix * InNormal); - vec3 tan = normalize(NormalMatrix * InTangent); - vec3 bi = cross(nor, tan); - - // need positions in tangent space - vec3 vertex = vec3(ModelViewMatrix * vec4(InPosition,1)); - - 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); -} - --- Fragment -#version 150 -// 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 -in vec2 TexCoord; -in vec3 VaryingLightVector; -in 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, TexCoord.st ).a * - Material_ScaleBiasShininess.x - Material_ScaleBiasShininess.y; - // displace texcoords according to viewer - vec2 newTexCoords = TexCoord.st + ( parallaxOffset * eyeVector.xy ); - - // 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/Examples/Data/Shaders/SimpleColor.glsl b/Examples/Data/Shaders/SimpleColor.glsl deleted file mode 100644 index 33cd23c..0000000 --- a/Examples/Data/Shaders/SimpleColor.glsl +++ /dev/null @@ -1,25 +0,0 @@ --- Vertex -#version 140 -in vec3 InPosition; -in vec4 InColor; - -smooth out vec4 Color; - -uniform mat4 ModelViewProjectionMatrix; - -void main() -{ - gl_Position = ModelViewProjectionMatrix * vec4(InPosition,1); - Color = InColor; -} - --- Fragment -#version 140 -smooth in vec4 Color; - -out vec4 FragColor; - -void main() -{ - FragColor = Color; -} \ No newline at end of file diff --git a/Examples/Data/Shaders/SimpleTexture.glsl b/Examples/Data/Shaders/SimpleTexture.glsl deleted file mode 100644 index 5027b43..0000000 --- a/Examples/Data/Shaders/SimpleTexture.glsl +++ /dev/null @@ -1,31 +0,0 @@ --- Vertex -#version 140 -in vec3 InPosition; -in vec2 InTexCoord; - -smooth out vec2 TexCoord; - -uniform mat4 ModelViewProjectionMatrix; - -void main() -{ - // transform vertex position - gl_Position = ModelViewProjectionMatrix * vec4(InPosition,1); - // pass through texture coordinate - TexCoord = InTexCoord; -} - --- Fragment -#version 140 -smooth in vec2 TexCoord; - -out vec4 FragColor; - -uniform sampler2D Texture; -uniform bool RenderTexCoords = false; - -void main() -{ - if (RenderTexCoords) FragColor = vec4(TexCoord, 0, 1); - else FragColor = texture(Texture, TexCoord); -} \ No newline at end of file diff --git a/Examples/Data/Shaders/Skybox.glsl b/Examples/Data/Shaders/Skybox.glsl deleted file mode 100644 index 270b481..0000000 --- a/Examples/Data/Shaders/Skybox.glsl +++ /dev/null @@ -1,34 +0,0 @@ --- Vertex -#version 330 -in vec3 InPosition; - -smooth out vec3 TexCoord; - -uniform mat4 ModelViewProjectionMatrix; - -void main() -{ - vec4 position = ModelViewProjectionMatrix * vec4(InPosition, 1.0); - // setting the z coordinate to w forces the position to be on the far clipping-plane - // because after perspective divide, which is a division by w, the result is 1 - gl_Position = position.xyww; - // interpolate the positions between the vertices - // after rasterization we in fact get the position on the cubes surface for each fragment - TexCoord = InPosition; -} - --- Fragment -#version 330 -smooth in vec3 TexCoord; - -out vec4 FragColor; - -uniform samplerCube Texture; - -void main() -{ - // visualize the interpolated position, i.e. texture coordinate - //FragColor = vec4(TexCoord, 1); - // sample from the cube map texture - FragColor = texture(Texture, TexCoord); -} \ No newline at end of file diff --git a/Examples/Data/Shaders/TextureGrid.glsl b/Examples/Data/Shaders/TextureGrid.glsl deleted file mode 100644 index df95cca..0000000 --- a/Examples/Data/Shaders/TextureGrid.glsl +++ /dev/null @@ -1,63 +0,0 @@ --- Vertex -#version 140 -in vec2 InPosition; -in int InTexture; - -flat out vec2 Position; -flat out int Texture; - -void main() -{ - Position = InPosition; - Texture = InTexture; -} - --- Geometry -#version 150 - -// this shader processes points and outputs two triangles (a quad) -layout (points) in; -layout (triangle_strip, max_vertices = 4) out; - -flat in vec2 Position[1]; -flat in int Texture[1]; - -smooth out vec2 TextureCoordinates; -flat out int TextureLayer; - -uniform mat4 ModelViewProjectionMatrix; - -void main() -{ - TextureLayer = Texture[0]; - vec4 p = vec4(Position[0], 0, 1); - float d = 0.5; - gl_Position = ModelViewProjectionMatrix * (p + vec4(-d,-d, 0, 0)); - TextureCoordinates = vec2(0,0); - EmitVertex(); - gl_Position = ModelViewProjectionMatrix * (p + vec4( d,-d, 0, 0)); - TextureCoordinates = vec2(1,0); - EmitVertex(); - gl_Position = ModelViewProjectionMatrix * (p + vec4(-d, d, 0, 0)); - TextureCoordinates = vec2(0,1); - EmitVertex(); - gl_Position = ModelViewProjectionMatrix * (p + vec4( d, d, 0, 0)); - TextureCoordinates = vec2(1,1); - EmitVertex(); - EndPrimitive(); -} - --- Fragment -#version 140 -smooth in vec2 TextureCoordinates; -flat in int TextureLayer; - -out vec4 FragColor; - -uniform sampler2DArray TextureData; - -void main() -{ - FragColor = texture(TextureData, vec3(TextureCoordinates, TextureLayer)); - //FragColor = vec4(TextureCoordinates.rg, TextureLayer/220.0, 1); -} \ No newline at end of file diff --git a/Examples/Data/Textures/checker.jpg b/Examples/Data/Textures/checker.jpg deleted file mode 100644 index bf439b9eeefe4c5b3af1b830c386b683154a8a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2441 zcmeH|K~BRk6hy~y+_*~A^f#fcs@4&q2dKn`T^C4|;1nE%J8=OP9D>4zo0zFkBdb}l zsW<tNvKTp;=gG+NpZ*8a=fl$hN&$)&{5Kw9beg8x@Meq|WrfW+WuA`<DQ7b&MXLFF zQPry(k>%}jwb?XHQ!UzU>$YpxxYJ7%AI(PD#M+6grFQ=w{|>PU5@^*T5v4`>56p>5 z%y7n*dOf{RxfQCHYyVW~ul+)y6>YR&kK+q)_W<NOAh~}9-sl%Wplc-O(3TW2LpY-l zBlh<=p>QHJ;T%Gj05N*n^#xK4)#wr!su3hGR3rR(1i^H5iExY%<NAk0Z^J`1!fNdO F@fSfR8gu{v diff --git a/Examples/Data/Textures/city0.jpg b/Examples/Data/Textures/city0.jpg deleted file mode 100644 index 80d32d68c87586cb1938b3598bc9fa44656e48c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34449 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 diff --git a/Examples/Data/Textures/city1.jpg b/Examples/Data/Textures/city1.jpg deleted file mode 100644 index 7dd13454b11d57ab19bf1679d113aae8a844cc62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36815 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 bOjp@u7jCUY@RDt6k#lNV#xUp({BrKUW|=<f diff --git a/Examples/Data/Textures/city2.jpg b/Examples/Data/Textures/city2.jpg deleted file mode 100644 index eb8ea7a3695f0fbea28cb6a2adebd9f025497ba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30510 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 OyBQ<NFQywlPW}&xTw)^t diff --git a/Examples/Data/Textures/city3.jpg b/Examples/Data/Textures/city3.jpg deleted file mode 100644 index 7106e93272b6be07e53d562b83e8ee087a1a75f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28435 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 diff --git a/Examples/Data/Textures/city4.jpg b/Examples/Data/Textures/city4.jpg deleted file mode 100644 index 2b5b0171223661c1c03a2fbfc248919148d112c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35810 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 G-~R$Uq*HGI diff --git a/Examples/Data/Textures/city5.jpg b/Examples/Data/Textures/city5.jpg deleted file mode 100644 index 159d942a41983487b6671591faf161a1ec82c850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30269 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 Ztt$zlXvT=~cY-}DfkR;>lw#ig(?6WR9Y+8F diff --git a/Examples/Data/Textures/crate.png b/Examples/Data/Textures/crate.png deleted file mode 100644 index 819d8d409fb8438f1dd7321893def883119580cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344272 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≤I>6{NxFpi=|3P{NK9e6Jsg0 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%0D_J);w8sT zxl(4+Qc<#CCV><%#wXV>ATWs;&-^jPH9$5HVPt?aQ@9&f^6cz3YtI6>3CFW2qOeE2 zZ4T0%Ky@tFF(8r9LLV5mElxUPw(mL~sm$Ac=Il)jq6<jqxFa)M+mOdhfXmUghQ<vi z(6D42mYT>tLt!PUIrW3UBtIK%V+Tz%7f2C9=3L>mh5q+mj4I05ko}1G;_V*S_^oiV z_KjFHYOV#fjr-@7VoM!)>TIQF7SB$AC8L}U;O`%F;)cg9LV4{58l|V1hNykwHGQ-T zF-I2p?y0ox4MIM<2t1*6X3HPK>J9rE7#p(Z{jxl#Wt0@|SCs%NzczI%0A;;Hi8enK z15G?@yG<?aNIZK9uv3<Fp_5+A>C6El&KeDDi7&@&keGLIt$Sr|I!?_ecno8*&Zd?x zqN6%WRoI@xstwShc{6u3%)l`CG1S4kh7(gru`qaqYx>m}y;|;~%}exVLZI>uRE%P8 z`@QiCp+&yzvj_t^)fU-3`Z>91R&M1q6UBs0remhqrafcSpmVRnTGhJHqoYH$ZP2a< z&XQ$PDF7`Hfqrof!ehRW_+TXYcI(KWjh49KL}p9y+NaU%^6BFb4eHz6hI3#dxlU4F z@{CcF0wy&@a67qL3i_qat}7Ny6bm+a)6qYY&|FAsq9pJ|RNp5I%!Jfeha`9sXsQ+E z#b5KC);|M^ZBI7AT^h>!StC2u(7~zT6D72rCG1{O5letFWS@0E56b1lY5nDE!K`T- zv~#JZceot<&VhD97S@pY*_J`udQ5NbHij+6Mi4Zli@LK+jbeT?k3?qtdP62vhZS}# z<CBW97D&Rii&a@cJjCNUCA~$ePhE)ot$SqE`_byOIazgz(?jkv-+Afjbiyth{-OC4 z{`6a8?_T{B`eyNZMDKKqGw|2Dr`l3Jya5hj6Op=h0kaOPsQ%s-h$AWvCwFm6LNf`y z**5{mQmTlR-?fES=3lBzUgBcz4gIp)Z|^^N!;SEi14%}1iutXZJ4=->8?=Iz{~AOA z*z+;s_SbhmYsB7+&#;-)*_HQzZEDVRt1Qk)FQ|6!Y`tl>cLTC6nJNS~L0CNH!izZo z(3JY}Y6$fjj57DM=Tzqk_NDDT)m^ll?dXXZWtbKn*}Y7(k+4s>Dw$t>lfA~VPQo0R zGCtsCbUtekYHgHJ6x470<*f#%f}le9oadU{ytlK0<Jo>uC6X1iT%dQo{qXC%uU>n6 z<C!KneE&<XMGF7^Yf*n=J6uzQkeykxABMM|OQ=esHk$-F)UY%(JQPg1wrRJ!ZVQ8r zAK2#6i?+F(scd8!x;s~p9>yA-pE+TDc7X-xLaH_i%{7?qPtlVi)u_srWO;&yjkJQ+ zFOYde5}DR0Gb=9b2`pVYZkP!P4DsOw;j2FPZFz9Cxf|3|9R0TDL@*~wYM%E8IIC(7 zlI<`rzzXF_)GoOPPf1<z-jPe#Itt4nm?Iid&?tGoDPE4?q~)p1F7DH24p{Uq?(|vN zvoo0NuzH`<<?(wn<(nMj*^H3T*?DrG<f%y)#>{84acLS$ECRG`IGLsq#i#H_ci{C& z)QiJxj^F|Y56v&|;#1Gu{esMLmdSD<*InXJcs!A&zD^TmDuX5Hh^u$>0C2bAJx~kj zHq>-GeOHiEIAHs<Y64-ygkg!pTuFLn>e>2@8yUKz+!m>R5sNYls=%=1%N-LP`pvr~ z%2)-da|q-<QQK)K*wbFxR&F#6W|e;EYoAI*<|fEH7on~j5WBp0QuJE@qG`zKv_ttd z!S<BGJpS{J9OIF-N2%P=RW}Z5+nLOyr@1h+&x56`Pu;}XqSXSpNZB=QZ0)iU5><bY z5Rh|nAb@PtL35qgP72gHO7v{oTlB4|q<A(%sSlbeJ5-26<=Lky7kOj1(}<XCF)A3F z!O;E2z`U|Eb(#%813>2^I5InC=WUQdr#cB4H2IU%Z9=7k+*Sv;Q}re5CR|_r^z%>Y zyQ?UTIDt(lC<aRolmZN52O0>;90AA3#lG0mTS>@N+Djjbj6zTVC%c~i$D>|V*PWni zWhS+r;XMt2y%;BYge5Qy%;4b9Qd>kS*qIS`Y-VU}*DargD1?ZI-%gqYq;PyXGyB$3 zj4VyqDF7X`mEvunInX#Oes+7;lkm)R)lM~{dt6DEMr%355D2|~zR^M<-rZXI^vU#8 z;-ARC4Xb+CB`jKD62sytng*eK0vNc_4J@)jTZ7cimTQu9trDS=WN{(AFu49ndLv5d zJ_<TaS&_r)1J>A|nmcJg(ie%Dw%}5#BqZ?bQGhj4YbAc#&nXULJw-|xA?q$|J-=s4 zv-&Kvczjj`r%kD+9HI8wi-%`g=S}x@S_G$Re%kl}%{gN0A*DZpRoVjtk&VO`v>7rT zdk(9gJhe%#{WH>#WN;gVnc~1P$ee|_-;f0E@Gp8tP50Ixy0Vf>uI>CXi_8zexajLM zCUaaa-lk#d^N2a{dK_u9=d@qkBCca>T&LswQaax3=lLcB%}K{H^&2>I*j&o{ij~3R zw{jLpHCS`hzD!~_LrWCoC`^kw1jv`aGRi51@f<zB{9%o?IEo27>R7#P00VoK$qc!h zHJ2!Y)5$=qL#ry9U?3a)ETn)2eo`Qsso;BIFom8Diwz75P8s#Wh8Z+^adER)lvrl) zy8QYMcF9Pk&78jc_*Dj!Y5COFYC-koQXHUSbDyCpHFsqQa$)D>b&MQkQz{S`)Q%zC z>fEn!Q%DxhTkWwr<F>IJ2a8Rwd{abhobWX*dm}^qD3d#w2~V$b+l5>>9wW`@7-5k) z47sg6J^e>3W%TzGhxJJfOHyfNrrEm0KvbK_jSXkA;(l_CNb6qRomnT(6`oC?ObTz@ z3jqCWu1pfeJuzwT%C%vR>K6x(YjxLNTH5$P4<4cd%OX2>$ME<RJPQImF_8=CSY+6p zoR_%CKdFyN>S#_bo21LLy>x&np2<6ZijN=t9C(gTPCnCz0_d==xX$A(D=H^^!^W&c zXtJ_LPSplI-WMpC!=-R+nx`K&BEwq}X^afyVBqjF8#-o9>o(WUTm-?=3;q~j+VHze z1o{CowKY%l(+wPA+(gf;WJW-8xsq*^0GWqB2|lMdn>>!oihT#{B4HCf<_PB|GE;eG z+C(JgZoc~E7YTX+P`C;CS-u_!xEqU!L*~${`TPq&opW~~@6ed0Ir2QS^Smy4@1!R$ zl#z5i_oLQTZsTXt>yNZ50pu^Si9Z#39q~2@{C8UiOC~o%=5`x04TH!5NwH~uPY5s4 zh@6z`MCL<UGpSQ;tqR2&pLL(+_{28LK0~7}qZ5y~$F{Qx*|iK<liVGA_rs6gC%PD3 zC+z}WqxkP$kv`say}j-x7Z>NLQnJ__f=I_~_~x7E#pC9ik=)p$gLkpLdzK~~c|(hH z&{G41teicY?W(4x^pu&VU=m-x3Y2ovr6x`#-7_Bkk%33t9GDbM@F@v#$~y4lf*Sn4 zRNZTn9Y>PpcLF3p5M;A^W>+hdNiX&Nzm&|@v^zV~(`@2K-1PfDehS^nsydY!;o<)H zB|IV{FK3n?XLDUDJe4*2LY{HfckPUdHB27L=6qE@N?E2`7t28B_pC}NCg+^F77`_O zPYx^3Z}BRkhR-Bq%)^w;%LD2pkoSMQ>s@Mn#cwG5>OyuUbcWKTkkLn5A^cw7eC7Q} zgR7JsaKIHhg4p)D4RJMEkI2YfG&GzvyMl(E99@S|h1a%10hd#tk{}0|{oOU6TALt@ zZGE5+@$QK4fB5)Jdd)ku&2W3kfyO9hAmtEf`}WQ6zy8_HmvPnHztU15eL&vASk7}? zQ6ks~v14J9E)Ga)>@gbU4^@bRoq5NnMCtd8xw@s!6q+x{$0O%$UZZ@10?(RYJJoVm zQt37wZ|$Oy1DOHVPA4t9aTAFvHJP<3M&Do@;P~fVTSBu&%JHBARSKt~kPYP`gaIR7 z?KRAv2r)Q5n}-xaEAL6AtWkn1n$Z9=zQwEZk=;j}2P)B>-fculOu6haJ6rR|7;v|v zsKsjf5%DliZE*2XpxVv+3cMYA5mJ=Izg3`{pGIZ_$<_|kG3fI3?I_XlIQ95u<ehww zna8#fBKxD~qs>w5<`I@%;m2pYutbXtF$|g~a{giu&(fhBl0fqpr}zx+mK3xri3Da1 z)908W$;v`P9Ac8kb^5*0M5EU~|N8#jn=bhJZtIVG|1igrSRgbuU!a<zTGa{j?&uBM zb*dQzTFStu6en-%Og2Ds>mhgiguf1hSV<x3R)}5Z&Fy)kKw8&}TYHUmjcVR+!$1+7 zx1tN-@sD}?g-@L3Vi>}oLIu&hVMbi?gN9R>@xn`^5y#(#m63pG`+Qo$ISzXW5}>5a zQx{8v`Vas~+E4c)f00v4-2w;`s=jOQ3gLr|B8+wMKx34tzN`g2V7wRrf2rw13`ppy zd{INDt0u31UPv#mAe-@aH5jxdjzZ~^sd{$}V87t$8Y*Qs5`44a#ODyAXo}P4k3EU> zL8w@zqkWOq^Y8Aq|6cz=NCxfT23T<N>>%gVBBxV2Z}x7pPc*i@IJzy(e4gnz+|HSx zlAREoH6X9bQcD$^HRu5hy7mJbA4Vym%sQQ_&_mD=373Yp$~0?%g$pWSFAfkRVxr>) zC}$`c%fX-j@)uGyg5Dv{2w2>0puQGN`aCz}MKb(Uvch<!L$igRjV|axoXpE?8177b zDfm2fIH~5hc}?Ra>trGjFvM(1q{XR^Ewt`1afryz?Az!yXVz6P2f)R>eRtQ)RYY{F z!0gbpH_$Vkc3CyG%W)S92(quxG1qv?#T}10RS{&}5U@oIR%!oHTU`Srr5F>anjDN- zRRbg?pk}y*f(t4-hr-)VR>;y|fD%{qXjSv!U;U#+5@+6y*JvMwO#pPH)~lKinyRqC z%8Q~|zL1?3TWv_eX&4bDT}g8TLo`{k$xAj|%Gk)UwrJaGTJRvB7HPW4o&T}WWdSRO zzL{<=M^_hI-oYH`1?L&vQP1^guWi^?j3dfZ^Ktq@#k%_5_PkRc!TtBY{YUw<nF-v@ zB0bdpZG+0>j1j2w;*|^Dt&&j>LAe8-T)DGDzN6o(*P`XL>mQ2@v-UE=h0Z}D3&L#@ z$CfE7$cZK84Kp=wWuVK;{Fg(Ywqu^AyP^Qh+BUzIFwZ}b%oR<!0M0mFTCg>Lx345) zF8>1Sw$V3lem|or6fk=`TspXF2nqTWsekv0@;s$H5#wnGeWF)Q0I5X!%!+r$5bV}A z8^UweL$PmW2bUhY$YBNseeOx0I!<jKqu@>jC|wCg<z<i6w3~j|%wt{xx2csJZ3;N` zi<5g|6{{$<2}}zzv;)yTB>3U!>tYNVe|-M>^6&3l1Rim{?c_|h4BORvt!SFxpUnH< zJAo??l<|c6iP-#Gz$>h6pZuAd-~kmjFlN_6F*o`GI0gEv(rvqI*Z{jFat$CzrI|^g zFSU126u{EI7B{OMVoa$r!7*ew`^ny93K?)b?NF;uZCW#RWN>e-)33AXf{lp4t@6%p zvCfMgS^4hM^ACbK11+pIC+pQKcQLbC0{o;Z_igq!TWo=%6Wb<zX{U6KJsP5jOVi2C z;1Wj~ROCElH*~>+ycq<uFw8hiRvp8OHa6gC@rZ!BbiS$N(QODqS;JDB3q%D48#vEB zyHR_+ESf;%&W(YamXZ%qXfx)fiu7FA=?L1wUz79EI?{{hvcTT<uJH^~munQ^nu^kR zKcVvNH*fy_(=WfuxB=^Q9&Li8kdQ1DgB{8|WCN)*?Gp#bXES?TjBG}%nUd62z5Zuc zne7zUupJNfMp#q?KrK3(Mvn`FtogJ(?P@#v0v+?VLJJoq-}pQF<jdVO#+fNdFWEee zzWMscbp&#Q%FflE(QuqMvKvOuYnF6O!NlBSwI_kun4E4sRNgxSpGKg8%JKkUY|?re z#J-b;C#NKoh<KiM-OJyI6(q>tCINA0?Tf29EwkhL6fg}zB9>K>rE2Q<^u>D)^T7Fl zn6~E5^UKRG-Obe4S!cfx9|x#31hwY##_d-auKgcpYC3-X^Pha?h+BdiPy6$2F>IrV zro=Z_xZy`;C}18e<GUX_?Te6tslf?IhnRqU4nlCY*WxfRqG2{<>2!8WSWf?AcP@lL z9%qvP06+jqL_t(7Tj$(XMVwZ$*uZrj&}-EGNzI|EizLVa6SdwHfD&e3pqL;ZiA!R# z7g4L~V6HVgm<J!%C+rIx5JK7=A9a>IIDwcFd56l$!aoeH`z<rHtm+0(59%UJoou`1 zox9?Y=^8tQ+ehZ2<e5lG1C$Ij_vIDu-S+lvg85#AW{H^M+A=OzRmE!cH~RH~B!6U) zA_EyzM4?fr&cD;7a9!HciicPmL+Y&8j3I6~8w8g0i{kvtozJ|h*M$2iA`#>1ETmJ1 zm(M*o(>U*5YEa452<K-_Kvy#Jt>&_7p<akAxY%pzgVw@`n9*ESb}q=yiPa+WQOB?~ zZOPD;Z=<6IXsT+}$Z)m^Lb>3xsrN;O288?bW+Rtd2BD_$WLVW%IJ3um)s<mAy@;}3 z4`k|4&bH-M1vMY$;*4j%?`yrsGkFQV<{BDsE`JTX8a?aqfA_sF8%e|u%z;~0Xr^N) zU};^KHQ0p9PeHh|3aw%!aOtr9ItQVBJcw)L*x$p3`nx!)%RHK=ysb}y{jNbJb{N(Z zc}3bk>2g)TgpJK~;$pp<oil>lkOEaYbe@?(bcVQ>YWto@Z@NmY+&U-L-^82`kj?_i zZ3tjjxGCokub#c0&r7mL%xGd1rNgqrZd6O(joFA*iHkJez0vwDQVj1tQOg1|?JFjw zR3gXf<+J<d@w$o<+`wfDMB#~N7?ip#`2E}8&yvW3_1Ns!@Wd&LNr|ss5F8fk-571d z>16_6zIdNZrh_Cqq!lg`*YOg7LNE?hVX>P&nGIbH*TBb_4kd&iK7A-~@TA?;`TmCw zH=|#l*q2)8YmL~W2~c9CtvS?J7woy8%T8IT=-lbi{G5+WrzkA8rq02Kw|hy`CvWS< z&6;t>+Z7kF#=IGJVIU7#oZ=}QP$%)p$c)EWcX&3z6`w{kvNK1PcSOUAgtXvH12-3D zXn(-y{&v&~CyRY-$0Ukq0AN6$zl2ozPTX4_;3(Jz6~B^gAX|J(SrVz>a3<4hI?@Ua zVxJz%ee?ERf_Htmp`uxPa@2Ma7+!pE`tac$$VvyXei>?X`$jYr$I*`RGTeQw$6l?K zMQ-fPq^V6E9bR+X0}gKI7R~_Zz^dX#L32#?LGeg%-$<h%&(rH^NApaXk_R=KM*c>r zrF$&8m7}xPCaL&l93nY1pRAwg@1H(-b4RMiKZ@{e!<n0X+O8J5_6wIz*kuYQb;CTP z=r(Je(`V~~b#q~cvEz(81B$Ax(?MapJy~_9(<M#KoqLBcW>(B$@JKM&EWE-L7Ku6H z5n{7u$8E!VPrLNRZHMH_HK_5h%>jkZLAK!bxBvLJ#_2j$L61PK7}1J-rc)ous3Xm; z-ff(Dx1pxS6lCWs1BMe@-QELh>`+_W?|gIcP|D6k!>-~Q1|YJm;WL$|T42(!*<#js z(%1hvk!Lp$I!dwdb1_QIr`HB)`1%>hnH|Sy$|>VMg&j5))z1&|^3EgSCI~}`<4m)# z5%RW%sALb}c%CZDGOlp!ObA;IaYo2z4$DV%uiSjfVqj<dOHlqC&VUcwsB&1-a5Aid z?!;3hfm#=JBl$7Ok~l0Nu^<cmH3c?9&!KbcqjyxkdEyKh5)FX2CbsXAEGqKOR*>vN z=npcz#7``<aK>0PIn;VxY2Hs(1ijZN-M>D&nG``Jx*t3KKm5>FX}-><=d?2p<hvOm z4ozBL|4a&id5Vs+YGx^E-#j39Ps?&nsz~ooImEH%;n8sYLE_oML=(P9=ZKo!dB#Q{ z`<16(8zgLON3mcgJGL9Pkue`<GZ8`&Y1Bs$2JyT#Lo?R~%lYDj8U|2=wk~sd(=4%J zNNODRsZushI3ZbdSOk$~1gbb}J`wn21cDe1EeLzY?oN)YMGs_a88|W!;8<~kuYuH( zV)NoZCR`^_6}!EA^ZPPgo=P6`Z*>orLT||q;}esps8n8v3uOhFco)_BrWe1$IK;(n zDM_1YTjMyEARe2xTC1q8w~)W<tC5!OQzrM+6#w0P(xJ`s?mzzYlbyAi0oJ?*#)I$) z`hX^ThZ!ZH$vV!<4^6=k(AhvZpCuCwft03Laj;C3+!BYJ&c#hMvcl}3gv4v8#3f2> zUHm&&pG2i~0P5;0-xzMvU9cu@;WCEwM4xe%lp!QtY7l_RE1h138IbPcKORfR^GoM0 z#dNE+@80#a)ND12J!TDHfP(YM4c&~xG0M8M_2J395k+<eugx`F86d>q7DE-wr1Neu za2~nXf>}9#2(fjfY^w=d(ZMGPDQ3{UJCT-;2+98S6I&yJ!@{BNNm+4Ln?ameoGg9u z^!zg2R$z~kTNuQ0u)nyq4c@GLnUuZNVFi(2JBFezC)gG~q$xZ`>nKfNnRkH^L(Kex z8P+;YA=K1CXSiB6DztWP;p<;6N;Ub~1IPg*Dgp_j&fcxnLmTJW`<@IaJZ47UEG<Lz zMZ=7IX&u%K^}`LfPSAtov<V07iN?I3>E8CHe<VH`HnR-5|80}9d^#7`w$_cxgpIbK z#fQ>bHpl7uc;{_t4Nz{)I}yx2@jSlqJV#Wino29lbp6z<5C5PF&w6BcCo<LyYk<w` z%`!bO(X}yQm$0SI`Zb<KT@=yny&BxAIi}a6%a+av$Mbr8W-2?U+KM;JF7H+%StzzL zbNKPjYux}^;In|8`Kxdm@-#Y$)5iA_b{-=Dxeu;P6TI^=@Xd0R*&|MkDYb^sl28?j zdFS{$Xc*SM-*p(!wI@THzUuwc->=QwNAr7LxuISv{q)(*WJO78JjDcgQuzdBj94q_ zK9V@M*sVd?aA)_Aj=?Un&>!r*@DjT&R;`=OHt}GyqP#$fgNZ-r1CPHEl_+MYD~v4D zs%R?l*hb!zbKWJr1{wG8*rmf$BuS5uD`PnO+MbSRv0EPsKXe8yOisFzpskIakoW~F zr&aZ2<cH9Q$eb$JsNS+5;wV#X2%9))pY`-UWJxcSx5)0X@0VrFFl@p#1<O{r%s#v4 zcOxt7*f4b$!jpZ%MML;5D4P;M^Yx1Xl}m(m=37bZCMYw5RDb5!z=n9%;Fk<ki>x$z zhF(Md`Zn0iPS-mRNP3@*7Dr15_wqGuRhHC}J~@LU`%FV6Poc3sxQ@4yKx)9Qd2m39 zz$<SAx#^+7j;)$%&B9j!`3ahYbPU|$!9Tf={n_R4oV%y@10#OyAPRz;V*YLVEQ(TB z1mbWP|LZ=?7?^ApslRsp*Cm@S%-Y128H>ZGwh?Oh&E|>e3{B_nv>;yVo5!|;k^2ub zAkvwwu=9mtjo$(Ar;`y+mcs%mO>3kz=^A#f?nab#7L?_eWiGW7p{WM>ZIj<_^%<)| zIT%k{h8M}*#L|r*S!O3IsVtmla7_=1uB08hTe~?P={P;X8lEI29(XnBQYTaDp=nEP z{%5ZJX&6D_`A-{7HbiZ;Jl&C@2vD)qdt$?RiFi6%*Lw5&Zvx3!fttWp^KRLI!7^GW z)~Y0}BJz0yd7L*XQDrI+4E((-1#Aa0j~R-UfQ+2Yu{B8C&DqsD6^n9Q3Z8B2-RNs_ zUjUg0Ju2K3DvBgtWv}*8&@}-4Lm6Fa72uF*P?RUBRCwbVv(Bm-wo1i*fbDY@`LRh^ z)?J!N<b$Rmi%(CtM-Vu}`1sL%&aOL#DA_Y~vzVSuXnN6o{8HN<9SHu7V8J8TAy<8a zMARLYbQhZSjPP0=+DvdtrRlaclv3l+d_$60(&t(VD1}G{ydeQR6lMw=Ji12Tf^yew ziZE8q5_1yXW0#*<;7U6U1WM4PW*ai5n$Q>DdB4Dw;&MM&^~gpU-xJcbpposU6g_|5 zayH~jYJy?bOPYP@?2nHwm6z1epr@ePu&o>WH(DieP_AJkNOHjpr-t6#M}>TfB-b}l zQ@@FLbJ(lGAtX~mp)Cv&t2AoQ*83uBXg8evyW+=(gH6Or(;|(f+zn}}+4~iehYbI) zKSXqL{g8s`V=9W|k#JQRmuX6iwo_dFvZsO=Mbu{1{u>q?6qj=+7fy$2HHrSw&A#pi z*&U;wC4)Tkg>im4?_|nPb)pjyi-}`Z;Y77eF;lCtPg`*D@Hee{!3#9_Xv-!@Bp;FJ z7Xi*n;y=H0$1i{S)r;G<wpaL(ciJ#QGIxmr{V+OWfJOo(J%3&x#A!Gmu8TwU80?aj zuDnZks#RI<<~=Ip+>~h+qPb0jDMzUqb4StgWZpCBnFR<ttP$z*U5<&^l4JHc3;2(< zbP(eW+m3F{;4mmZhM)*Dppj{e)rshMQ}`nCEEXzEOdl7P9KD9rIi4gTgu%x&K94V? zuGchieZ1=_sAU>qLmi!{hSVzmJRsMB>=yBeW^M??b1z}*hNYsBiKDUV?9Kk)xt=jA zEC?~D3$|LJ#5T&h&(7_7*PBOPx*)B#0B|z;ln1iUEM&U9wjDH`eCahQJGo1fotR^n z3q$*<X=z?g89_)RfJg=2{0~o_gZSiubuLW7#nxIr6xQT`>a_01`0YRc`rrP~{|hUi ziEatLr*D|WRyTm6pq0XQ_x)Bi*~)Yyiqu0B&p9~cF0Hu!Y!)j;HXf)>hs|W|*R^ij z&NYnJ$h<89u?<PG0}zVslt8N*_3-9(#*wFdtsF{KAQ}7@W+gjyotiYvmQpo+=+-~Q zZ49{mQZQ2hyBOWDzd1Al%xyR1aG@XopgW=-914RBe!2A+)oE-EJhoI|$^NxXF1i8; zSuNTtXtK!&k2zx9V~&nA6Fz)xT2M#`?t-lAI*Y|MBa55do2)4g8Iz`d(=SM<?4de| zYG6Hd9yS{Au1^@cmgt7>al%oPsa8iir(hW7O;P}K6@pNO$m|H8nk;2xZ)!j6pUsub z8Tn&k$~f6`OH2@YZ0f`Nw<5L$gkd0yGVnhg)?Il-43mP-BW9?+L1-meo`cG3>#Hcw zvkvDyFbrFrYlJ(egd}%wjs@gNj9cMJtp-Urv+TB5eeqVAU%viSQTCaFKClcM?~2lk zmCIiX=@9QMB%uj!6vnMksF(fYewgHBDiE3tAR9;@?R2;dg<rw7JXJpxav?dS!Qb39 zW*Isrg~YZZ1s{)M-9;ISYOZzTNIdHf1z{!LtlT?b7{~Vb7cd-(>a4Vsdg|DBJnYEp z1vS|?%C=BA0$Vp;*bUc!AwG>Vjn$zg^dNE5Y>@&R=U^Pk1$mIzvWulns!~?+^^C5F zGMCrHryxHwvPnt=xoi`-;jhnamqz}dJ%hS_M4gNC#YqEzNi{Y(q>;impcJ=Lv@$k? zFxQ3dWqreffaHR&wJ6btgxs3WojN~eCdY;r3!#lEw;b8SO?Pt84T50=|AJssCz-Kf zEfdtYLI3-2zy0g~_P-O2iU=n@-~5pp1wKq$?w36F7N8}WMt-#x+h^RqRfe>=PtA53 z?jEMOs<>H0xT!}Y$ng)!)-gNjUX#c24ob!e!Dh|)vX=c>KHW0QrqAiWUg~LUhHOOo z!TS;jw0-psXPh$edbq5>k(4zYVWlBLXXyL{_vZ4(PTC2qM~XoVnZhRzG$>9Y2(~^+ z5{L+zDevJxg~Xf)yWBB>o$+17q@OsbH{IOfVj?{0*zEf{ZM}yO7-+q&lwOnTTR2?N z>gzAa{}!SdC;h3sYqpNJRhT^=tb$%AC<>KdIy*2UU+v@3d7_)qkbXbfaxb-N6<`vh zzlQXU`8jJvKJxBXEQ4B@G(6iz8$I?|WVGpqTZ)f#_A74T{Ov#gJuvB)f=Tz?;37Of z_0)sO3;I~KU0MlFdNxud=r|Ki3*kZ()<}Af#67ZbBi3vPLXO;&!p@FTr(A;7px8m6 z1FqkNBukS2B#t$JXiKq&9RbMyqm0dEkSvF|e1O`&)VJ-c{OA{xbMXdLCm)0|4i2-Z z9I^n;ToPX(@u4Ul$#=Zd*#Swc9mQJJb@n8n(f}w8DHbkF-2ho)QLZ$e2BgLkCfz(b zK0`dbK4yR4+15)m8RvMVP%p1+!yH**FheyRDd}8@hBg<jgFt<NuaG2^l?-Repc!y^ z=?H6ic`);~?rJk1H7=y%BXzjzM##PJ#mO&TzQrLZ-+RN4Yp$lMv7#M5qUyUBT~d1f zYzbt5Az?7zx_lmFqL9nI*{(jQ&w~|?=g;51d-wCtuTN_wY2j&=-+oi&P&o_5P${Vj z9oWck5`AHmKgxjmD@QpU`Rq-wFEXoga9LTi9JV(sYFt<^XDd8p<f%VQzV1LPBJ$$H zscFlob7c^Vi9HFNVRttxDLFRW**>dn3v63wq3r0ly1CGfy?ZF%?mXAq^04vq^myu; zFSFZIY~0uIh{wQ{v`fkYy{89ENhoehN-HEkI^ThvpXsYytNWakJ)AOP=Jo<WN~Xqi z4<B<$;?K=q%Xgv#Lj)(fj<P<Mis`+74?FDT8F!ccQ_qauFl4ud5}8<0*c&!%+WSw0 znR$-em`X}C?)&PcH_g;0DRA;yx(x6>*Y|dk0a)Pb@I0#<v?8%SW=vv-L}j67%8iAN zFICx@53}C4PI&el#wYW}VWiWJBDeyg70x)Uc|AOjCsM~gsU4iPkX;iy>EAHWh9XFF z)*a(WSn54JyoLbTh;M+LI+qtT++!+Zc^P3zGhQKE@|xwBXBCo%Tdvq0ghGnShldfA zpWmn>1}K?Q@RbOJQ)r8=z0G3t^l!BjNoX;HN$E~B+EFoX&V(Ap753AX-%>_{=XHm{ zYbFsdrHE6kjmXX1s<EM|_N&|>%iGnq%ORcevenRHiqphkC^i;7Zv49;Auz|P3@-Rf zk%b4se~5OJ61c?5EvoI=!a%bg!Ju&cT^nul@*|j0p~z^A{N?l3mYG7N>|8Ts#m{1? zc3Vz)D4U_xD}BhySZ$L`OnIZ(aQW&kpLC_|fCA^&Bfg~PhR~-ems;p`03lW3;!BEC zzP^7cf3so4T+b|ic{yd3Zw%8daZ@g~XW_WbXvPUIx9Alt?kQDh2f@7i%%f3*m#Z+V z_WAQ)fBp5%n>UiBJ`!Nx8QFi^Bk^_c<LlQS-n~g!{(fv{W`&{=4Z57LaVbniM4gi> z4r_3;0Ukvs0!dmEOD6B%ebgl80le%WfjH}OBT&<}C5QeYVo9%1it}!x+<Mf#LL}*W zjNu{~HZxxCJ$<rx<Afs-X2uN+vNqpE<5B(OmxCC6jSEa?@knRr!YKLac$cqBB3uIV zSQ)Q32SlMIIn`gNGDT6sfj;d%jF6R5w!(xb-Tx%k!ylYuwk^wzSV=xu9+8yME5013 zN?V^>iE0@t|LKayeAitRjMLZ>S!}_I%}u2Xh1u+uN}CkeFwlxhmWK7x>5`(M?{<;` zG!QG(ynf{Z-FH70*;{uSZPk2=uI;+k>C$(X-D6^_n?D}F_F4-K>pVjXOeuETlPN&! zEb6kr4EWVc4Sm69UK^|gJ|=qKLNN?0&)Ol(`9+-lnJ)IK!aO(S@un9@GDu{PfuVc> zgpzF+T``|+^Qk}hou6qu%DO`gwuq6?1<8fYaZw0#G7K1s)&U(}E#^=uoDR#~B5KB8 zSVpy`g{WQj5nnhGTgli=zfP$gRwF{aq4?YBX=H7hB<uE1`~yTaGfOhkZ)-=ZoPePW z2NUcaLHOvV9qgP{{TZQnU>6%sjX@>fvoj0T^$V){4{L-p<J81bn+U99nyuatqOZ-f zcn7=1bi-S`$1{UX74)u;e|+=1@3*<>vl!WwQ?PaS187pME$3#2+m=ZhRQ58?$x2Ge zq9x7s-mG4FWcK#JmMxD{M<G*^751klX~j|Re70-Pp+Yjjrs?zb9VHPV7#?tuu?(wz zc>ksVTP8`ywxbubx}pvruAbs7a%^W1b`JLEkKG=m$PGV#|LyOyT@e86mHWrupv<GW zgzUg|ujdU@U5SMnYm&snC=vF5AJH?Ehi=%xy3o6KZ#iV3JA;0lHVTk#?<oqRvwTGg zk4M-DF6vm6?Z{aqWKC_jJS9`6Yo0S7fx;#a<tn_~g;blK&w>O)Oi5wYZ%Z`fx4#Gc zd^)7#_!O_>Qw-q`95x(^Pg;|mP1y0)!R&R#m~ayMDMZRa5GZ__8SO^BF%)?!`hq!j zjsUb03U}k|aLk>N8}IH8hzO?Z(K=dakWBXQP|f?yo<aiq79TD4VXyP>FN3kB&)Jx4 zw|ry6WoY9+y_VNlAwy<DmC@u^1ieUBFxxM>=hJlAL`ETS75A@Gw9L+@J5=FV{upPK zc|?=IZ!AHO7q8z2r3ger$b<9vXb1+f+c2+o;CWCx(&d8ZFH7IH;%!TpPe>>jLrfA@ z?#R0j5v8A=)vEjL7H0(K%4pTLR+~s44hOIBv=8g!L8HQ~GZ-|7|IA1|jSf7co#+`W z&JO+YL~bB{gQ5}vz!C7Cb=Ox)GnoIE|Mq|U^?&`pjlvr4goC&TF-a(juVNK*<+z=t zvUyt;ZksMe*Iul$b`Lk6^%^st`BIR_v+FpsSUPTl){)l20DwzRmF%n`#isZi<!++k znwLor(k9oyX#4U9>(V8ev-u(M*-O)y8Ic6HP6xDLEaqpIZ)(amjEGRVCaydFRN@OE zAo7ZuUe2^x)U^%uqf@7~t;XFX)>M*NI7>g&T8Z@vV(rLjAaqxUw_|74u1^ex(d+We zT?UBR%2_C^4txMfU%iRGepi^*li$QqD-20*Lb}^<&6cTvg@&fCP-WyqXP3HB%+orv z5Sgve7b=c?wqtEy5DOSL^&`Su2N`h}=;}F!kz|L!l?-io4AY2T8e?xQ$unIEo>|i* z-iu{q%5VSX*X&y%g^Pp$X<ABR_YB*+?!-Rf&1!comm;{Y@=>c{7@8%Wp80^>N{hNS zG@<D5u@)K4QrIl-$d+#!Ikel4|CP=)nqq?B7DM8*k@g6ZUJB@p^uUbOBN@eehC0sn z$Fo8W`;JKwb6eVF4&+t0eXB{kn6K`zoq|3`Sgk+%v^c+}zZ`+fVv9-5m@bA8FL2|Z zn0q_(Ezm6&!^VmD%xrZJ+AFGoVDYNLdE9A1vDK2v%b$MO7vCSw#X2MjO4KY<K-IWN zHwgOFmzpJYhRfx6TSo}e)jbUWX`t)vl{>01oVU+T_S50b-~aZ@uYcjzdAYuAe&sXi zk05!NmqsgU3?`cTdA$9$(=pTC7*pKVhpra!7>b9%aJ;RClESdbF!n1clXkv!{#+b( zH%nfgr?SF)ROIx+yMYPbP6u!P*Z@5rX}09WR8V%KL}3hjwxxCDU%y(}^D?5A5El<9 zf#ExyPIH1Um^BPt3C;JrH4#<Ai5#H`Nt>cTcjIx^MErow2({PuON8P|xmsoQ->G(= zll(Zn3;p!P^h7LWH~5_ihm*hJzLGDU<-0j6<_h*PN1Qi`0b(X8D^5HS&IaZ7KmGY% zTwmo7a@h!_Dh&_&gsvb-3}1G7`L$QXN3ty=9Fpv|1jPb%w@vl57`Fo2TYg*mF8R1A za9a2Hj6>F+-UWW!20v)w8BeP*-rSG}@lm9o89eyo)en6mA;*Dds&=fj7aNO{n<0O1 z>gN3}q|p9!#LB*s@l0hK8|%z`BTAgUM6gA@VzgT@`Z}5(V!*x6u8tZ2jE5}_c;tF& zXYD+04QrF2bcnUBK%{ntZ}jb3$3&dZB+q|C!4sh~)Ml4@wYlf!)N@bjT_~5S#WMy5 zo}`>aCuc?i6-q>;;f!4I<bxb;e(_@i6=PN2pb{O;GYN4aX7+5KL#Amp8`71!01iO* z+TVuH$oejhd*jC@dMR9<1wrQ-hV{L#U%HWbc)0kngn}{{HadUZ0u&4Zg7>-C`(+SF zqT}jB<F8POm;nc!LyhM6>|MlcoQS8qEZr0(r(3OU32aES_57i_@7}rAG&zGqUKk#o zt+{{}YIqkn%#xC?E$tS>^kO$ZLF|sYOWKY7wxwM+u@q03<ds&;dZEm4rLDHMP_YEN z&d$<@U_*>aQZ<f$z#UxznuIh`e$v$+=M&`fFaPpio>YiSlRQRi2FD1~Ya<1=7u7Q= zl)feWp;Ee0?sHvz-Vs+l43+6-5Vi_I^RIk_IYjCh!t_?UapEZ4xM!$*mr0I`uDCys z6n5~{{P9_?*U>RyQffQ>tVL}%YO>R_=9_t{Ms3mt4%4?jrKiwDF?gN<#tN`Apz=D! zqA>&7GR8)lJ2OcoOAmQ14l(ahr3Q?7LoTUsCu(3Nems1d1J5>V$vEY^t_A}znr08I z5P8j-h>(>zHrPLT&~Zbuw~<*jIog4FM4E<-k;O8lQRlu1qwq+u*~`uY(yAD~yR^G= zopdF$Tg`2;-NH^f7lZ>wkD_&+?j=KosBK#Jsg)P_D_qQ0T=R|be8f|@R@DjETIR&2 zl4)xTRqpd6@sx>O@}HxdqG-27l#5%cjX1@2|LAn2Q8wg~5fpnukSyH>8^5ea15z_- z?H}9XCB=cn-`0iO^(<7HfMq=J9c1|T6*E8m)Q#vDzv<KZMmb5#=^S3Z&{&nl6venG z)P?7r0*C-2nLrid0SYub7S@H#rJEc|{imu6_X0QXe0kniSN-uW&qzIE<OXH8dOf0{ zfxTibkU@-W_`s9#hF8^^HtXLQ0d4bN+sL2@$vWEZd&v>Dqz7{Bw8ZU7a0`FdEMDvM zKmMeuAqLZX;SYH344Dx~L4zFAgq<n;3uh+6q}Xcm)&7}Ti6ftQwohb2i%W-<1Z}Sb znLX><>+Pzbpv2~aTW(%Z)~<|^At9gc6L%aP7js`5InyiWDjTARfmf@jQriyI&U#nC zgF)I~Yrz;Dy-$>?H1o+Cl&Wyb&eSXulVj`uli{sjoX~jtQ3aVNHPg2(Uw^|k`6)0? zjV=VU1C2<LQh5ivB7XA5VO*FtR^Nm*7&sd0xE<$(Uu4*x6(CKibS@+ud2h#0fvUV8 z`K3IIAQ5$<PL=lEK98)Cq?-FOfa!yeSoXDA8j6Z+wbez_pbLZZbuqdaK7H*MU;(kU z_TZlbEQh52l}d@2d0R{G9*y&b(&VoD9E;Qu4_`WmSV*kTPVb>ATwC=;*4m+QB1Ie~ zWkHx<s%rL%Ljq>EZ$d*DeN6!Qw1=xTCXdW918LJ_ooQ_+BZb1|oMRkn{{&tgN5jJ) z+^tFzFbKMs@!u(qRH4nh6Dtf#%);K@CN3jp6pYvDilz2>ki`P9^kqLc=War5r(F4X z%(JzM4p!qBCv+0-&P}Uw$NRG%-u(8~-Ha`mlL9(^FrTJ4bht}L?Bt6-iF2r{hkkvZ z1VF*Y{A_q%<q|>Wu@(7eFgs!0B>~AdCp>7pLUJ;Jz^f&#P0}?;NsS&JU4vaFec5_7 z>c{DZ?tRdcsZ`ity#+Emj>A(`m4QkVZ}#sQA8r$Z$PdjydaMG)r*S!!w|_SXLAJae z^C!0AQs>GiL#*M#JC#zZj@pg-ju`<7K~XL%Z3=d{n0G^SbxVcV!dmkH<`cKnx(YP& zL0)dvh3-Pe(tW1yhBG3NKjzxxYHDZ{IzeuuM3=CN)*`SF;hu9Onme?EoQ0hL;ntWx zQ`Te%rCnI|zR^f)wP=`wjI7yYVdp-e%uX&cg-?C5{szk!F30c2K6kZ(h#R5dTObtL zwxRc5k3x_=Ggmt_@_1;|KmxQa^6gTq8(#5JoatH~%?oqQquYn9h7G#4#bCCg`-YYf zUeu~&Zv+!d0`d;Aog$5_e|+{z=k&FVIA5JT$Xar&%eA4=j6yjrsPT-IW47Asn0(bJ z-6o|f#2T`)7He2L+u22x!g-)9!4xLxYC)XcN^R0fwpk&Dnw)SY7vQU!K9%s7<+4u7 z0|n}Qs+DY5X7cL=y)iNOg46#K_2|FDN$zR4^M;m*3djSEK4A`_Y0H;5`>)M3!%&>G z;1izAWtrQHyW39U6?W`4vlQ&qc3lIqa%c><VW^4ICa2vAouw0ia2qQB&(8MA)B@Y~ zm6Bd(x$`YrghIx+wp=gTu=*C&s)st*nTj`^yElFBo3s3zwuPuV1{u5)S{}EJb3P(y zDEzmj(zbeqz%%`Ew<qR!Nzf1|Z~;C%mrTk(ZXd&M9kI^Xh&!Qmf1z%_lFV*5gJ5?% z1VXD;cMgrx7Gpn|f4qP5`;JO(=VlGD&|Uy)Qf|x&Ij)8sbyzFe1A0V{B5CeK8kDwT zbAI7?9;ky&^%Cr^ayVjZ=n)8ZOj^=SHkNJKz55HPo|zCJwl7m;bh4Hl=hSO4Ll@W% zJMD<=Zs&ADV2dHCNh~tbW_S38p}Vx2Hk~dbNS(rE9hxpYwRdDb0!}M1X1E~hR6x?@ ztfRc?%(^{EK+bh(!5<yYVW~+#BTcc69$STTLn}Ep2UDk`$`Oe2*cEfCvRT_1fwQOV zSs(Z9+-J-ems)M&vGuytJf4OBSOq!ZU!T+872$(*f{0P$oxOE~C;A|o-%w${POl!Q zCRq9GJ=0A)0+@&eQ+8>6E7ZNt$o8aHYQi(~(J>TQc)CoX{kEIfHlkX!D3YijmaSq@ z68~?aVR5L+rxv5M`&C3WW-#XWUQ%+ezpgy{F4i%mY<aoJc?3p=>L!MbiydG;cg(ns zfw_R1f8vy0wAifh;k21qpay0NYM9n@X$lt)W!1u>onk{F*>iLqM`d=P0B&`dETFAS zjFq!aO>8U|{_Xu!q{T3&H7q@JA*l%kF*ENl6sW#sH4cEvCR?d<I1}|Lb&)a5chVNO zr)_dCuwxuzKOqiPtvPS54`_(CrO{?8fgCSyd_%4JN*={CY=yC_r(=OZH2+{V&R2S2 zP}oPKOblpcXJ)(Htxg2Z{#}@Xu6c$A{AI_X+k%Wn_-b~1*ox7Nt7)}9PlK_2@DxZ+ zJ5a^x5c*sm5HNW=n1$IG>VM@)e*MzZ-!}_v?SuyIzmb42_fS!uYCc`sWTyh4_fL9D zXuCM$8EJ8DtAG2-ATSW;iPkV0Gg5EqnvNSVtTtB!Lp#gPQQ+>?JE-&ALnOMOZ+6}* z8?nwA$~La59hh;Uf11XLH+R83dte1(lnZ!(zJJ+;apka1EE(oCT|Aido^kah60d*$ z`DNcBPWdU&Yx9hYy&+CAQhr<V%IQrLp0=e@0aNgVRr%v{--|sw-wLPEdJ&fgz6_8Z z^60Fy%-Z_wtM1|Bxu@ws=-Dufv*x)ZLCc{Fh)|vGSRtXRCiH<T%U*4AAHk&gwzb;0 zmx42EE%tVi%sLJPxjwQ=9E7Exx(an2Qm4?r*4xK9i#)isbFvEXU4~`eq{N^eoWNNC zlc{xyxR6pGA6wx1Cp<QfqsrX6&qwp8IIHt*egHW#;mCYg4c+5j5oSD<^{T#<Fy<L8 z6Qw{Knioy8Ja-X81Z<0^UpR5r0W!l*JsoM1Hsf<Fc*}2wJcu6Za8S#L+h!VVs6Od^ z)Yji4*e)xzfQiVtxfn)HDDMu{H!krSQ+BIW3X;V{EYpmuGb27|is21turBQa#|?Tk zg4|+K(NLjpI|GPE0=9yxY;jwcE+7?8MrcQB2dj!Z+>Zkw8dgV~BVaG%GlJnD&@-Zs z2mVbIf*qF)3FD6}`|Ih(@w8EY*6anq2|TDz98bX`8MSZhiRDaE@Fa2m(h{D}U)}kA zOd=;OM^k*>cr-*gDdD)&N6B@`QGp$s9d&1unP}!)YF_;`@(}y3b&p@IPI4BYpe1p) zLEdzYtv1mi7arkQZJ|ff?gOv)1)Du-mA9KHJOWHX%2a-fHklG1aX{AUXvQYiJVmu# z{%RN^a|Sm6d}+GfoS<Q?_}FS^mMJCPv__N6B;3hb3d->A1hKC*XpYaN87`C2w55y| z@9K@Ra|>2QCl&!A!M5Z@zYp*K`1RL6oh=0M$zbUV>3OBOhN#t=NHW#ZJN<04L0Pji z6w+HXxSDg7eN~t8lRJepiUSmSMe90C0U;~rB32V0J*Ub?8jB38$Has$GGDB^eBV{P zDCb>pQZgL6Ur-&*`j0q!1n~$~g|==yz1pX!Pi#Z7djM-m;N_8eMv`MHKx-#l5~Rr% zV*?cXsM=C4%~CDy*{VqJ8QIf@G9e4TRhP<D;_vet{hIRC^3k^pJ3$)z$+i=axOmDG zH^0l6SOsQ%pvoz*!enLmDI4W%e=fzRy6L3J6#B=llQo<&BMT~Jm88#E@<I;PenM5M z%A^l@(>w_eho{I?jy1Gr+2gP1$wxEklzMPOybWc{W?@x0KkcV;#9QCkyu`FdzHWt3 zPodprh51*=`HWTc`yX(b;yf~ot*yn-<3DVRrTkPt_&h%*xQ*hC3JN_fV>{21{;)X; zD@84Z#q;PNCY^y2bhgDO?pxJtaVe%gzj<mU4bla5w|-qdZ61)3S{hvho{~zZVyfOq zvDnk}ELoF_;V28s5)1z}LfHf)k1I%GoSv%2xGt~3?i2e*LO+|3Z)4N1-}T~EjI(eP zFBT|<TiD4!3(fGPOHvE8vLU|tg-=T=MP^JMDLZpLStb){ep#_-OKAG3(0sYA4qKDm zEO$0JOXi>&q&i5(eE))4dug*TD^$&=DeufJxv>%u1z|$6yaO~^C&a{hUKEOqql88x z5b<EG`7QbzF1~u#{U2_hWtop3-ycKL$?YOIUc@_razBIVHUrI4MexReypsM;9_<O^ zZhL6JK|nTp=Y1L9P*Z0Js3tCMoSjmCw{pgF7MDq=q~E1swVl@}DO-0oU5xqjUlY~s zHAeuxawg|(8W5DtE{^NQJ*Sy5Fv*H-oAorjfr^{9KEYqfCA;_~Wn1=EH?npLt@;VB zSFZgap?=_h`Lg@Bf^DdqjA{2cbx;sv`c67ZTmD|asXft@XU1gJjSJGMmI~V+q~)3{ zW>B+O|L{VS2&g;9y6{aHFjK@%E9rS8s-Y{Ja0CY}5Tn+9_Jz6Ha?mCbBoe2xhMTQC zmgbwE&O7T@=}<q2)e$Q}psgL1w>{fL^H|X+Voa`Qa%D^&wu*jZ>V#uylc%!JHzQnW z@Fw&QPaLwl+o~pFa?{Mz+{R2q6(r}=C#X1NXMz`{=yL=suc1~&1%mA`3R9q<WWPvz zS!7@Erae|f<&a`KXvL~+6&OxRQ)V2<@$QpyYl1X9YZ2AW=B|WPuE9b@;dUJ*V$`_e z;BJomsNTH@QzRj6`I_mwqy*(mdzmGZ+QPSP1^(zumnmNiq;)E6;+1|kx0r%*qW(oz zzTPn0;TDHsu2rtd?B9?;Gm##BX_o5yxnNV9xZZ|TPERlVCqi@kC}pvXnI&(Kiwy?U zRhaoLp|A=C$^sdOtS4XW7<mI<gGyA3Ksarwpx?cawMxp99}g|s2jTIOF||!)$V>K4 zP>>Xqe>^>>xoGsUlQ}0CS$|e7rE~UD+*aEdd8zU+3@sHu%MJve;-n{WP#6;*iq6F; zN@cGWO8@C6Qd4o};yVokJ{>44XWAvJ0AX;q2gT9rii{6Gz4iw4CZWV;%dYr`+BDE@ z43A_~Vxl>XoTjLpT=c$7#tm5Uz0RpQJP7JMB$Kz{OJTO?H4+sWb$u?*c1;zBO-$r$ z_%eh*cB0^YYtK9cptGSZ>06qK>C&jOl+RBSle(>`IZ$zAC{wFeO%QB$z+f&M4SVEp z;ihqS%`JK~W5)Ukc0eN~<J5w$<8gk*fD48VKDQRUxvJG$<Fi&rHYdd-wBz#BA$Nzy zuH!MF<ox_geV(if-=b}z(}BLJEEIgNRbHs7iBEyWsCxT>DLgxY%qd0}QL9Nsl-rzw z(dDoKNmd~11#M?IpNw-=mC|`X^Lw5xJ_>_tODEHUP9C4oit>jC5(%`Q(p~G?ZeFZQ zZ|HqsN<^D~*h(%6(l;&%#(?*+$}n5dU!?g`?MBUto>I9T4ZTr!%6iEaP(8^q5CNby zdeN90iQN8@*JZ<|LCETC#AUZ3SqKGj!N06pkYUUXSYhkHzSV&#Qq_=Wvy(&a?7#6q z!`6k}tk#BxM!?m07XV04ulrlt3jDku>kQH`hQrj!@|0{WSpcUn0CO&Sb6)hPyTUmA zBhDXy6@^(R^3^>bi<zd<87`>SzL?tn!sdLD@y;MBzR6mUql)GMbu&)P{fHI3m?{OH zbuKRXJb-QZBmgVhC2Q8uEca7w`7x7t(vr_ZLv9cA^Pq<Kkaz&(4d$c5BaJ3IJ0CDi zY&$IZ#I2a`Zm5Z_E7_RB=R&Z&f#C-3=InzP2EVYuqyq@-HOcPeDp4M!d9#~>45J%I z=@U+?n!YPoD!(v(%uZnJ5e*)gHYK#oQtobmSMD1dG!JCG-V-5xTSM%6b@t0QzxU<L z(sh~kSud+7OWf3R(#wOn`O`;lq|PnGZ^h<@DJ8QS91VAB!DXV7!smuNR+PdZ{P6z$ zuYdlt>HomgQMY5fTR=Pp(r_skMQ+RKRdE{~`tp&te}D1)S1+=&-jBHtvm*2ROv8Bu zLHYh2a_i3P03=@~VWQ4s8ZG#wXioA91jk0ss&xtNY~KrzhcyemI*%61Sy_;?#L97~ zmGG5uX3+G<c>6xzzWwc|pZ<h${UuEnR19@9K5cWJbF^=G*cl7XV6~tW%B_Q0b{2g@ zWgcWlfB5d_KmGdl_umY5@!e0-A0r)>yR)dt*D!tk?nAFl`4VfdalVU}v-ZWAY+C<b zPARy1FOBbEZtcQh@zUQ719gvNMwTIKmJ=Q`Gew2Uh}5f6setHpyin5a=U@K({{5TU zZuWzmwNtrC$#b#JOPu}F>wmG23Cesi^N#mpje=Yd=DN*X(2YjPSuFbv{sYOxU&M<{ z<VJY6C?SivR#V3gFdB}Znl}5GY?l|9wyhKYvg(>I1<@UyDq3U1JK>ifLNd0TSkrO( z_Mxm%t+Ot5h6qNag?*EvgflGDcF>H0x%l$o2rZL%p;f4~4TgxdOR6)7w96w67!j0x z#B;qeO}mjVU9NxiGUv9r=bWhRQ=YBy4B#{oX3d%F44;uOoE8@eIZkcd9-!KbPE!xB zQG!K$9|*$Dy+T;b%v?R?L#2=J-k3#eN6_637`R^PxRV39)t&i;$|GOnNkHlYv!RSl z{R~D>@<exneVg}G^W>oA(v3O~E0H8Ee{Ow-;&7rogmwzB*<(@Doy~=%A{ETu6f2)P zY<|0&_dV~4hQV36SwvHU;LeZH1{;U<L~M5tMG=Liar#_OL6Qr#cAB!l!m<;b`wkdB z6t72AvryU!PeL9TODpimuE=0aa_5O&VCk+2t&J*feQQFtlcO!AO+6z1e;eE)vl~n5 zv5fq^@yw3_$1~B#HzgN>VM@zpF*a~ITD&rjlAKh|zbAuA(hLe&Bl%Z%i@Y@BUz2;A zo8Z>UyB%a3uPIKMh(+yrsGa3{c7liY8|}|tGl6LC<wEGCP%md?R!U66yuN!0I=n(4 zK^YtB_W$)Se}4DYOZC3DLr0#u+CnfdH`n;|xrYxhSt7RDc(#f=>#^z$RFHi6<2}F? zRCc)lalQBV-~M_*VE<~LLOJKr(j@x(AAYV|UOob5dKTt`no>`v5lkIj>#Z=`V`gK8 zqg~^TG-7)B%T-JF$}ZZj@P<Y-Ic4F9Zin^iIFoIPXfg8Rhrj>*Kl9}eIzsPT-!M>* z5W~SQ6rO!C#q@M*>KDyl+`&2Bhoy8j*9Voj5~C;=a60FV!XUapZ@rjkhckG=27|t5 z)*!r2T#mZ5yy%CV#OZ6W*!fm!*TL|<?JQz{NSaasrf`PZXhe&QT`Fy@2(ALcJ74_E z8r4qx(}&gw3+d`+6dX-CF})P=R7C}|$PZ_8&4NL&)`hE%kng^k3lkg@U18ExqeP<_ zi!~iltAqGbD#5u}1p!+~2pw-v_0Rij%gfV!R>g7H^;W<3Q*e>=O^fMBLeOwNhNDbM z0FjETwF+>BnR_7ejwS<%G3K+gVI^i|PQfEV&!Tdf)|wYK7&KYvjKBHl55AjuVXu6f zm}zRF_Jm$(Vqs9kJ{A}#)x5tcZ#Kjo$Dmb+H1P&+RmsX0PgO-Bf#OZT6{QJ!_^a-j zVuHc>x@H@zu9so76Wj)g4cnO{8vM%UaOxd>O=huCW@~7{{Hc#TOhDRJ0_YATP5ox) z>8}JwmP?IowR&2k+ZV!o*C~=Vy2`qMkHygRgF}bYgxo@W;83jaTo_mPs>fmLVrO(s z)^>e$tPWGAOSkmYPh-3V0aN=Xh=EtusfGm#-x!0ZGq5?To1!)()Xyk!*s@5TE@>(O zG5wObqg6Vzq4AFTSI>T~s^L9DUyT;JABs~jcJ+Z4ro1&9{m8_kchkMA1LSn`Qq2m_ zIkebyqV?jXq}<z`E?BclJ@z=nc)vnxf#kExttRsNq?v+eIDaPh#IZxM$W~amJ->K` zy76hjnVL8{bT*`CuTMhMB&1H?r0}0br__V<{vE2ur$RBS;9t+n`p!aH25~&0=YiL> zxmM)jv0fobxl^J;Oc>pA;;Yxcq*<d2x^~&XBVE&)rsx1GJzaq2j@<X~-T3f)D+9+T z?+}sjC`D}Mqq|mg+&48Per^?5_FT^5ZjHk9@B;EMuRE=nsTVyEX2yai47VZPj;i8n ziX>Q4R#m9d0v=^+%W8@MUZ^w3_L?cPLtTt;Xk@6pLLBeLGt4nKQB64Zwj%b&UnxY3 zpODvJiQj%nroXJAxZe!YpOUBTpN>*3-D;9EYk%}(5@#ihuFgR%Q>sS&b37Rj&V+1H zK+Q2!{xI^c+YKj|{e#7JlaCE<HOr{Mu+L3bJ}Ze~p|Mkhd|e%~K}frrY%_2gBg0nf zey-eS-YIc$0prdlKD4XL@<`c(^r}{QHaUl$ARPIzt#f4_f96&+Pn+XCbX8ylOP!)$ zQ>s#^<^s?^UqJibqxi;vo%)kQm@{BLFVuxZzEifd%&ys%^c4ssIvN=8M~%PIKmGZ? z{Ez?s|1{6OXemK;I*ZuJ3)Xfd9lFb-8!9peCUT}nm<-&}x4GrLM`R?oP2BL_rHRIv zoH0!7zFX^{QJ7X9b!ds1h|Xe8hvIcOZtziSBjGH&POk04++$+GSZY#;o03;QzWT5K z`mg`;umAPuU;Z>rTcVP>w!Z<P@M!UC4&%0L$0X1<S<N_x_dM+?J*X-SD2@5)kux;c zdZ?<;05iRV5tLzbe~Ok{o4<XjhmW{WQy7JDyj<A>-^cK3>_^#W#w%j`43St-j%+Zr z+EDsnxqxO^Nud~Ej5<H$RxR<Ypt)+HAGZ_w#JZ!<R<kWthTPGb46}MD)J=fX+kNfo zb2GS5t&?<pxHgGvD5|-lLQwfs3Wyb?Z`r&#Md>LsesKc-@>T0pHN=Pk>lm#|v;;qQ zJ)nXd!;A7(Gq#U;z-oSD+XZ6#I!gI5c&+xzp0Z5-O->5rFYYVDrYK>Zxf7G`J6U|> zAT&X;>hfr!UNaNDO@1e9DxAUOkuz^X$hs}tFQR7awH@Fj`xBKyb7o(GxH>)$eSw6* z=PBN2dIgQ9LYb_gS{92>T>Dv%4^T^o5>S0G<FD08^hvcbEJQo#jThw+h1p>p8Lv<! z)uwk8tNK$$jzwEcG<Y~skAv;$F{N27M5FdE`xqH*^k@v|JW~MRUg2ZQvjB-1wG%zR z)Dnc5#RRC00l6DizU<Kc?wQLr>+L3*vQ|8D-Lq$}_Do5_{z)LF$8EBv=9FDK=9Muz zCzvzOj60m#=53gfWsKmO#DH#vx(<@l^R%hj*B2%)3j4OnZsuvBETx;)Y~?Kjel-)S zhwD78204TI{K5jk*YAJ+>1~tdt%ZV`BQ*Pd-vqGNg-yX!Iz_1Z*MI+?nwyQ%+l>CZ z-WA#goxuXxhRic>BT6Q74)N)eH6A9GZxs@Q{zs!oS3@^pp^?UOTd(*}KQflJ6+^Zy z%{3_dyGYP2rM=a;(Y59d?{ViIzUMiVmI1=F6Mlx%ghMS2=p?p;);x>+^{@Z_;`=Y} zfB(s~UPb}*KETsxU5XIHT|-<0Kn}T{zp2E-wVk}5MxxM0L)b4&iWtJ^FTuHa<LUMf z!2B9HB5qYPT@#j;<z>W6E(-IalIkr=mYeRb&7$>CqK(Zu7%+29O7QH;$F3A+r;>~B zT$K%_31faiWmQn0brwXRDk+QYh*d?Bfp2~po{~u3%LXw_;{tCIS?lG?I-U&~R*CKG zO42WQXt92_(vag&B={rEp>E*l_Ge7stIlqn>c$UYocv6Ze}jZ<X*jN2Q*tb)I7LOe z8vbx)XOoi7IYbfLppIu+)3hF9@+E3nSs|YI<OW_@`6d9}7^y;n^^@Ewn?cfy79<uA z>@tj-$9ystdZmohwSBAe^aant3s@*0K~lfciTcJqV>7Y7+o4JP4?iVwhQ1xzKm{NJ z&Pp4%!k{qlm<Oq(2A90UbTWn6<@+_N>rF=tOt2n?u3-kzM3QnsV}bZXk0^I1g$~mi zX<AMyTCSM|w9C}HhEyz0C_eMnxfSVCtmqex7;26Pp<Qio!P5NE_mJr8d9hKbh&nsZ zvCW8)7CD(Kwz2AD!ueKqzJXzdu3q+auvYV3C}nPOAr~!AY%0BpMW#6rh2L@BI7*T& zRNaW^OR~+%xU6{Tonb%fZ^I&F8Y64E*vv;wv`N%nB&3`_*GJ@Ss<F|mGRb+cnVA1| zdcSr4&e7?lS-fY<kY%TGOJDQs1sA<E`m@*MhVYsED`Fx>G>OduKK${=fBfyYk01YU z*rY_p%q?@_?ES?khvUMiaMDs{PU}S}BYVqm&n`W-%&zVzXP{`IiS2p~7Btd=F`8XJ zo<G=9!y31w)8H^0%)krMJ-6nNQ^DJaGL^}jY*r`9kvvY4q?xs65;)djn2g;TQR%=+ zs|_&**t!(_@Bj8co_%`z?)59zfP)rkd9$$XS-3k7klZhhI~%~tW~cDnRiMik7R~9| z)Q{Djm&==?!^=13Q0x#7YN4i=Dw*AiTArBVf;G$cd-1-UduD~1P}XhKNGUhbMAXUZ z>`$V&%}sT<yr7}w=n)rFh{riHO^~h68X&FdKPI-7H--6(I#z=9nL%4{=Ock8N2P^g z*_>Yq4PThZ=sA+zFqMm}j|<FR{+LY)*E;s)bS<<>-)~#!GI%MHvskYNnUsW1HdC(K z1e$j!PsCJU*G!qp`6LZ?L`#rH>A3wPQbHYaM^`x1aCvUpH`Eb_%zsP(WwP4rO%*8X zslivy$|+S$(TT~*0Sdx)ile4F0^lVd<w8XWz4_Z;@yAwhYgRNZLy#(H2>B<YB~8P{ z-glqBJ}zC5;>C%T&l*Eyov_zoX6)%$O5DAn16AKq5XjnP0cw~XO@VZr9!)1{`}41V z`REOoq7Kp5_c&tv!;4p6T*-3_rN@-IOwf$mrUMod)&oVI#AX<C`v2iw4w>;qpdDJe z^JD$OH;3F1((LC(zRY+7KvyGWwnmf*P4zWToc>XG_11B|`{K(O`q!3fB#t2+&9~@; z9OFLe7t}6I7r<*CA2Lh;5j4GBBxRwaka-uSRL--C7a4V>>v74x3LF`;4gWezxhtD2 zw<)~t2?D}iXl5Aw;cJQb!#jgRafs!H)%sra-J)T8=!bw*AoM{{iKTMRnOs^M*G`4} zOUL3WbSw!CM8Cg%|8IZ&yVRE=;%6I$P+!1gKkrc3S2ZMVzANo-t3NSQ7Ae4nr|{4@ zbj~1mJ5XO>4$`>{*{s&wH+sg&5Xx(p002M$Nkl<ZCXJTeQRGv$(=w~>G=$@Er+@;r zIdv}QI3*Mph6Ka`yQXzbHrVTWwFdUjIn0(5k5yLBj_KK|T1Pzx{Oh0p^z&<H08h{S z7A<v5bY+jcjEVopzu+n(q{WXvzDASnx?S}tMwcHWF6?GzqP87WvrEK~ED#IgBU)7C zStwnWxEoZ?M+gG4z&hwGbe_oMi+bE_ESZDyZTWp=`eWUuQLIAGPJfR-v4zGNA|AyQ zF+cQT*j<m}sY2_%+__V$z1xaI77f|C*Uvd;0?cNgQ{q>n165F~It9-)iCIcwWi`_` zETBq&b}*Uc8&GLN4v8o9Ql~}gf@#?VYj)44vm<blEPYvnIAFj=d=ZrxvnhhQNtwf% zyo1M3XT&;{_j8&R$^*SyMXxXrwj>JmmoL&;{R!;m7S6tt6F7Wr$`j_LRWl$f<cY_E zRf#Q(>Uwjpq@SU{3w*;2Q1OWj$c;M6sX*G8gWMf~L}F@$()Y=ZL5dWTIOs0jz5n7R zI(JB$cOrP%Yiqqh{<L7~Vwiceuy!SgdX0muT4nj~`~Ue@{eqyZSBy0dK|*)NAXIbW ztk~6wJIR*W%lP`z4=;bPp7H6+i$6YoQsu-S0Bzmb?WFS6Yf}ni3BPzyi0tpafAI=L z##!8S2aZ9X{gf~ftJ)7iR}Jfe;4ybQU!Q;cz3ZP;ky5QWyzIQB0KTvX5)+38ORfXh zE`mm3!xiP5Ci&jHoej&Gb?5VmPuLL?o`Fe`V5L$>0<~&}!QYmrd#J*sp<%`gkGBl| z<^6}Q9+&QK;uxXHWlNVI-Z$Q8wO4M`9%X%UF`0K~@QR`m0NYxZPa~foqSm3jD~xxY zxI%j-TBznWY+R#tv!!mK8-Mt`h4}Phu@^;ptFL9S0ho(r+E1T9ynTC+&<1RiX*YWV zN`1|1CA<wkOMgZ(8xN>O?elDs5r@4f5m!RWAC?NSzy`{UT@Don8A73>kDuO8PyT+4 z9u9waX*uYN_cu5>te<SlI<q@vLQ4D(FFt*2+H&1n&#L@T*BL=<6wxq~xi|Ki9^#xx zmw#@}RzP_HDIf2dukh@*^Z;r=mA@(;u$n~w>o&M4Iv`Gs*?eG(6V*+`W?qrsJLqXQ zz_Yv5$rM`g6|tz;@w|`B7dFym%!BX{9e(Ph5vIJ=W$VYB?lEt|u&-H&Q7KzefDN&9 z1`=C?=WrpyuAiIk=IU79Tk~YQP|mi(9A)92cjS9u!13%%horoH|3=aLc+<c+qJAr{ zJsJ&664&+?pt4?8efB~R{qSCIv2-X5o*O10;RF5lqZ@8MeSZ1f57r>8Q<cm1NZ{<e z&QT)Gn>29q&&Ll<sce-0uz7a}d2WvE(>1Z2c*ip)3@+-5+EQw$6!iJbg{_b`dF)iC zs8H30L7g@S)LRp&u#)!c16c5o@*iLMs%le@B6dx(IlN&|v?s(Lhgyz9mFq<aAZPvf z&&%2pp;z$c`}a-ZwI!wm*Yw;J506Ua(htACTl7xu0(C-L5S$9#{JR-E_V7B3%l>>q z<wnxJSJcESc9NKMLG;%@8VT~lo6oMqNQ-HK;`{I9(|7On+_Q$UO0p=VuO|}04J>28 z&>aNm*fu3%Cph(t7q5B&CrXZPI5&zkH7W6Ngp&_yqGSRMWO8?G(6)YTRr4HgFz$=S zzXQ9rZgy;1&{YuSx;Z}sLdTaco?8Ksoy89(OCS-DPD@1RYk@`Ul)|C}(v)_(WU<?h zCYv-B`|g#8h+Z{HVXGrkIja)+7|ck)vB9%aQDMXo=%fOv<G<=oibO2%45dX(rjNuf zL4AnL*xa9gjgDHWHL7J6crocq!8$=S;?7g$y}Yom#30?_$+9;*^<~Xzqx_<71huxq z*0t$8xI@+pLf4a7aw|(4yw7~6I|<ru=HTXuarYD=v07#YDR>FdUM8!b#8M|{LU5|+ zjmsCVaT_ftH8=3_EX6PzoHcv?{f}Pk0ZbNZoOrzZ0-JJQ`Q?xIh3TK(z55{MoaAbo zCOHYZMgmB7h`b|(DgVgz!J`rY%_Rz{_j0VZ#4&d^$}e_Wj^U}nn5ThgB3T$QP^vYe z;Qt5{hgqsOMtphmwpCXpPu{PiU^Ra=5r{1&I}Icq8f}#?TX9TNkEPU}_)%r6r{%Ro zBZLY5l|y?3sgM<#gEwXnx1OA{lw!JwF_ZeS#VG4YyB?Fnx(XB*l(uX)pDW}t6$&u~ zPtQgy`8@~-H?V#F%p-tNQ<F531bsMN)*px44W2*!-0NTo<D{Jm%Oj7j_{WFda+8gU z_!|zhHB$_goU>CCDi_$9$c8h4#1XpO^wCnW$3rwxVgu=1uU9ckmNyHd=>j-SpD4eP zo1yrb9^ZZWYfg;+uA~tml8PL>nE#vo=cClj0-N7ZtH5YcE}`ohO2{3C25CpjV4If_ zGmC)7`rf;E4QU`2w$?Gl^Ir_rHm1!Q4wqJZXMlL!L}b?_e6yMIy;&aK5Z4d6=EoPG ze96d1{#pnox)?JLX9PRUQWq#;bI4=Dt0Cd$TdEddpWeP{z`*$IKsEaeC1=Trh-nQQ zp4m&AM!T;D{6v`3{83e#z0CZGa|H}3*Ena?inAm@E_wd_XYWzJ7!(0ar%8#TrUlMS zTC^mKf0KV5E_WXQ%*CZ+WTgPmZwl|KWJbL4FJf>Ty9$qboQ4!lRr>!>NRUIUMg`&$ zBMc(MSc(KNtro$XTclwDTtsearGxnnGkgL!Kpzc~e|-FT%?iOrg-Ltowf6$vl5cHE zF~HXF#w5nnp*oMRU*m-!b5Wqvjz#!pA$2WZWf7Ouir1o%9qa(iCN?^Pla}CZ^&cIB zRw5T@CXZkR0YR*U;kCpS7jm%^v%SK5<}2?k_LM7N2`7EIaNnzb5JkCICA}8YfglR3 zNgY0W?;=Doy{J^cz4LbRnHI#x6lcf2iomsZ`gVezdzgb7b^bk<An7XuhhILw>x+|c zsO5Gt4bJAbyGTG&&DpdG(IX^?4d}wrG(2k}$^sLy04q1eH`3l#jpXf{ck2erdIrzk zT`=H{2U4o9=9m%k5A-DFPWx%y1>c8(;0tV)R~^l+t1AoZ@F+pyF!h@)I_$eSWfSFE z<qPRSG?}4q<WGfEiSq=N3rONqpV$%y6+8@zZD_VdFu<9-K41S-gIV=;ok&Ak2CnB< zyX|&nz?{kM89xge7n=iqkN{=}lt-Ml0ZTh+!lK8dF9jIVZ<be}*1<G6nB?+TQ6lD= zB^3-0g4O{#+d_&MTw0>fvRZBJg}$#`c1rOaof()k{zAI64)`~2cB0t?A|s?}i!d>~ z=rYa!)H1q?eCdY)Q>z}Uxt&@1Tj!c*T7b%$@tAEF#$(|a_sw=`g01F^sb_(xt`j1O z`E6Q1><Hqjl;GJsXnxYF^dC}bw{Ti=tl<2DfSq_pEIqgthh0q5(q`_$Tq!$smTI3c zZ_Wfgixmv1nP2FD3?5Brr}??BM=MK1NOA`Nh6N%hWr%p~dmE>MHrmQr?0hLD-Db(u zsrH<ce-YPnow8rvpPO`zS5GS;AZVqz9hU_k&V_@!lh?dT92^V@#!eyzEUUSFE1#Ge z;nGM*DdMdQxVJg=%0)d`WCvjNvVXx@+eD+tJVE^Y;hpvWa#Zto*MZHCK7IP(@fA1a z4O$o}LO_b%eZessD$|f(L(p3PkITu?lHrFo%<i&19XWK}CA%Te4YbwuoSh4hgr@%E zJj*qQF4E$g+KH)+8TyUeV?k$20m+~V;~g3fXGyHLcBInphMf(+Xa==Ui!2Tq4j&Lj zgal}e`P<)q`{|YM8n|rrSlWxpv+o#6L&n#p5lqWX)71J;RhvM1_oj}gL2eu{dUoEr zsUQ0*b)vJjMO)3McvzYl6zmh!nF3d04QaO*X4}KuB#yF*reQ<W>!0?fgb~2Y(`!)B z+tRivwkH^SjR_13=&Z}~IEw&=4l*?PYRYoTbEk4%6P1N+SRG_ctSP(io*720PP8=C zqv7()5n@QITXn&iSuSKXCxgWb1uMUu)^7rMw%%|Qj+oonbK^u%VIGD`8sIW)y|><M z;3t?L>i}ayLH1WTwZw+j1un{xvdQU>J=P$WP@dLWclhP&`wt)9Soa*~vvYRQTc#_9 z1hPDOHWA^OoqvP<h!B)SdmD)Pmxea&=~7$M&b=5zY(Q8X+(=nk>}Ox#7A(M+RFlS6 z%LE%;kY}CCYp~L38Y<TSy{)DaYvYB}v86?Yq0gm5L-8z<n|BT&bF5h@ue(+2;fv&k zL;a5jmm*VP!|>B-2hXktbnSGy2!k#&5;aIk$t;_CX9H#mYA1hO$Zltzw9QEYu%o%p z4EiK4E6;r8n3U-wYqnfmyvFIutFxU#fkM{NEYtB=fvXI!Y|dNE`!w&2AegCaTZ1yv zWhZi!T&yEPI>vRbC$x!&N2TV6OSmE^at5TmPAlv9XbWd5KdFyKBrD6ROx*#2oLCTt zX9?ZWfX|FU?)+6@Gq68CwlXsK^F1+{N0t8j_4%70-*rPaL0bLw-~ZhU*3e>M8~28{ zfj=H)HXCAq1#m_?=;=5W!{&!mT5eHm(?l^-V@ppLW)#xYXC=OE#y+N5e=X(v)%E3S zc<nb>3E%9v2?Apv(u<zPNr389drq=YyMf_>j7=V~n+*Wx=0)?(mCW|=bmbB_#f?XH zh5RDbKl_<`oBxG5qHK{?7uoRBs=~@6<}c>MM&I@6!G{CJMD>tO8#Tc>M|&l#vw_VT zPFWn@y?ZA?WWI?z_W+6!6@-Mapbxf<TRRO3#>PBM(4SS;FsJ}4aZ=d4pp&mu6Nm^f z<kgbrmI$Hpll2$G{%M#Cwt3(E?Ifijpas2&E1noa;Uz+ku+fpTRJ&Sm?7$#7G}_p* zn1h7XL0S;)dYsSrL$+Aqjx4(km^#CT<QbgH9)Z;e;BV>U*|XPiu3cjlpv-k?8c#85 zR%?f*njaQmlpLsiW(dBVJ(3MoveWUR{?co{?uJO*8xI-_qgk+#tM=uO?o#O`A_$a| zvd+9uM$Q0fYKvx|A+#x(hfC*FnTSSl<&exlVM&W6S#kkDmwA(1e}g*C>j?AL*`!n0 z8sk!5%@+=dQ34q@#c@*VaJD#8VDKEOTQM#T82xMOX?7x2q1>dq7}M5vU<@v=UU&K0 zmfUpVaRJbpFtY5Tc1s)yy3LY;7|V}`B<HKsamGF	$@;X;s(Qk^qmXgJq5`B|Y(^ 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 diff --git a/Examples/Data/Textures/empty.png b/Examples/Data/Textures/empty.png deleted file mode 100644 index 3b332dfe12e3a21577287c90d0274fbd91126b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9875 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 diff --git a/Examples/Data/Textures/flag.png b/Examples/Data/Textures/flag.png deleted file mode 100644 index 648432dfb2f3c9df0164b772700d40bfea2dd101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17390 zcmXtgby$<{`}Q_A7~S0=ohl{BMoEZ(h>{Wp-Q61{2udj>EvYm}!x*4~0)ikNqr1EL zJ$%0J%Rh|c;JKgszVf`T>%8|?S6hvgh=~XU0+DK{tLTA1VBjMd1jh${nYtBOfj}G} z4HZRwpY+WZqc|S5przwzp}xkZujB`Bb6t->p|&hj4C!~2dwwypJtPy*Yt~vQvr6I` z`F5U7uR)&B!&CkI!!MrSN#yr>zFAS(-Y(S|h!V1EScvSNW#O@Mxr=W5n}RRC;^Z+h z<oW8gRoHr42lsvX`+G$tTfe^^^$81aMfQBXP`EbVA_IQvM4G3rKxB2S@*JQ5$6Zi- zrp~}E?UD99k_griYEXm;j6D*q*Ql~e)ql!L#ItLHd}1=LF5xn2DFb$?AKO7w6oEXm zlgf&bi~^7#zf!Jix(aX!czyNgncuV}0p->afy?M|WL#L**Js6@-HUtNHO8B7IpAAq znVGUK2P?bt>+ANyA|e<}W8-+#{84yKO--HiWc{u(=XXg9f#>oT)YgO>{OKT>Nv*K1 zq#!>xx4p@YjSZBsVB*$ZU>1K=(U6^%w)SJe#L>yglRSzL87G8U`N)?cJ5<o=-XcQ9 zm{9OR{{v$PnH-c4L?%tlX1i`)Jd|1dtQa-pYgW4c8Nzp$q+^+nm$$5>wDgj_>zR22 zzGJ#j#Y-2+j7#+lx5@S|agtW(Ki=Bf6l0Uze@@gj6CZ194X?MnDX^B=&jtUIDH~gM zX);s^erLrJ@|-fO(_?=?yePCmEKYQgyi>%jFn)G(lb1m+L+PqyaZ0z1$*=u;dGDtA zV8Iqt+9+nT=+_)O_!Uu;PIE87av>IV2y_QV6_)a)eV5Oq)V#FDct6b}3iMmuGX+@y z6I`v-^HWF~(Pjx7BcHv0Zw!=7IjSf_jGeW@s<|};k+2<w*O!y_aA>e|X|QpHLIv9k zzoK5`c~*$V;+{u*Sl^LwAvM&}5qQ~d3BA!GW28FsiP4EMNzb4FByuGVq4HJrvxs9} zH6oZM>gCQ#+5k}sUK#gPFuo|a_-#NH8+QZpR1uyOTcy}Bm<62x$aCN}vM+bx{9_0R zw;ws5QcJ<3q4WgKq;Ap*{q8c-<WdAPh)crWu2L_0D@4mi2uQ|@N}(z~3%nHDVL+c< zVtlRHsFJC+axM$D!3#=I$00P3@PGw!edMBc{k7VT<=MvDgU4y=p>39FJLl$eGyU{z zRh5}4_&ekVvwu2v8U*eIVG5sbfPL69muJrvFw3ty4}YkgQCZI@=5gjgvp*?}1BWHX zTIz>&fr405$Yysgcjj1k-V<qkDGR!H`nPMVkgLB29#4oS*J|GoPB#pBxB#;trYD({ z0#58eFF0VXTzgTy?{Yl96HC_dL1^Lp%qp6z^}$g(JY}S?58hVXv5~;jy2t;~b++OW zAXf&uuijaj^L-y@X6AQ_3ulrGv!5xxS&P=Xb};8gCEr4tfgl!4bP8R`WJQ@_WxN(? zfWe8A=#%QOrr=w#hxAPnpipcvPvd!mH8+h!Kr42qhn}C~%@qleEy_VHLayi%LYGl| zV0R=C$rLrKtv>8qzS-j#tTk`j6YhYboS=V?o`JKup_py&5cDU1G#!ENGwiF*<MOx> zrU=J&LbNhMMZNtIhsh<LPP^DNVXFl3lc=}BwcoqCCV70pp!btZV}X4g`+?0ol|R8B z<MbDb55CUo`iB=2{P$WKP7aY}SOL1>d}j50mYHDI<2@PPqYv!&{`fv#&q}@g1nU=K zC=v#d|NhJk`n}>Z$_wl@MOXGxu!=G(HSDDhcAF(MD>Do!i;Ft>y<za`{jb<F!l?pO z%*7|-IBIYQj319SWpv}6P*EeT4Do;R$yR1>a=wQSSDV={ob_I|c;Maa*m3stP;#%< zHyNj+K(TVJkjX}%E&_VD{02*-<?Lkw`YIRP5eLW?l!0IS=I*iec1R~%h%-xwTGd$~ zU^W_lcU~KKm>r)7_Hpk7hWsPyQURBI!BVW^oBoOwE{PS~5a&q;O-}1}cnP?p8p+hy zBh2rETkpc+HEY+uZ!=F7azm{^y5=;yq2Cb5C885dO%TU>ynnw;K%&&*5a3ZvSK<!7 z_%($*iv40*o<+~I_V=X0tF6=tojQYo82L*((Cs}TA>^IwUJQ86s79MeHx^F@d?T*O zpcTQ{`$X0XggAMUW!|{2+0?kD<%uqGR`aPPrqR9YU|vWAn#0f@T=43io;Nrh^bW)a zsv~dI^yzk4aXnd-n>8pHq?-P`5@h+P^~gnxb<VpO3+d;+{C!Ox%Ha-kSi};o`AYJ` zbl=M*qW|B1*~B0EEVG4Kv!PMWVC@yzOS8Y1pXm_xrGuLyjq9KadG6?|VvcM&xbPZ- zez+bF4EgBJ64U|+CZo8U{X&irkXBEEW*H4kHm2xDU+o~>w9u$Q=tbIhHAFcj%Ss;D zv)x1(<SCkv)iAu`1vcfiV0M92p#DB>_a_UQWjlG#m@?dZiTN8?Em=!pURfS5`oZH) z)k7MhMrg5pF9Vt?*EYrY7cu%F%!yhXbi@vvcRPIFR{I*mR5c&NxUjywJfRi%&A!Sp zw1Ri_Z~3DqLE)hxD<k$<5*zOX)}R(Dz+Mr$bZ(?$Ykhw@refQjSwhRTY;QFOx}OC` zI@g}bMq>vu=qsWg#B4NP<K~I|kQ&BPIkhWKJIR!>gxD*zS-Tuw&wZjS6e!4>ZmB2e zEW9+Rl@2#>mOB;g>P#OmNsVA8@2`LyxG%Z?^Lj*-zS;)Z@XaynZjQ;99>{=kWl*q9 z+M#=J?D*<Vh+Dro)FbP88;{G8L$zGRt+Vows55u@g&m907KRAUS*V4xQtG*pHi{|+ zLDuRE3G!-GBP`!~IH7eUDj^;i;FuO-&!H306^#}Z#-yG-NkWnvaM6M!8{(+ZlrvC^ zZBB#s^=_(ZYqk&^0;G13>Wy!Em}3HWTaYT>R14sS7b)}AWs>Q0%`h+YZQY@3o&U8G zO^tR0PCKn=K)B7iGh=kJ#Jclwjq{0qds@7;?i~H;)z3@WD!P-+vwO$WAzdhKd3o}% zl}WzV3y;|H)u`Y%XlnFs#GbeNt>)#~I&BU2Rwtp^-kPHYxe;XLmn?42_*UmiivG;k zcP6T>Q?F2pj1_F~o|b3_I7juNHyu_A*mrZh(CnebR*=lG_(iC%%usn)U2(YdarEaC zyp!XWi=Z@$mA)U<-!762(Lv>yn0qMZWym`?A84L1_D_ZB6KoG;@|fXbSmLCe<_BQM zT~|flrF#R2%0?nUgCjP_D@kZ)68r(7$fBg|m+%yGoTa)9m_dx+9bwRZPI7UUu|sTU zSeE%ieu4+XB{AOetcrQ5)%U$82Zg(1CCFh2-EeHv7nyw*Ol^N8gN_E1fPq)zz1}KL zznTo(`QG71Gaa$!LEisYEX#T6AMslqa9f1<^-#mt?I#it?}l@a>sBmeB}&3(J%j;W zdL7>Z0!-vwow+8a0YU5y1R5_0ra;rjvBTMVL5wSiyoy}OWl(U%GqCoNG<EO%a1xFe zk|YCqRU-W)IObvk5crfTpe@;x)4`o}0t-x0=QPK6F)n|x>mXgB?2(3Eo*YgnHN(4q z8l@kmlVIYQv@7l2ISCPv0m(N~z$;ii5_hIaV}q!!raE@M+?%?8<naW@BG$LIY*GR$ zhCAfei0xgwZ$Ir6v2Qu7(}wF=fL9>mVCwE8@yHGe7l?~}PR}LLsfKjWruGT!X}gKd z7Wv<~W0AF0HLr|-g16=#+WR>75qtZ?)1K7eMo4JV`Fq3*MnGpIK;$B8pfa=Adb0C_ zV5W|KhAfa~x{S>~Fw$JbAx)!o%ECNHNSEWT)WA{+R0lX*J=jnMwArvKuEzEU#=xiz za#A>;nijA)Vvyfq2$<&&FeY`i7g^es_YZ4DpLBdW4K(q84)V*WHsY|u?TJ?7WA8B( z(TV9Y!oFEEDI)nm6JgZoGy?L6gxgPc*1bFW`mkZQk4rn8O^i=1-y(`q%{?$9l9y19 zCbjF(6qONGEDO!Qdfc5Py*gsRQUT|7aqkD58$T1pa5W8?v|X<()H1Oz#)Y0dqi!Z> zdnAPYM&)q)dIC1GxFt{pItbKBWB48k&VGw`KP;P9M9_dhoGTr)A>8<2_CB;Q3yr%6 zHowa^wPL?TKDSQ)ZKI?1NVbYx!*8FBnYsyHrUQLZ4_@-_%FJ=Je+fz9q>kVOwqc#! zb6FBL5^-8MYoOgRvTQM&uIEoPH=#b+-LpONqFBtLhJ<Kqef-&RO6RxbuP?{ujPRj< zvx=vzr^^We3%*Gqxw-Z<(*!e<+&fKbGt=$6Cj;#MW!Z(1CxI8|nWX`-!$B4UCS}!A zgNH_k=Z7zoWYDEl70Hjb7hzbV|D?Ft!R@@&*VC4<JY%5K*0*}AS=JqeoLdgC2;Gny z8uxx~pEA`_g125<>wNxl5vs)3s(8_UE~%fNzlaZGq|^r0MwC%a@9(&i|E8LTt?x{P zQnX@w>S|Ux&W<`hoeU2@KgT=pfE}z0A6qYssALy&_49g+-{WV4v{}Ld2PUhfnpR^A zMR^cR8W6M=d!cCNj%~&w2oGqDh*LTT>`NzL#|PuJoYsy$r!TTa2U|Jtv)k^`K>k1& z7_>q7p|_8#)30b)<j7myqyqw(G?#n=*b*)ncLyB@=Fv|<2lG<&*<E$)jp21ETP@Js z<=QK!4!y2RN=KYYHOLK@n-$lU=s2o;qmXO_ke=8h`m%y?M(Et9!Zqh~b7@zB$vP!R zl^?#Xk7fr2{*}BBwXhjjp9l;%nZ#k&W56k>4+`&&-u<|VM*I&(_?tUtgWY$?W4kq^ zOO}F?#_yPTJIWn%i*YoR)`)Rc427{{Ss5Y^em40vz@NK9CXD$S#?HuXU^WiYzqVB@ zfK^uBsCg4^w=K`$Fa$xa_`C-k=70L?C~-8PL6Ri7(3+z)<3mN_8=bCSl{t3bA9kGg z^<k?K&tro6xH_D6)4c*Y+=n!6*G5Hm*tkIA)XKu>Qv#uxfizdsob_slqurm+Ln&~E z6FnD-#^*`{%p<Qm&nC-p6Z<~p%bzAVOgy^ThcC2SgwZ{k{5~-qf7%GqVWnZmTh=qj zI@miO7;4TtsBjz>eMOjtSVisb)1Xp6gd2UlDX#DI2)13lxqiGbZCekvT6eBJT6)5L zZo=~B`=%)9_hg@@51ye97!xFRF~GvorF!f+$Bo*+?B;H+E|U-ZW<JiwIX6v@vJI1p z*OiXY$dCAmJ`bzSYWj21Watn6REAzQYJ$qWi<vM2^-xWZMa=x-n@Nk9X`2MG3d|C} zbv7D&iQ*W<px?DzT$&xf*F4C~t21QaRlM(*5pV7dK41$zrMGO4M=iU^5utB{{AGD| zdz#QZ9f~NPI+jlz9D!yR=j++er;H^`XdMS#U1-N)R_Z<d(cUY4)thN_$gO6sdMCoX zg}SGZ@fk+@h`%mPglO5-pOgDL)#UBvy&ar`lOutbJ?4*4DSnykHIK;MQE_ybECJ_F z<96n#B-hEK=FiK=leNvAG%1s^FDEVnqE3djkua|Q`7v$s+P4#`pc{-7d`G7PA<xA( zwNt%<;kxHhr#Wg8$o#99UCyCATzdOg46VGq;ehvjZ-xZ=KsI7G6!|?=vKAcQ=8~9g z{apxU1rCP%4}(Brg6M+I?*@1hX^!~>JcveoYcNNyu-*!cZ%{xp;y$dj7@r04h*7XJ zA8=&Laz<`$XZV+2rT=m5GX%62L<f4>E~hxIb1iW4MW+py5%Ds$VcR$1!bbV&F(=}u z#Jj^<bzG=T?K#m@_<?EP{8H_1v)Si6k)Q+dA$L@#@JV44Wc)ljGpFqkpM~=L@qdR4 zJI@S9UCRV~#a9e_5Ku0Mwf53#U<6~zUjD2dq95rq$-MK=E7tp%J5X#yseg)A%v#n+ z3-#?K!w5|qfipgDa+4gMEF}ZvTmvNkj%u1pIDqmh!+(*#d58*sR}#DvfOA^2&#T-# zw);ZB8Q2P%tTjFWLksLt@PT70^!sPg@4eDK?Fv&D!1`Z%rj9VLAAC8>({NJBcC=`P zBY~Vezti)fD(u*U5q>{bm%GKfY?T)=E-^)=+v#q<`Ds#NjC3kb%<k_wMc^o1bC)MW z!E3QIt=e_rSG|G9>GhvP(N2U6+kdkbJ*A!}&rnv3z_N?Oj^UH1To<8Fc05=EKAhAB zRFnG-erPlC5lZ!EVJ@l}j%Dm){D=+xHhTZ9L*{yAmfT2(L*Lu4c9%mqAJAS}2-iKx zOjqlpji=xpakn$h9uy(w3Uo2d^6&G<lVGz~5Z3AsTXg1p->#JJ{xaf$H@sY}3Gcio z?ct150W(A$Oi+Z0R{m`z@FhlGiZQr&SrE&2&xu2iK7#-lp+FRSpBN}yviSYk9-oE& z*7LV2*10DbTTA}w)GksHA%xYO<f3BEt1%{<7-c({#EP6!EFWBQ;d{l)U1rUk1B(U@ zvn8n<DX3k=S0+QT%2chI#_j$L+Cku;bG8#Zky}9)wP$Cs@3)?r-}m{5HXAurtP|Om zsB8Lj=-YbOXm(6~Mlw;8bcqqEvwh3>67t!^jE>Sp7-zIW3kE8cOTmCm%afn!%a4)* zvUKCkQa|*sT4`q5NU;Z{bOk=PS12J=fLHowFn{b(&Z-W;wY&esy#KZ~t;L{44Dv@r zbJg>rmc_Rq*~<ro!DA7#IrOu~+dG$P-I(og+v0L+g#F`xQm5=}3nqazv5ojdgeBYL zDsJv3IQ9Zh*5Fa@4*?9|Z051$0gcSsD@{;i72eWil6A~^thbm&`t_TyK`2Oy5t<r- z*BY3$eeE!H{LqrZ@X_VF11lj%`x+6ElZvHd?Kp3n&yF9`@AnxUxuc>Lw<WL4YPTJJ zT2{S0J6^X0uk?8{kj@K&*lxENfO%1jm>qSBi%xe%aeCYD(k7>7rQV1;0sX`OCfOs! zx#Qd{sK{J#G3i31+iH`d@lwL*vTd8-uTl=j4S#YFKc9jEI8IhMWcHpsJ}`eo(B_`A z9U+^=wpSVvROgi7R7eXvr-9CBtnF+lqpMA>sp@slHBAfr$yH?Uxp$6X*;Ko3Jwo>n zYh>B8p1m}MVevxnp=MtWobE^c3D2Y-FYu@AS2aF(nVEcv?V(RuTFYLzecbCG(Q;)) z;afP3JDyhP`+YyciI~Ist$?L?=HmktAMOy_i~o)ET`>r>Q|Q`!P*_}iz3Gd)-V%FO zjFUGKMcpO|5v@{GgG0O66DZ)(r{%;dBlVti`>4X>(&aZT7_^IW2J;eY#|AwdZ9DWz z<v371;oXJmahf=k;}^RZ0}UWONMyW|+5Uva-t_VC$aUJXv~<?xs^;Q8(9#UGWLPqZ zJ9waT&bbuivDVh;Z!!6@nzv-m!t{fj)7ZAB=mZX2b>z3zOC!7PErK+7m=%Q<i8KlO zc*qt1U1uc{fb5(SWso?IU#&0)P_bkE(KYX{V@yk>>*hlflVyylC_>?>XoM!bXE;}! z-BGqIsAnlPs6e9j+;5YdgKo)MusH~8z4;MNa>jbr06KH`Bu0`i&?(j(Q&SYXgvy^f zw#2jgS(w6*Fkj{_RMn?2wG!q1*m<8tF)69(i=om|Yj&aJ?XMrZ!xa0!2tQ;W*e6K5 znsF<|X!y(<dIgGEuJFMx%NPej7*<T%PAxMfSAt|o1YlsA9ugh{<Jt!>uwzyO!CiU) z`f&rV0WBargr0XIsYg|a+V`Fsp7FU}{B2=oE=1*y1<d|&J4H6=|0V<*8uJqSIzoG; zM9wdbwbuhXA|JHw;~S|}A|KQ|>$%hv1XVr)ecMia4gLtXacbj`1PM^>IiagTZ@$YA zgFIBSAE|+c(N8U4hF6rrml2ys1c)K0tV_LWU#}d~vc%7k9HsQS2+^=Ogm4XhF#`jE z-}yyu9H#H^QsLoa3->sC=O_yXTt4wn?`{}4yvxXms3j%cLsSBWwS>QG0`Y(EGDK3Z z(mC`~hAc`6U*lXZ#Y{>^P-RmJ*A6uI?>-hheJltCT8BJwZ^4;8G_MeIoRRk28nwl& z%+GjAMvki<_)++$Fog$wXM5n__ZD51=_bKkQ)JCZhkQ&VUL$7Ojo><p0--Mm>bjcn z*42|OXbl^|53h4646Z+q1#Bi8ms)Sde$E|oOXVlI6OByGV6%OI9D=VTDMn>by)hG2 zZe3TSddE2#V>!=oX_}(6B8mn|3XbfnfWN)Ao;+I{jrY)$70FO!PPxeroABkbQuFnz z>eIL7H51D*s(-Z_^trUckw#D}&Zvq8!UJ9xubzQDBa>g?09%vj@h3Drmz&0vOIPAa z!L{WvUJ?Twt(o{eKR{T`Al3)0XzF0c7h*(crFT57y&{H`6$c{~2Xz{IM}3ZtfoH2; z=Q*kTf`AglNeG{C>f-5rHM8v(!I!O5G>dB*u63M{4!6i2#!a%%q<f+w`(*W!xLax? z-)7d<(m}phAGqB5w!9vW1nOC=869XPk9cGi-gZw9{tUgyD}31psAB%4ru^sbsoKP5 zlilM50Zw=T`|P=o!0aQ5t_A`r3EgByc88hUQ)Xdn?xOzAVw4O^<Bp9?wcGmeK6Rj3 zCVdCgvXb=^^uiS1;?;&HSeHT_touXxw}|d;@FKazD)~&PPR)chhN^Q}yJliPk)MmG zLkoVvf%M5>L<b8Wi+M-=K&r(vcu?BHtH>9WNHn)B%UIiK^#EH&WgIlZJ)T=5txw+2 zoI(8s`z?_h^k7}}xMyeqs8PU-v*oHJ=k%pk@!=Qx@l7@Q_6jqB#8=tk8t@PhXPD>j zwGD#ID0J^5el9Js7l&NuF;Pn8?h_o1hfN2;g><TZ4@t6<BN-@?eptdcq`|s2gTLrJ zeh}2Y8s8cB4)fVBE**ZN^L_X7Q2gNcZxJ|zQJCiQof5+}Hu!T2;TIe|4od9AIfcwQ z&gA@TV}Wv<M6hN2u{x#w-RgBxX^vxgeiHns08+F&UhUgUK~TS(V?BwmNc+GwDEXR8 zL;G5<`m{a6wON-?xd)kJ9JcJaMi|CV!a~&L$9?o!<*|@_(W1DGsU?SfhufbsBmA*# z*mJ0d5Hc3;z&Grt+X%UZ%7!&qSJz1~T6>v`mfaAXB-TEF0&gSOI<rpfSWsscP0z*b zcfrr$Zd;0<TBT-lJavxlJ^ye&TGAq1ar95YrB8W%$mt}e?5FrEF_}VT>%8RW!x<1^ zD)|X_&<nLI*0xO!5Rssx4Q&WR(lryEd9ZgYOXspe22WOsLtSVB6=ad_1S8B}RZmdM zUM7k!sNMgN2H%zZjnkAje^~`J9s1O15Ym55$D8Y!RJR|&a$5IxLIadNPglgnl_=Fy z66|Ss#a(|^9`3WazIo(M{&V-O9fRILNiYvB-V_toVdyS@9adOzD~g;%kch6G){#DQ z!d6;wVw-@xm#E?q$-r_@JkEnl9O49Mk3wAtX@uuD?gBGBV@SHPKlzob6fh@LI^6Km zRo)=xr2teB$?#@?Nj)^2ix$#~l@u2VHtpBVsD_by_d8bLkNKJ2si?``EUz;zsWblQ zAE<pFUStAVI$i-kyp;{~?`FJcLE&M|CjE(00fb3r;dQO)JUSW9Qhhx&6N!2>l(z^U zQ^e(cQN|tTQyA(+TE$1ln6-5X#~`<#xl$ZkjBYwMkRs(YZ1~<j2OZFv5#ul22A?gj zJSI!`IKS40)&@^J2hkkZDJ6<@g=NFKuUY6?VdViL8VZ+RtoA)>rj9f%Q=-X>$kf^+ zDPQe^?}v)N+Ueh@|5u*Raw|#P=7Hq|Ye@D4M7NI_3!%W0+LkszvMFbw*?29VbhlsS z4ZP`&t~kJTsNtyRdZJw~PVQ^C<xzE}!dDpaZb31|_N8g1%W3K+P3a~UoPm}ZZE<Do zwJ!+q;!qq9Rmsncsz3$#dB+D57bpXm4A5Nh=+I*J`axh8zBn?oNgw93aq4xx(Z=&7 zITX#W5gE!s&wmgeSEi`AgrucQz4EneMtak(KpEUWu3B0eKBho0@Fex`H=Hd?yt%yn z1Dgcn4@futr~bGAE_2iQ`_Vu6W_bDy3O^bbA&rUSS<X~XASjrV5e(;iEC^8?@8sYw z;-<*V-+xT*VMGuY%bc={mqxK+F<x1utXp0%`XGQ=g-PdcR&FhIcIqMFZ#tkS1>l3} zm8XyDA;RVD1MF=>t#61C89X|Oeg`%o0`Oxy$}mM_5sU~A$ESh!#>kWNlf8vI<;q1> z(`|x1i%Owv)@_4S8|C=oe$NcHe|Id1l#VX_2+@t5aOl_h(m&U#e60Wg0ou#rE1_{K zswzgcGgQJ?;AWsU`))9IvZ}0c`?2;so+}eOJOr75s3H0&$w4xLBxfOt=HOqc#8Y)M zv8xo1*5zOdjZ}#b7k@1HIGRhP_^C@S<<6ZSf)g|u+eyX{I}J4R-gY@LkiTmIId$X| zebQ}!b))bembb}eQO;E^&z(FO)SyyTM1G74{!MrAkX<lq^v)C>u@ONO{b&`@SxYEB zrDOkAbO^ftxQTB|tM#R5mvuF0z$bVMlA?(HxZ8NjKHt?U0`xH1dKA^&l={*6DDcP? zli9VLQuB^QQ{d-MJZ2@P5L*6?Wu}zWP_|(te%dVy?$-RZ{u1Rb@mG`Bq>s{LW3RzB zR~WSRy0hZ=&=VLq19mgSabWiw?-%CMv+ekS2#ei%<Bw9%$V9~R5NNsz&*NG0zr_0j z=N~~f5M(a@I>@0&eVSc`-!d86?h~wi^!eZC#byzw{&MkO&BJdppMj<nk<ZTpt2+Nb z7eL>*->Iv$ZtZ9@1bx$j{A<Y^#zW5^K#+7L(R|G!f25R<o<aTDSW}2FQIaBWUHC~{ z8Lg{lF^5KH|Muz#bANbFw<f<Et3w|vN3|}^`@wL5bCwn;^8SR66LUg6H%1c*oB&T7 z<VCi`!E+Y3C?p|#%_xk4ItOV)7P7sc_g~kb`j`+VqXGZG<4)+d3+8@cVGJ8qJ=c|; zv+pd~4KZ`Y6W$Hs@@_+md~)tRWmZJih`q~Cz4l+HL*ES7Dyjj)H}MGL=%y2H8$g71 zU*m6GMp0xbOgZ5m$GnuyNOB_OAq+A$PH(`sm5A?^>@wCXogDR`bTh&uZRyJ5Ze$c& z*^gL>0_WvzJtfXo$YKQj`@0c`bGQWLe=~n$NwMt^t(&<&HnG#G(=lcp?sK5tbpMIA zNU(Yxkv?a<CbJ-J)P+>OulrEt8$NNbMJ6v?^$^C@q85*%6RR*HQmtqN|7;NEFx17X z;0-NnJlz&X15;3JuWGqn`)i9+G0W8^m)VCq|2}BASqW-<281zR|B^DVtzC-*u=n^@ zbDi%P#xR<K{Qkbz;y<#B1%|bJ_frF3g6zyq#xqvu6KQ8IuK!yx!i{*`BMiCiSU(w- zk0KjsB`-%2W;P&VVxJ~_ADqWi{G_BMTo$YyG<)9gyB)I?93FtA|LfRE^aFdcH#SZK z$+)nh_&axPkLuAUFr~B5mjTy%Qg}4MWbJ4049}E(t}SKueL4TIN6$Cttx>7GQH`_V zqJV<AG^)tdWQ#dy!R5*R**yV$3M|JJTo%Q6Sew6(vvLebki^ih2n()joAvr2kQ@YP zxU;D`DGpEUyf*Y>o%RK@p&mq5-`VsMI0{r6<WlFmqY)POBKrs2ZB?a@ncrPE#aI{_ z4^PqBa3i4kLR>=rl+Z>&xfsty01L21&{LsjyK72u`J^Tl7uVRsZEScsb}&mTVX%g0 zw;GgF1s^!DGzh>hF)?t(9jefLwy&THyuza%{`YwcKTdkAx<;f5*8!^tKODT99R&uO zxIi1&i(atQkvY$U*3c~8wnGR7JH8^3M{#K^bt_Ti(<y%bN;r5~c7mjsDWpTo@+$th zEj}4)mXE#X@I_VVw8qm4MgzMh**AB-eDcF#&J@iW3=E{u3UCd)hXFHO!k5WA^VK^$ z^x-E50W2f>0Z32jXD{M@5Db7dAWxqbrLH#oeRtkKpln4>M7@XqWiX8>oTE;M4?pe* z>H)?AAQ-(HBBBsyga=8&l;aD87xoeDVqdXDXhQYV0c7om2*tV(SD|wRdAV?_HvMy4 z%q0a)yd<?Ot*)*|EYu<#t0~vO<N`S7PjWxW945f)*=?``*F+;2a(WCXOF`uOU(KdX zRSb@hYE3j`d$|h#xdh}PDcFwL&x*XqP!Y(>w>0SZDva?yF^tZU_%VrlYh67K0~`{d zuZUw-<lw(zEmyPJW7&gsn&Hb^>Iq{B6l3ZtMgiD_dk3Lt4o~6)o?rN4y`J(+!;%ys z%)Pw!rF0*DCa-?Q6W0sK_T<~5#2ZCFs2)81-2mbS+~uT$B`i-!VW;D+<B5@sw|3;6 zJ4*UoBDzHcgw&E(NV}`$Nysgz;4|HivOD*t;(LQ1Q4jvpiC>>8EIf5+Q>BIHr44Bm z!qsUF8g9@0H<!dp!GFE?Fmft*l8K@>JBOsBR3Zn5WR4sZ+p)*h|11rLIZAJdzl1gP z1TV4iEZo8W@c4V46pvxq*S-=;{z$w7H!#y)V${X|1bIYv@GWQhmwE&2;mGUp9X_$P zRQlP$&hQkWPKkJm433<y>=h08g8tb?c#TiRi~KEa>#@&^ao7JK?J`C^684CGVH7ly zR13^%Z|2!);sl(lQRJp^PHhu?*q43nV|W^RLbj<8)u8(d*?pcxg=A0PWt&^Z8$--v z2yMEduSC)EAPtBs$=7TR_?!%{c0xKukwok8JxS_E_mXb1A0Z#epBV_l4byKRNv*dC zIDO}dcMfu0obPLdsKfuAgaunso{U@Y4F9uC=sG1ip!vL#xv`*L`t!$w++yi0Hg;qk zXpVuhlSd;&S1FDN-Dp4y7I_#vcr$t7z8Tg=q)Kgk<!uIcqeu)ec*g~{9dd$7K9v+< zK$tk709O;cIT^Z_-x<^3QaSF)@Oy<D<&EKt(a@ueoUa#3DY8Q)-*crHg#5=X*<hz3 zRZ93lAo^?i4I+q!?Fu5_!lBag@zX@k5?PpST)*^^L>DBCY1eTWtHNNFCpiy#ySgt# z&v6Tt(8%%|(w{XL*KORm3bh~rCR5ir%O9<505ub4p3=yRi>T22kg!}k=ldF^yZ$PV zC`x}AndhYV!Vs(kFKDlbyLeu6Wy^x}27iRbO+~*tA#xxRaC&slUYZXJ2P_<sGYLr) z8;RgCfh7SEr?unon%wM+so8~{rI`0Ed%lQE+%VBf#=C?ALxTY1Tg6YTHq1-@biLBQ zvUtWmpI_C2vg6E=LrVO6#riiu88GgvH^_v1RRx8LPoj3e_q(lUs1dN`SRx4%IwfN~ z+jlp`asamOJ3Nd+Smm)d38)JBSr@Eu3$p5}dchOZG=L_o;1OYb4$|M~AjC?|LT8SU zAyXoTiqEJ;TZp2|+hQ}rJF|kT-IesKPLP@&lEOwMb1+SoZ<!Go3aE#ntvepoAS`lT zi{T?In*jWj$ff1w**auK4}GK9P1porH4UWK5TK-C4<!48AUW28Q}VhBmj-`qwz`$$ zM*5L9+hH%AHaqoNaC8K~F-D*kGvv^fS#rqhM$m5QCH0mVkV-DI4XBL^<;}wu5h1Y{ zg5wtW^7b3<MV@$DWm@)~KwHK<39$R^4`bpyPIXPDXr5oor!9AhIljGgP4LJErEv@| zT1&#PuR#xh_%}g+#=%o-*Pb6;aiTLj=j*c}>+`}a(paDdS|v;TEd{OcqOuAC&`h{A z)CbmDg@M|Hz?KBG$w(S0ou{5EfV94f1?G)p_Y36-l3GOw1Ow+~edbu?<vCRtR)gFB z5k=NmSl)RLTQCK6y#Tqc?XPoL7!x$YTyp1YSLo2i5EdYKvSfQp&JtBLlXYK1%C0D; zFXZI|nPQ%X@3jAOHgF2Af|8vmJakR3ydwk~Hu3Ex(oF@^vg`IXMsb&DT8`(<;{)Cf z*e6yoqV$t4dsV=xvf<VC%%u)CwXgk&nq>hGG>3?$piD7==lO@D*S6Sy5cL5fB+aTM zF{lG#m>BX+TMhaVHgkg$WkxNYQGW`J6K;V-m$#c_h3_xVei+mhyhZqSnG)V6(Kj!6 z>XCi>`VMjS)E_8^H8@WZ*+nDJ0B6t7QhW=XXA%r;x&*WQWco@TvlftRB|ojd?me5E zJUc+sqt*VAKtV|t5)|^v271CFNA*LZ_gQrBgV4hoNvY(d`hZ=o?dy|HQ;c8Y`oo99 zrRCL(op<A+_IXR1A?0}6c<dkpv}&Ho%nP7Tm-5zv#mV^uNmvB_fF*GO8G^{b5!+$@ ztt5Typ$$Yn53wd#4?pEwf#_HVU#>oGtwO5kr@<7bm3>LU*TmB&6d3Ymh$(1V(HL3` zq-w%H5EllTuWV}NKc5U^c`GVOgmB^BOmRK!7f=;;PR37U!kJGwzl<*wP}~jcVk=5| z#M6X}_=#&T#>NIeRPUH$x-I&*8HV#W?;u2XRPa-UXpxAvC2qI>VEWfB?oW6@qzBdC z<_VPe)f(<`go2u)kDa@EkK;tKuhUOkZ@8Kj&r^1T-_$zrR-EFSwvb3)aL8Z;R8sl{ zZrgB_f>lpQXYOTqbljpC$#JDLqjjOQ1qXmk^Pf;{h;y0JVJ&G6G?~lrHe=iDwYAbs zVn6@ZOqc=27S$RH=QsS)J-lbq!?t&scr>);&K<%zqu)PRcgx)s-H{krXeATQ?{l8} ze0_tc$mGC@Qu;~g@uT3c%f6ddU%o%cSE7J^&!<XEm1UDT=h0C(wY@rty=F`neg4Yb zJya%UY<&C$x5lTtOhW1d#jj~?g}-?(nrtZp9Kun7qEYO<ftuqu#!w?7BCmyS7N@^{ z)&!%+Z3c7l*FE#{X9KQTLvYtr1Q9vee#~F>=9oPwYf(o=a7u0y|EJ)3MQeVK|516< zz>-mQziB*9*WJ7-GnKMmgb7v@HD2Gtp$KN70C}`ygVsUTktIF|?Iv&_fMq%L1_t3Q zUZieL;Qb<TZ<bYOF2KAus66&@t^sv`w^-71s%F33m7BD?*{Ng~LpJx76F@8MD9h2I z!_LxSZ$2VjTjk&@E<!i2NK%eBHwLY)v}(h>U^i<MvhJJ99Bnh*tjp!#3Gk4q{(Ge; ze*HP1QJ2BTESr7DP>=e<8~xh5q@t%H08;YvuxRkc4J~t0sR)c*@G7M0|AKV_#>v3z z5^$<uZ|484LR|6RDi1CCpgzM~90m*?>%g{WlN8DDtmNk5ttS7is{1V1e#e{q<`G&} zcO0<N&BjIB+~>jX079M21`*3~Cr~@xh(h1O`fU4##<+1Wj6yXS87xHG{N-kq=#^Ch zc=udI$A3%iG-Ff|+EAze$g*4?Vg0@9UQI1A>H2ru;;##CHY$pw!llzArSZckM1TpL z$_(%SwqFim;Q+0eqSJ23%1v*~!jYNFgy}GsK|p?%$(GxsMUN=AjIYxGeiK<!WTtY6 z?EdwCg6@5zKxTNQ!UX+T+LDNiIgn<YbwYt60%5906#RIJ9s({$kBE^AI!bX04@DH5 zgm+oP0ZBfd;nc9Dl7til`&vAMQyMyNO>y!=?XXbsMA5X>^B0b;Fa8T^B*dzIst31q zHAl{Fld^zg3PxzN<609B7zxnINbbOG(riM9{B^qi2T_Vum*t-RH&&3XThPMgFZtYV zRZk?joBRxe;)jPsgmBdBz$IY%0l2JnKf`;1E_|a|YBZ_@0XS6NkX_>azGA7gN9?ww zC0ruG?>$=H(nR31Dyo-|d#>Ej(SvqYza2#FP-9iT=-*>i{d-4|LVnJ7S{XSsm~eiH zf3X4uH}!>E8j^=(n+YarLx2&`kc>tG`w!QPy3%LsO2tEd^oGjDP<yOjBfp{zmk1so z^gdt{Iq<JP$~iO;gj%N<RJ~bw>x%F6e&+K11>b2Yl=5venHd*Q=CZFP1(Y0LamRv2 z^)1DmCQGN7WLod`H{()vu+XX-_w$bo4zpp|H@t6$o%n(vR>pv|(vfxR4)F`48G*k2 z0`Iw76Rfmd`|`N`W^T+jJ7LGp4;~HC+KJ89$;rtJX{@IOq2U9fcBX;nqe?#sS?&UU z)t?jMPx~qwL9O~XaLDd34YQ51S~i#VdmvUrqD`Ra(x@+ZX<9sVHrU(SixLT|Co#pN zi+_>*f}r#<;xGu18A0OD=(y4#T8*nQzm}_gONOgIMIu27Jl|ct=Y=})Ku@5?rNgyv zi1y{3Z`R7-k5ZU$kh&gPT3X5iCC7_urN*fCe}7E^I*s)PkVD<U?^b}ejSj`K0!;q( z$26CLefwYKcH6z09<g-ZO?wmu!ja2(t~q_?pG!0d!p_ZkN=Zop-27Me_V#(+zL^H3 z9XoB}BtUn4Q%DK^R6mdC?POe@z$E+JQLvejfl`8b?Ai!9o4ik%aj610z|Gh9G;i70 zAEPg?k&snVUVg3P%F+rmRcwSk>_X-cQAssCT89IiDOAz08DAi45rLw({|q*`)4pcB zI$v+KdD-^~pgAESAqOX?ttIQ}$8b*32+I?L;^Jbl8spN3>Xf>!!Je<;DuQW3C%(qq za67~I)}LNs$h3SirSHqhozHy#{@p!MbCDRc-IpS5)*6)Y%pUdQcR^vHKytT9uho7j zaB0C=OhhD5EM`77o~uHW&$H+@ex2$~v3W_L8ZgzIWo&3DV<ei4xFaijdW-Y>FEesO zQ`5XLhv|@5zjfW>p_EUbejm-tm`wwA@Mmvt&%Cs>v_-X(OZP>#An8-qHjD>3a7Ol` zs20J5gAdrAwon3gS(h1XxliV?M*_(avzf6mlPra_lQ;~i#?t95EGl|+dbmE)`mpc~ z@@*T_sbL$23dm09c$5RJS)hUr@pQSMixca$!!zev<I)eA%cO~$MrLLOLv}__y!~lE zeE9Hh{jhys2_Db$YhZYIxQ?El{yM<Xag)kdLRVBNR6E_GuOlCPEESL!iy-WQ5YW@n znaKc4qNt#4VmunRn=;gca{pqF1LgZ(>K0q3Q$oRuz$8m>>*I=V=JI)vWYlN>!otF= z;vqY=@lCJlA-hv`SCPN>dD}9t=Yh(r2_Cm}MIvrqKC&(6wK0kkmyp<f^a^p|nETfT zM4?KF+1|FLgm=W*)kJNd--ltFMWQ}GxpU`ER%%*W)5v~v>HGKZQ)1vykCNs484^Ib zAWg}YdsdBY<5r8g=()JKK+&oG?J#Q<^}$0DqPNe(EY%xK{}2W*`!*~->j-Fd+zrff zYtYKqQ-n*DfL6Be>6bq18?vk6c4a9C8V@RU@C}Vb4@kvvb{B$P_3!R{XDq7Pto%B2 z`}_ylR$M;}881MhESN}y*|vV&7)tS&{;i_AT+f~8Es;b`K(_C8a^c9chETmP9xs4P zEpPdw?AF)UyVbXf)|3L_`}bepkTFfVjIa2kwA1B%_p&~AFN$rd6qj?yyquHS;>zQC zoUfOoFX(7O;uW&6^cniqto(^+a`pD-Hw^5mAR75TAp^n0bKqXf*5v5ui41AN*A$RC zc=SofM_KTw+)g|&#sq?>@7}^M6w900dFe$}j865~hK3BSVe!bizTnf}i?=NqsGwkt zgh>wxT_yc5`Y9<X*~X<*Z!E1G`7QMzK*!0l{!SpSUEDM!GgE=RbNBs&+)C|EB8rX5 zN}}h^*cLE3<7O6QDV7~^#U5^XGTQ5xYWIks6#pGCo#m%~LkU=f-WRQ=sRGloipolD zh6g2OqJvJICz#H?y#Zuj=BH0T_vP0P2?NaCgh{vqaJfTvf1T>|>~C>u_!SDPIbJ?G z!I;Z>tn@o4buV@pl$oAVzcS^>8yvIAxG#PMlqW4<Nu{lx%9ov2rQ#&!^<!cs`huW| zuP}HB`qwXkuR~0Q+EYIc4oC>ddhQ@lk#FA;8kf>N*8lvh_;K+NVMknV@B44k*&CGg z4GoGcbqzt6Ox@klC1qt57|fraKkucbt$&*cO%{x>Od;y})4nf{va(u=#%${Z9Q;+g zW<K?mqIxAcYe+zl0eXj!e|2X2!p?4O8i>Qa8Aqq3Vu$j8eQbL9r(HsbtS)G(UYC#X z4der2aBwK8#$b}-oAm^$>+20K4#1=ixMP7tO=%I6S>H^Aq~xIkOXvGygYqlF40QI| z^ZH*5O#nvu$u5XPcmm<id|$rYt=Oz2V3PxGQ#Ucel&9R*{Pc8b&F9#cAyHb;-?jR1 z00{YBUPnL*G9D>=e*WYY4jfp&S6N!@1rfiBj8k@EfA@K%Ani)32;NBX!Xi1_P{`p! z@b7t5u6|0k9M)}8)e92~VXz()NEHfo4Gq4Yfq{Y1+Q%;>hmq$=0dbs_%LD<V%Uuta zGSbtV`-VM_lL9G3NJsk$+1^|n+50^oIcLOdQ$rP#+UgV4@j}g2wBNW<7!^qdd(8f< z!o3HYYj2o(a)Io|HnmBfoBbX67EPhS4zT%T<EtSDscq*qN52!r*P&j-K%nmeQs{iw z*gG<gJJPg2Kia=M&0)D+WZBGxJEr$K@1RkHD>hA80eG8P+Nq+p_V@TW>8D;1ruUCF z@6{|k@~bKRFvWvm(s8jbR?Mx`$mQ%L`zZR$=f@~7A0NAtG00sVTr}YB_iZW^AjnEr z`JR00U3#7PiP`$QYg$bWb4lsc%-T>l2yh$0L_xJ!Hg1x9;>rq_$d{ekdZNjMA#tUp z_$DSM4vv!b9;;l%#X`U*L*vFjYiok8lLb?352YK4f&5;-?7OcNY4l3x(Jhe4yHsOY zFawI8a<qE*lU-$Ua`d3zIVljDz01nVt{99OOQFbK2YIQ{YQ)zGINQvoK4Wo5sbY&6 zB8sQ=(+A}HTjI|cn#dO{)EM4O_ZC^X*W2oLR41-}B#fOxxNIoIDU%8E@yhp6`*Y&Y zaLhieiCKv=XGd5#0IeElBuMGK!@T$ve{%PkgNk4BY-Px~<a-1(&L@)(8RNVyKD{Ha zLx@%&9WzwDrUfpZAgDN|M@N0wUx~FCm)3T(|H`2UWC!FFOz={Be&J7TU<UC{`X7k8 zG(SH-S}9Tz-OwQWb%-^!deD*}=PRYPm6iGe2=-NNW;BLz1>pVXG$u+(OH0#BOGyQR z_9DD?W)!UnC%F!oK5Ll+NyW)2h6A2G2v$FYvvlu501uOf?h$;0IhZzjtX|V7eN(*R zCudja0kU_0hpntfzcY!_M17=cClC@-($eraG!l5L9=b$J(18q|-@dZpBuF$gF*ObF z29lh!m9=$NSPZ<Rq=ben({erUWfZbC=qmReo=dTKNd@h5XE}wg8bu11g)Yh(A%&}x zd3z6ULbfJE9$>U;?=Co}KuKnSheOwkUkWqt0VdAc)$_-$=J#TEaue@v#ih?9rS%aK zE(WPd!T8ZK*x)+m@ed%fx^0YBIy8r^kCcmXEz{^fdHW^xO{XZ?%mWx3ir?xKIqFmw z`mDIdZD*#f8nf;H8(OL_D0re$J=T+Y9$F8bkd-d$=GZ5udHzyvdVSou^e2#&cIC-A zp&AL1BWC`arH6-y-ofPPShT%5n7v6LIRmso%1;SLTX=fb09PoRQ&Us@6X8X{;(+FW zE0h47o0FNA`r^Iz$(8d;Jd9lh9)Pp9v<&WuAYWgwc64;yPc$&|h1Elw$xZRgxJ!d8 z*Z%<3OG_}+R<n%D<imJ4G5u9O1y}QOra#8POkRSMV8YbMX!h)I{rQv)t*>K0-`R>M z2In5NH71H5XwYgO{fE?DK8h=b9iiP|%Bzvkv#FWD<9oW8jDsjVxXMb37eR$e@F0NP z_|S&iBwlra;>q9j^42S{`+fV`Sqhi1ckg1h&sk(#ZmcUQIk_n;JM!Zhc~FWEQY?X7 zdD`;t_L!Ui{$m;m1fp+aLl|k$ym&Zbj=G+YMFi2?9+|6Nm45`idn#=KTZU|itnBv@ z4%qCEkB`sIc0}k9C{oa#ejy-Z$$nPM8J0a{w;5@RSn+Ifyoz08gDPSHSSIT_2R-z& zCi?lO>!(t{P8&fq;-rn-3||z2D0q1##u@Iv0YT3Qqg(J7iAu7EQcx$e5x;=-f1mCz zqk;e=5a%Ttx_z$o=#j+z`;Ur;Ubwo(CnnMw1L&g!9iv#zOm_(|ekwlDDdy{0dU++K zrZR?bbiv6RTEl(j-%FQW?L;5~63KRfo3Ehmu3w5js}3V1HggvG>A`N<Z*3Pw-PPi_ z|FR+ck2b8gG3Q%+0XXuW?8H*f2>_$}`lbT!`qZl(=V#b@`D}!UM3An72xwoV>T2ug zShw9Tt?9c6;)IsB9F42}cP`*k<ThlRGkk{o)lMH!^*vHVvp9M&$)0U+&XCQl071FM zx-T=(($aGFRb}e>{Q2290N^T`n|t>5Zohx<vX2H%%7x!j2ISf=Uj(eItN<hoX?Dna z`2_UO3;56LUfe}*zW226vYL8(YqF@|p*O1$v3OD&0(R3!SI~p<#&P%m!HXDNjQPN) zlPT-I)bpXbx|-me5Lx*BY0MY)P6>N^X~X9&ZNGotPD@LBu2}Bc0o=r-fa(`NEhs2R zNl)+j{pEuShe|?eG;{_q1GDqtI?Q2iO^xL1z1CQ*^FX+1j`G!J&lj(Uz?6JjxtG;Y z%^1%e3mK4<0gw|bx%>{6Z@cySs=CJ5@r5oJ9>S5PCr83PzDf7~Cmm4sn6?JJ9~z<s z>Yz7g*`dZHa;(IWpCeaS8P^W)4Gs?eTlWm%P`9RwdGbMFO9%u!(3@-?blOoj?YI7d zr4yl8d&FK49d%KhjT@!C9KGqIbEp{OeOL$wkbT=Z@aCS?!9w;=Sy>4A5>OFi@aG~G znneEOhw$0_4sYkms;ZC1#1BhKgaJqq^bqq+`yiBnoHJ}@rcL={_iI4pMbGR3^xHJ` zyMV^IZi4ZYfD-*6_ixaCuXK6PaT6|(V65Hz0o4`X>e16z)2MI>krM%6+II;9%5?o- z#BJa_|B4yk>5KOE_O}G=0XsR=eA?-P$wG^pM92nHfQzRqm<Uu#AG>J<6YcH^SR=pa zFHL#l@E3S;=|!7KcveU+ipw#Yxqnwq^Ou(CWxO_CX%46S`ejSTdM|xg5+1|S5c(h& zP#BOhZKUd|WbtcjKYcTP^!`E<H2&T71ss`Bd!h$=_Uu{hG~fco&Y07sb3oGuaVo6| zq6VuJD8kfj+^ctZK~nX1XRbmtscY4nD7XXv(!P59Taxqp<WRAJn0breVTN(3*UrB$ zPrNhld9M8fKx51q2A3<U!v60;){oA+>o5SWYUXP;m@ZXz{&_vO)6f@~={Cj<x6l<b zhey5~9j5|z_(ZQ;Lj^z<Qqqg*c$n?#nxU1(x{<q!Qal=5Wu^^PM`!Eh=0WG1b*KTS zx^hm9tIAr_I7@*t5C|{h=6eB@&rTn9t!cg9i}jBCep9hgOH@hzZlvN?wIDpj%LH2i z>Cj5dwBBX6J)HQa!o^-5<4_~dy{A0qR{p*O8Y~Ppf<l38h)o;6vhz{?6<X!~Wttux zgw=V#RK4Hf+S!D2YvAQ(9S+l6RrT5U@D|VCa!%NRU!$2K6^c~g+a^Yg;Rz65TPZx2 zik!JhgPA>o{yiDLJ?J1+2$<z!v{>uKo(GNUoz7VH*7<*5<YFh?`|hiev!rCf2U9ho zWQyu)t-2>Tm&pPI{#Gh97LrTjo?HxARWqW1Xeh04G84KeJ?(S(8z^(B5=OgMtMWwF zMv3;E>lF*rwljG!H?~Fo9RAV71@APpjPpq(byrFojrf>dO~G_x%2_qy+~5P?Hr2q1 zM`pRzwo;nrV{&i)IyR*Ui>GKOAW>SXyCo~vUct(_@@<7xT4i(MdHh!LU8eU(i9*TJ zIREXr-%Z<Qre`}H<aB^IpAEMDuxl(~h`twuXS*acS2r5EgdqiPld%`g{%}yzRgF?4 zP1R2CPfkose4A|M_vLEfq1e#ieoaS2Y!3?}=*7{&>YzJd^q(@bvdS}M_q!Z0l2UcB z-0vCZ#F6q17|e9gc1tvnrh+UzZEaom2l5{l(~Du6!aO2|YZmbb-nCj9{X?_)*|$1J zmd{jy>ZJcI&~o1P*HtQ@Dqc`+GyOW=_-XnHSg^*p<>+9rk8MX@%<pK7o(!r;5oWo7 zxIAzNEMY;Fa?*3;i(Tn6#v*Rx1Y{Gbi3y=|>t*iGwKdK32ZuiZFRQ|Q^JqCdns9am zDij?l)ZPbj>FK~@*2QFJ&bP%tQ$AH1xIl_20={rS9Z}oiy9t0c8UB?Q*#+MO3m^Wd z(iiFcJ+3!EcbVD-<ht(1G^>NJ^UK1zF4-25%zk~H#ih@R^WRK3*+(-4RBKrOUjX0$ zAO8$KQv@~(mWH-g_p0aatJdBICjbsMC{ijxPy{X+OIcf+q*qI%-LIado~uurrO%?H zLkWOBzP>I3Ep4q@Y?TJpg+O0)p=fH)h_(0K7H|UKFbH%(@aYg)Cw62kCh2wJ2XxPy zSM*!dXV)=Bplw-N1&b~gV?SR1t%4H(hwVUbv2|ex23Yj#`?da%uRuz)bxhtG(5(XV zn7U4Xh67Fj9Cj8S-Qv)1t?ugwLANzvt`p03j_f_)1i;}|!z)-10^1~;j^HEU{|8VP Vlw6#aHG=>E002ovPDHLkV1n*b4E+EA diff --git a/Examples/Data/Textures/mine.png b/Examples/Data/Textures/mine.png deleted file mode 100644 index 6d3fab94d7fa5d2583a267dc284f9465a84ac80f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40830 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 diff --git a/Examples/Data/Textures/swizzled-rock-diffuse-height.dds b/Examples/Data/Textures/swizzled-rock-diffuse-height.dds deleted file mode 100644 index c7557fa067040fb83969f05f540735fd7a7a7270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349648 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	|=1<1^TayrP(JfWK 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	Kqr%d!|#4C<j)Z7egesu<a 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	K1uAANLzSeoz^_%A?w{f7SVFczyK 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 z≷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 diff --git a/Examples/Data/Textures/swizzled-rock-normal-gloss.dds b/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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 b13I^MqU6UKixm|O2H=%++4JlUkc$03K_FCX diff --git a/Examples/ExampleBrowser.Designer.cs b/Examples/ExampleBrowser.Designer.cs deleted file mode 100644 index 5537c3d..0000000 --- a/Examples/ExampleBrowser.Designer.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace Examples -{ - partial class ExampleBrowser - { - /// <summary> - /// Required designer variable. - /// </summary> - private System.ComponentModel.IContainer components = null; - - /// <summary> - /// Clean up any resources being used. - /// </summary> - /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// <summary> - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// </summary> - private void InitializeComponent() - { - this.treeViewExamples = new System.Windows.Forms.TreeView(); - this.label1 = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // treeViewExamples - // - this.treeViewExamples.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.treeViewExamples.Location = new System.Drawing.Point(12, 25); - this.treeViewExamples.Name = "treeViewExamples"; - this.treeViewExamples.Size = new System.Drawing.Size(344, 297); - this.treeViewExamples.TabIndex = 1; - this.treeViewExamples.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.TreeViewExamples_NodeMouseDoubleClick); - this.treeViewExamples.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TreeViewExamples_KeyDown); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(185, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Example projects: Double-click to run."; - // - // ExampleBrowser - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(368, 334); - this.Controls.Add(this.label1); - this.Controls.Add(this.treeViewExamples); - this.KeyPreview = true; - this.Name = "ExampleBrowser"; - this.Text = "ObjectTK example projects"; - this.Load += new System.EventHandler(this.ExampleBrowser_Load); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ExampleBrowser_KeyDown); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TreeView treeViewExamples; - private System.Windows.Forms.Label label1; - } -} \ No newline at end of file diff --git a/Examples/ExampleBrowser.cs b/Examples/ExampleBrowser.cs deleted file mode 100644 index 9bb31d1..0000000 --- a/Examples/ExampleBrowser.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Windows.Forms; -using ObjectTK; -using OpenTK; - -namespace Examples -{ - public partial class ExampleBrowser - : Form - { - private Dictionary<string, Type> _examples; - - public ExampleBrowser() - { - InitializeComponent(); - } - - private void ExampleBrowser_Load(object sender, EventArgs e) - { - // find example projects - var baseType = typeof (ExampleWindow); - var types = Assembly.GetExecutingAssembly().GetTypes().Where(_ => _ != baseType && baseType.IsAssignableFrom(_)); - // add tree nodes for example projects - _examples = new Dictionary<string, Type>(); - foreach (var type in types) - { - // find or create node for namespace - var existingNodes = treeViewExamples.Nodes.Find(type.Namespace, false); - var node = existingNodes.Length > 0 - ? existingNodes[0] - : treeViewExamples.Nodes.Add(type.Namespace, type.Namespace); - // add node for this example and get the caption from the attribute - var captionAttribute = type.GetCustomAttributes<ExampleProjectAttribute>(false).FirstOrDefault(); - node.Nodes.Add(type.Name, captionAttribute == null ? type.Name : captionAttribute.Caption); - // remember example type - _examples.Add(type.Name, type); - } - // show all examples - treeViewExamples.ExpandAll(); - } - - private void ExampleBrowser_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) Close(); - } - - private void TreeViewExamples_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) RunExample(treeViewExamples.SelectedNode); - } - - private void TreeViewExamples_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) - { - RunExample(e.Node); - } - - private void RunExample(TreeNode node) - { - Type type; - if (!_examples.TryGetValue(node.Name, out type)) return; - // hide browser - Hide(); - // run the example - using (var exampleWindow = (GameWindow)Activator.CreateInstance(type)) - { - exampleWindow.Title = node.Text; - exampleWindow.Run(); - } - // show the browser again - Show(); - } - } -} diff --git a/Examples/ExampleBrowserEntry.cs b/Examples/ExampleBrowserEntry.cs deleted file mode 100644 index 34f7011..0000000 --- a/Examples/ExampleBrowserEntry.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Windows.Forms; -using log4net.Config; - -namespace Examples -{ - public static class ExampleBrowserEntry - { - [STAThread] - public static void Main() - { - // initialize log4net via app.config if available - if (ObjectTK.Logging.LogFactory.IsAvailable) - ConfigureLogging(); - - // show example browser - using (var browser = new ExampleBrowser()) - { - Application.Run(browser); - } - } - - public static void ConfigureLogging() - { - XmlConfigurator.Configure(); - } - } -} diff --git a/Examples/ExampleProjectAttribute.cs b/Examples/ExampleProjectAttribute.cs deleted file mode 100644 index 77e1e92..0000000 --- a/Examples/ExampleProjectAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Examples -{ - [AttributeUsage(AttributeTargets.Class)] - public class ExampleProjectAttribute - : Attribute - { - public readonly string Caption; - - public ExampleProjectAttribute(string caption) - { - Caption = caption; - } - } -} \ No newline at end of file diff --git a/Examples/ExampleWindow.cs b/Examples/ExampleWindow.cs deleted file mode 100644 index b36e148..0000000 --- a/Examples/ExampleWindow.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using ObjectTK; -using ObjectTK.Shaders; -using ObjectTK.Tools; -using ObjectTK.Tools.Cameras; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Input; - -namespace Examples -{ - /// <summary> - /// Provides common functionality for the examples. - /// </summary> - public class ExampleWindow - : DerpWindow - { - protected Camera Camera; - protected Matrix4 ModelView; - protected Matrix4 Projection; - protected string OriginalTitle { get; private set; } - - public ExampleWindow() - : base(800, 600, GraphicsMode.Default, "") - { - // disable vsync - VSync = VSyncMode.Off; - // set up camera - Camera = new Camera(); - Camera.SetBehavior(new ThirdPersonBehavior()); - Camera.DefaultState.Position.Z = 5; - Camera.ResetToDefault(); - Camera.Enable(this); - ResetMatrices(); - // hook up events - Load += OnLoad; - Unload += OnUnload; - KeyDown += OnKeyDown; - RenderFrame += OnRenderFrame; - } - - private void OnLoad(object sender, EventArgs e) - { - // maximize window - WindowState = WindowState.Maximized; - // remember original title - OriginalTitle = Title; - // set search path for shader files and extension - ProgramFactory.BasePath = "Data/Shaders/"; - ProgramFactory.Extension = "glsl"; - } - - private void OnUnload(object sender, EventArgs e) - { - // release all gl resources on unload - GLResource.DisposeAll(this); - } - - private void OnRenderFrame(object sender, FrameEventArgs e) - { - // display FPS in the window title - Title = string.Format("ObjectTK example: {0} - FPS {1}", OriginalTitle, FrameTimer.FpsBasedOnFramesRendered); - } - - private void OnKeyDown(object sender, KeyboardKeyEventArgs e) - { - // close window on escape press - if (e.Key == Key.Escape) Close(); - // reset camera to default position and orientation on R press - if (e.Key == Key.R) Camera.ResetToDefault(); - } - - /// <summary> - /// Resets the ModelView and Projection matrices to the identity. - /// </summary> - protected void ResetMatrices() - { - ModelView = Matrix4.Identity; - Projection = Matrix4.Identity; - } - - /// <summary> - /// Sets a perspective projection matrix and applies the camera transformation on the modelview matrix. - /// </summary> - protected void SetupPerspective() - { - // setup perspective projection - var aspectRatio = Width / (float)Height; - Projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 0.1f, 1000); - ModelView = Matrix4.Identity; - // apply camera transform - ModelView = Camera.GetCameraTransform(); - } - } -} \ No newline at end of file diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj deleted file mode 100644 index 2490c61..0000000 --- a/Examples/Examples.csproj +++ /dev/null @@ -1,130 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProjectGuid>{B05720A6-8E0A-4D53-96D1-AA341AE0D0D5}</ProjectGuid> - <OutputType>WinExe</OutputType> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>Examples</RootNamespace> - <AssemblyName>Examples</AssemblyName> - <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> - <FileAlignment>512</FileAlignment> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <ItemGroup> - <Reference Include="log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath> - </Reference> - <Reference Include="OpenTK, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Core" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.Windows.Forms" /> - </ItemGroup> - <ItemGroup> - <Compile Include="AdvancedExamples\FeedbackGravityExample.cs" /> - <Compile Include="AdvancedExamples\LoaderDDS.cs" /> - <Compile Include="AdvancedExamples\LoaderStatics.cs" /> - <Compile Include="AdvancedExamples\ParallaxMappingExample.cs" /> - <Compile Include="BasicExamples\RotatingTexturedCubeExample.cs" /> - <Compile Include="BasicExamples\TextureGridExample.cs" /> - <Compile Include="BasicExamples\SkyboxExample.cs" /> - <Compile Include="ExampleProjectAttribute.cs" /> - <Compile Include="Shaders\ParallaxProgram.cs" /> - <Compile Include="Shaders\SimpleColorProgram.cs" /> - <Compile Include="Shaders\SimpleTextureProgram.cs" /> - <Compile Include="Shaders\ExampleProgram.cs" /> - <Compile Include="AdvancedExamples\RenderToTextureExample.cs" /> - <Compile Include="BasicExamples\BufferLayoutTexturingExample.cs" /> - <Compile Include="BasicExamples\MinimalExample.cs" /> - <Compile Include="ExampleBrowser.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="ExampleBrowser.Designer.cs"> - <DependentUpon>ExampleBrowser.cs</DependentUpon> - </Compile> - <Compile Include="ExampleWindow.cs" /> - <Compile Include="ExampleBrowserEntry.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="Shaders\SkyboxProgram.cs" /> - <Compile Include="Shaders\GravityProgram.cs" /> - <Compile Include="Shaders\TextureGridProgram.cs" /> - </ItemGroup> - <ItemGroup> - <None Include="Data\Shaders\ExampleShader.glsl" /> - <None Include="Data\Shaders\Gravity.glsl" /> - <None Include="Data\Shaders\Parallax.glsl" /> - <None Include="Data\Shaders\SimpleColor.glsl" /> - <None Include="Data\Shaders\SimpleTexture.glsl" /> - <None Include="app.config" /> - <None Include="Data\Shaders\Skybox.glsl" /> - <None Include="Data\Shaders\TextureGrid.glsl" /> - <None Include="packages.config" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\ObjectTK.Compiler\ObjectTK.Compiler.csproj"> - <Project>{abd0be84-792d-4f52-82e2-c869585b3c29}</Project> - <Name>ObjectTK.Compiler</Name> - </ProjectReference> - <ProjectReference Include="..\ObjectTK.Tools\ObjectTK.Tools.csproj"> - <Project>{E38997F8-7ECE-4B35-BB94-7E609F68D217}</Project> - <Name>ObjectTK.Tools</Name> - </ProjectReference> - <ProjectReference Include="..\ObjectTK\ObjectTK.csproj"> - <Project>{0ee3347b-1bbe-44ca-8295-22da13ae914a}</Project> - <Name>ObjectTK</Name> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <Content Include="Data\Textures\checker.jpg" /> - <Content Include="Data\Textures\city0.jpg" /> - <Content Include="Data\Textures\city1.jpg" /> - <Content Include="Data\Textures\city2.jpg" /> - <Content Include="Data\Textures\city3.jpg" /> - <Content Include="Data\Textures\city4.jpg" /> - <Content Include="Data\Textures\city5.jpg" /> - <Content Include="Data\Textures\crate.png" /> - <Content Include="Data\Textures\empty.png" /> - <Content Include="Data\Textures\flag.png" /> - <Content Include="Data\Textures\mine.png" /> - <Content Include="Data\Textures\swizzled-rock-diffuse-height.dds" /> - <Content Include="Data\Textures\swizzled-rock-normal-gloss.dds" /> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <PropertyGroup> - <PostBuildEvent>rd /Q /S "$(TargetDir)Data" -xcopy "$(ProjectDir)Data" "$(TargetDir)Data" /E /R /K /Y /I /D /H -"$(TargetDir)ObjectTKC.exe" "$(TargetPath)"</PostBuildEvent> - </PropertyGroup> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project> \ No newline at end of file diff --git a/Examples/Properties/AssemblyInfo.cs b/Examples/Properties/AssemblyInfo.cs deleted file mode 100644 index 820304a..0000000 --- a/Examples/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Reflection; -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("ObjectTK examples")] -[assembly: AssemblyDescription("Examples to demonstrate usage of ObjectTK")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("JcBernack")] -[assembly: AssemblyProduct("ObjectTK")] -[assembly: AssemblyCopyright("Copyright © 2014-2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("eb0408f7-0a84-44e6-8118-8fd02e0c5243")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.*")] diff --git a/Examples/Shaders/ExampleProgram.cs b/Examples/Shaders/ExampleProgram.cs deleted file mode 100644 index 3d15ad6..0000000 --- a/Examples/Shaders/ExampleProgram.cs +++ /dev/null @@ -1,19 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("ExampleShader.Vertex")] - [FragmentShaderSource("ExampleShader.Fragment")] - public class ExampleProgram - : Program - { - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/Shaders/GravityProgram.cs b/Examples/Shaders/GravityProgram.cs deleted file mode 100644 index 7efd1ff..0000000 --- a/Examples/Shaders/GravityProgram.cs +++ /dev/null @@ -1,32 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("Gravity.Vertex")] - [FragmentShaderSource("Gravity.Fragment")] - public class GravityProgram - : TransformProgram - { - public GravityProgram() - { - // define transform feedback varyings and add padding to achieve 16-byte alignment with 3-component vectors - FeedbackVaryings(TransformFeedbackMode.InterleavedAttribs, OutPosition, SkipComponents1, OutVelocity, SkipComponents1); - } - - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InVelocity { get; protected set; } - - public TransformOut OutPosition { get; protected set; } - public TransformOut OutVelocity { get; protected set; } - - public Uniform<float> CenterMass { get; protected set; } - public Uniform<float> TimeStep { get; protected set; } - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/Shaders/ParallaxProgram.cs b/Examples/Shaders/ParallaxProgram.cs deleted file mode 100644 index 737d617..0000000 --- a/Examples/Shaders/ParallaxProgram.cs +++ /dev/null @@ -1,38 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("Parallax.Vertex")] - [FragmentShaderSource("Parallax.Fragment")] - public class ParallaxProgram - : Program - { - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InNormal { get; protected set; } - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InTangent { get; protected set; } - [VertexAttrib(2, VertexAttribPointerType.Float)] - public VertexAttrib InTexCoord { get; protected set; } - - public Uniform<Matrix4> ModelViewMatrix { get; protected set; } - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - public Uniform<Matrix3> NormalMatrix { get; protected set; } - - public Uniform<Vector3> Light_Position { get; protected set; } - public Uniform<Vector3> Camera_Position { get; protected set; } - - public TextureUniform<Texture2D> Material_DiffuseAndHeight { get; protected set; } - public TextureUniform<Texture2D> Material_NormalAndGloss { get; protected set; } - public Uniform<Vector3> Material_ScaleBiasShininess { get; protected set; } - - public Uniform<Vector3> Light_DiffuseColor { get; protected set; } - public Uniform<Vector3> Light_SpecularColor { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/Shaders/SimpleColorProgram.cs b/Examples/Shaders/SimpleColorProgram.cs deleted file mode 100644 index 67b1aa9..0000000 --- a/Examples/Shaders/SimpleColorProgram.cs +++ /dev/null @@ -1,21 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("SimpleColor.Vertex")] - [FragmentShaderSource("SimpleColor.Fragment")] - public class SimpleColorProgram - : Program - { - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - [VertexAttrib(4, VertexAttribPointerType.UnsignedByte, true)] - public VertexAttrib InColor { get; protected set; } - - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/Shaders/SimpleTextureProgram.cs b/Examples/Shaders/SimpleTextureProgram.cs deleted file mode 100644 index 4613e8e..0000000 --- a/Examples/Shaders/SimpleTextureProgram.cs +++ /dev/null @@ -1,25 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("SimpleTexture.Vertex")] - [FragmentShaderSource("SimpleTexture.Fragment")] - public class SimpleTextureProgram - : Program - { - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - [VertexAttrib(2, VertexAttribPointerType.Float)] - public VertexAttrib InTexCoord { get; protected set; } - - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - - public TextureUniform<Texture2D> Texture { get; protected set; } - public Uniform<bool> RenderTexCoords { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/Shaders/SkyboxProgram.cs b/Examples/Shaders/SkyboxProgram.cs deleted file mode 100644 index 58ee6cf..0000000 --- a/Examples/Shaders/SkyboxProgram.cs +++ /dev/null @@ -1,21 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("Skybox.Vertex")] - [FragmentShaderSource("Skybox.Fragment")] - public class SkyboxProgram - : Program - { - [VertexAttrib(3, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - public TextureUniform<TextureCubemap> Texture { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/Shaders/TextureGridProgram.cs b/Examples/Shaders/TextureGridProgram.cs deleted file mode 100644 index 8cb2311..0000000 --- a/Examples/Shaders/TextureGridProgram.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using ObjectTK.Shaders.Variables; -using ObjectTK.Textures; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace Examples.Shaders -{ - [VertexShaderSource("TextureGrid.Vertex")] - [GeometryShaderSource("TextureGrid.Geometry")] - [FragmentShaderSource("TextureGrid.Fragment")] - public class TextureGridProgram - : Program - { - [VertexAttrib(2, VertexAttribPointerType.Float)] - public VertexAttrib InPosition { get; protected set; } - [VertexAttrib(1, VertexAttribPointerType.Float)] - public VertexAttrib InTexture { get; protected set; } - - public Uniform<Matrix4> ModelViewProjectionMatrix { get; protected set; } - public TextureUniform<Texture2DArray> TextureData { get; protected set; } - } -} \ No newline at end of file diff --git a/Examples/app.config b/Examples/app.config deleted file mode 100644 index 7db8b13..0000000 --- a/Examples/app.config +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<configuration> - <configSections> - <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> - </configSections> - <log4net> - <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> - <param name="File" value="Log.txt"/> - <param name="AppendToFile" value="false"/> - <layout type="log4net.Layout.PatternLayout"> - <param name="Header" value="[Application startup]
" /> - <param name="Footer" value="[Application shutdown]
" /> - <param name="ConversionPattern" value="%date [%thread] %-5level %class %message%newline" /> - </layout> - </appender> - <root> - <level value="INFO"/> - <appender-ref ref="LogFileAppender"/> - </root> - </log4net> - <startup> - <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> - </startup> -</configuration> diff --git a/Examples/packages.config b/Examples/packages.config deleted file mode 100644 index 338f3df..0000000 --- a/Examples/packages.config +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<packages> - <package id="log4net" version="2.0.3" targetFramework="net40" /> - <package id="OpenTK" version="1.1.1589.5942" targetFramework="net40" /> -</packages> \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 5341a84..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jan Christoph Bernack for the Open Toolkit project. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/ObjectTK.Compiler/ObjectTK.Compiler.csproj b/ObjectTK.Compiler/ObjectTK.Compiler.csproj deleted file mode 100644 index 56d0f91..0000000 --- a/ObjectTK.Compiler/ObjectTK.Compiler.csproj +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProjectGuid>{ABD0BE84-792D-4F52-82E2-C869585B3C29}</ProjectGuid> - <OutputType>Exe</OutputType> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>ObjectTK.Compiler</RootNamespace> - <AssemblyName>ObjectTKC</AssemblyName> - <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> - <FileAlignment>512</FileAlignment> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <ItemGroup> - <Reference Include="OpenTK, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Core" /> - </ItemGroup> - <ItemGroup> - <Compile Include="ShaderCompiler.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - </ItemGroup> - <ItemGroup> - <None Include="app.config" /> - <None Include="packages.config" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\ObjectTK\ObjectTK.csproj"> - <Project>{0EE3347B-1BBE-44CA-8295-22DA13AE914A}</Project> - <Name>ObjectTK</Name> - </ProjectReference> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project> \ No newline at end of file diff --git a/ObjectTK.Compiler/Properties/AssemblyInfo.cs b/ObjectTK.Compiler/Properties/AssemblyInfo.cs deleted file mode 100644 index 96df226..0000000 --- a/ObjectTK.Compiler/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,48 +0,0 @@ -#region License -// ObjectTK License -// Copyright (C) 2013-2015 J.C.Bernack -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -#endregion -using System.Reflection; -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("ObjectTK ShaderCompiler")] -[assembly: AssemblyDescription("Shader compiler for integrated GLSL shader validation in MSBuild and Visual Studio")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("JcBernack")] -[assembly: AssemblyProduct("ObjectTK.Compiler")] -[assembly: AssemblyCopyright("Copyright © 2014-2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8bac61da-d508-4a19-a865-8df2c3bbda59")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.*")] diff --git a/ObjectTK.Compiler/ShaderCompiler.cs b/ObjectTK.Compiler/ShaderCompiler.cs deleted file mode 100644 index 1e4f7ac..0000000 --- a/ObjectTK.Compiler/ShaderCompiler.cs +++ /dev/null @@ -1,102 +0,0 @@ -// -// ShaderCompiler.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using ObjectTK.Exceptions; -using ObjectTK.Shaders; -using ObjectTK.Shaders.Sources; -using OpenTK; - -namespace ObjectTK.Compiler -{ - /// <summary> - /// Compiles all shader programs contained in assemblies given per command line arguments and outputs errors in a MSBuild and Visual Studio friendly way.<br/> - /// </summary> - /// <remarks> - /// The easiest way to use this feature is to add a reference to ObjectTKC so that the executable gets copied to the output folder and add the following Post-build event:<br/> - /// "$(TargetDir)ObjectTKC.exe" "$(TargetPath)" - /// </remarks> - public class ShaderCompiler - { - // GLSL example error messages: - // ERROR: Data/Shaders/ExampleShader.glsl:21: error(#132) Syntax error: "d" parse error - // ERROR: error(#273) 1 compilation errors. No code generated - - /// <summary> - /// Matches essential parts of GLSL error messages. - /// </summary> - private static readonly Regex ErrorRegex = new Regex(@"^ERROR: (.+):(\d+): error\(#(\d+)\) (.*)$", RegexOptions.Multiline); - - /// <summary> - /// Matches essential parts of GLSL warning messages.<br/> - /// TODO: currently untested - /// </summary> - private static readonly Regex WarningRegex = new Regex(@"^WARNING: (.+):(\d+): (.*)$", RegexOptions.Multiline); - - /// <summary> - /// Reformats OpenGL information log to a MSBuild and Visual Studio friendly format. Makes errors and warnings apprear correctly in the "Error List" of Visual Studio. - /// </summary> - /// <param name="infoLog">OpenGL information log.</param> - private static string FormatInfoLog(string infoLog) - { - var log = ErrorRegex.Replace(infoLog, "$1($2): error $3: $4"); - return WarningRegex.Replace(log, "$1($2): warning 0: $3"); - } - - public static void Main(string[] args) - { - // create a hidden GameWindow to initialize an OpenGL context - using (new GameWindow()) - { - // iterate over given arguments - foreach (var path in args) - { - // check if file exists - if (!File.Exists(path)) - { - Console.Out.WriteLine("{0}: error 0: ShaderCompiler: file not found", path); - continue; - } - Console.Out.WriteLine("Compiling shaders of: {0}", path); - // load assembly - var assembly = Assembly.LoadFrom(path); - // set working directory - Directory.SetCurrentDirectory(Path.GetDirectoryName(assembly.Location)); - // iterate over all non-abstract shader programs - foreach (var type in assembly.GetTypes().Where(_ => !_.IsAbstract && typeof(Program).IsAssignableFrom(_))) - { - // check if the program has any shader sources tagged to it - if (ShaderSourceAttribute.GetShaderSources(type).Count == 0) continue; - Console.Out.WriteLine("Compiling: {0}", type.FullName); - // get generic program factory method - var method = typeof(ProgramFactory).GetMethod("Create"); - var generic = method.MakeGenericMethod(type); - try - { - // invoke program factory - var program = (Program)generic.Invoke(null, null); - program.Dispose(); - } - catch (TargetInvocationException ex) - { - Console.Out.WriteLine(ex.InnerException.Message); - // reformat OpenGL information log if existing - var exception = ex.InnerException as ProgramException; - if (exception != null) Console.Out.WriteLine(FormatInfoLog(exception.InfoLog)); - } - } - } - } - } - } -} diff --git a/ObjectTK.Compiler/app.config b/ObjectTK.Compiler/app.config deleted file mode 100644 index b04d010..0000000 --- a/ObjectTK.Compiler/app.config +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<configuration> - <startup> - <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> - </startup> -</configuration> diff --git a/ObjectTK.Compiler/packages.config b/ObjectTK.Compiler/packages.config deleted file mode 100644 index 725fa42..0000000 --- a/ObjectTK.Compiler/packages.config +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<packages> - <package id="OpenTK" version="1.1.1589.5942" targetFramework="net40" /> -</packages> \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/Camera.cs b/ObjectTK.Tools/Cameras/Camera.cs deleted file mode 100644 index 6784c1d..0000000 --- a/ObjectTK.Tools/Cameras/Camera.cs +++ /dev/null @@ -1,122 +0,0 @@ -// -// Camera.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK; -using OpenTK.Input; - -namespace ObjectTK.Tools.Cameras -{ - public class Camera - { - public CameraState State; - public CameraState DefaultState; - protected CameraBehavior Behavior; - - public float MouseMoveSpeed = 0.005f; - public float MouseWheelSpeed = 0.1f; - public float MoveSpeed = 60; - - public Camera() - { - State = new CameraState(); - DefaultState = new CameraState(); - } - - public void ResetToDefault() - { - State.Position = DefaultState.Position; - State.LookAt = DefaultState.LookAt; - State.Up = DefaultState.Up; - Update(); - } - - public void SetBehavior(CameraBehavior behavior) - { - Behavior = behavior; - Update(); - } - - public void Enable(GameWindow window) - { - if (Behavior == null) throw new InvalidOperationException("Can not enable Camera while the Behavior is not set."); - window.UpdateFrame += UpdateFrame; - window.Mouse.Move += MouseMove; - window.Mouse.WheelChanged += MouseWheelChanged; - } - - public void Disable(GameWindow window) - { - window.UpdateFrame -= UpdateFrame; - window.Mouse.Move -= MouseMove; - window.Mouse.WheelChanged -= MouseWheelChanged; - } - - public void Update() - { - if (Behavior != null) Behavior.Initialize(State); - } - - private void UpdateFrame(object sender, FrameEventArgs e) - { - Behavior.UpdateFrame(State, (float) e.Time * MoveSpeed); - } - - private void MouseMove(object sender, MouseMoveEventArgs e) - { - Behavior.MouseMove(State, MouseMoveSpeed * new Vector2(e.XDelta, e.YDelta)); - } - - private void MouseWheelChanged(object sender, MouseWheelEventArgs e) - { - Behavior.MouseWheelChanged(State, MouseWheelSpeed * e.DeltaPrecise); - } - - /// <summary> - /// TODO: add smooth transitions for the CameraState variables - /// </summary> - public Matrix4 GetCameraTransform() - { - // kind of hack: prevent look-at and up directions to be parallel - if (Math.Abs(Vector3.Dot(State.Up, State.LookAt)) > 0.99999999999) State.LookAt += 0.001f * new Vector3(3,5,4); - return Matrix4.LookAt(State.Position, State.Position + State.LookAt, State.Up); - } - - public override string ToString() - { - return string.Format("({0},{1})", State, Behavior); - } - } -} - -// for later use.. -//public Vector3 GetPickingRay(int mouseX, int mouseY) -//{ -// const float fieldOfView = MathHelper.PiOver4; -// const float nearClippingPaneDistance = 1; -// var view = -Position; -// view.Normalize(); -// var cameraUp = Vector3.UnitY; -// var h = Vector3.Cross(view, cameraUp); -// h.Normalize(); -// var v = Vector3.Cross(h, view); -// v.Normalize(); -// var vLength = (float)Math.Tan(fieldOfView / 2) * nearClippingPaneDistance; -// var hLength = vLength * ((float)_window.Width / _window.Height); -// v = v * vLength; -// h = h * hLength; -// //Vector3.Multiply(ref v, vLength, out v); -// //Vector3.Multiply(ref h, hLength, out h); -// // scale mouse position to [-1,1] -// var x = 2f * mouseX / _window.Width - 1; -// var y = 1 - 2f * mouseY / _window.Height; -// var pos = Position + view * nearClippingPaneDistance + h * x + v * y; -// var dir = pos - Position; -// return dir; -//} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/CameraBehavior.cs b/ObjectTK.Tools/Cameras/CameraBehavior.cs deleted file mode 100644 index ebd968b..0000000 --- a/ObjectTK.Tools/Cameras/CameraBehavior.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -// CameraBehavior.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; - -namespace ObjectTK.Tools.Cameras -{ - public abstract class CameraBehavior - { - public virtual void Initialize(CameraState state) { } - public virtual void UpdateFrame(CameraState state, float step) { } - public virtual void MouseMove(CameraState state, Vector2 delta) { } - public virtual void MouseWheelChanged(CameraState state, float delta) { } - - /// <summary> - /// TODO: add possibility to limit the pitch and prevent "flipping over" - /// </summary> - protected void HandleFreeLook(CameraState state, Vector2 delta) - { - var leftRight = Vector3.Cross(state.Up, state.LookAt); - var forward = Vector3.Cross(leftRight, state.Up); - // rotate look at direction - var rot = Matrix4.CreateFromAxisAngle(state.Up, -delta.X) * Matrix4.CreateFromAxisAngle(leftRight, delta.Y); - Vector3.Transform(ref state.LookAt, ref rot, out state.LookAt); - // renormalize to prevent summing up of floating point errors - state.LookAt.Normalize(); - // flip up vector when pitched more than +/-90� from the forward direction - if (Vector3.Dot(state.LookAt, forward) < 0) state.Up *= -1; - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/CameraState.cs b/ObjectTK.Tools/Cameras/CameraState.cs deleted file mode 100644 index 971e9c6..0000000 --- a/ObjectTK.Tools/Cameras/CameraState.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// CameraState.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; - -namespace ObjectTK.Tools.Cameras -{ - /// <summary> - /// Represents the state of a camera.<br/> - /// TODO: Maybe also add field-of-view and z-near/far plane parameter - /// </summary> - public class CameraState - { - public Vector3 Position; - public Vector3 LookAt; - public Vector3 Up; - - public CameraState() - { - LookAt.Z = -1; - Up.Y = 1; - } - - public override string ToString() - { - return string.Format((string) "({0},{1},{2})", (object) Position, (object) LookAt, (object) Up); - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/FreeLookAlignedBehavior.cs b/ObjectTK.Tools/Cameras/FreeLookAlignedBehavior.cs deleted file mode 100644 index ecb95c9..0000000 --- a/ObjectTK.Tools/Cameras/FreeLookAlignedBehavior.cs +++ /dev/null @@ -1,30 +0,0 @@ -// -// FreeLookAlignedBehavior.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; - -namespace ObjectTK.Tools.Cameras -{ - public class FreeLookAlignedBehavior - : FreeLookBehavior - { - public Vector3 AlignmentPoint; - - public override void UpdateFrame(CameraState state, float step) - { - base.UpdateFrame(state, step); - // update the up direction to always point away from the alignment point - var up = state.Position - AlignmentPoint; - up.Normalize(); - // if the angle between the old and new up directions is larger than 90� - // we assume that the camera is upside down and keep it that way - state.Up = Vector3.Dot(state.Up, up) < 0 ? -up : up; - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/FreeLookBehavior.cs b/ObjectTK.Tools/Cameras/FreeLookBehavior.cs deleted file mode 100644 index e2c4e90..0000000 --- a/ObjectTK.Tools/Cameras/FreeLookBehavior.cs +++ /dev/null @@ -1,42 +0,0 @@ -// -// FreeLookBehavior.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Input; - -namespace ObjectTK.Tools.Cameras -{ - public class FreeLookBehavior - : CameraBehavior - { - public override void UpdateFrame(CameraState state, float step) - { - var keyboard = Keyboard.GetState(); - var dir = Vector3.Zero; - var leftRight = Vector3.Cross(state.Up, state.LookAt).Normalized(); - if (keyboard.IsKeyDown(Key.W)) dir += state.LookAt; - if (keyboard.IsKeyDown(Key.S)) dir -= state.LookAt; - if (keyboard.IsKeyDown(Key.A)) dir += leftRight; - if (keyboard.IsKeyDown(Key.D)) dir -= leftRight; - if (keyboard.IsKeyDown(Key.Space)) dir += state.Up; - if (keyboard.IsKeyDown(Key.LControl)) dir -= state.Up; - // normalize dir to enforce consistent movement speed, independent of the number of keys pressed - if (dir.LengthSquared > 0) state.Position += dir.Normalized() * step; - } - - public override void MouseMove(CameraState state, Vector2 delta) - { - var mouse = Mouse.GetState(); - if (mouse.IsButtonDown(MouseButton.Left)) - { - HandleFreeLook(state, delta); - } - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/GimbalBehavior.cs b/ObjectTK.Tools/Cameras/GimbalBehavior.cs deleted file mode 100644 index 65077ae..0000000 --- a/ObjectTK.Tools/Cameras/GimbalBehavior.cs +++ /dev/null @@ -1,33 +0,0 @@ -// -// GimbalBehavior.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Input; - -namespace ObjectTK.Tools.Cameras -{ - /// <summary> - /// TODO: Does not yet work like it should. - /// </summary> - public class GimbalBehavior - : ThirdPersonBehavior - { - public override void MouseMove(CameraState state, Vector2 delta) - { - var mouse = Mouse.GetState(); - if (mouse.IsButtonDown(MouseButton.Left)) - { - base.MouseMove(state, delta); - var leftRight = Vector3.Cross(state.Up, state.LookAt); - Vector3.Cross(ref state.LookAt, ref leftRight, out state.Up); - state.Up.Normalize(); - } - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/ThirdPersonBehavior.cs b/ObjectTK.Tools/Cameras/ThirdPersonBehavior.cs deleted file mode 100644 index dc3a7fd..0000000 --- a/ObjectTK.Tools/Cameras/ThirdPersonBehavior.cs +++ /dev/null @@ -1,54 +0,0 @@ -// -// ThirdPersonBehavior.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Input; - -namespace ObjectTK.Tools.Cameras -{ - public class ThirdPersonBehavior - : CameraBehavior - { - public Vector3 Origin; - - protected void UpdateDistance(CameraState state, float scale) - { - state.Position = Origin - (state.Position - Origin).Length * (1 + scale) * state.LookAt; - } - - public override void Initialize(CameraState state) - { - // recalculate look at direction - state.LookAt = Origin - state.Position; - state.LookAt.Normalize(); - } - - public override void MouseMove(CameraState state, Vector2 delta) - { - var mouse = Mouse.GetState(); - if (mouse.IsButtonDown(MouseButton.Left)) - { - // rotate look direction with mouse - HandleFreeLook(state, delta); - // recalculate the position - UpdateDistance(state, 0); - } - if (mouse.IsButtonDown(MouseButton.Right)) - { - UpdateDistance(state, delta.Y); - } - } - - public override void MouseWheelChanged(CameraState state, float delta) - { - if (delta > 100) delta = 100; - UpdateDistance(state, -delta); - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/DerpWindow.cs b/ObjectTK.Tools/DerpWindow.cs deleted file mode 100644 index 9f82625..0000000 --- a/ObjectTK.Tools/DerpWindow.cs +++ /dev/null @@ -1,62 +0,0 @@ -// -// DerpWindow.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK; -using OpenTK.Graphics; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools -{ - /// <summary> - /// Provides basic functionality to an OpenTK GameWindow such as camera controls, - /// ModelView and Projection matrices and improved timing. - /// </summary> - public abstract class DerpWindow - : GameWindow - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(DerpWindow)); - - protected readonly FrameTimer FrameTimer; - - /// <summary> - /// Initializes a new instance of the DerpWindow class. - /// </summary> - protected DerpWindow(int width, int height, GraphicsMode mode, string title) - : base(width, height, mode, title) - { - // log some OpenGL information - Logger?.Info("OpenGL context information:"); - Logger?.InfoFormat("{0}: {1}", StringName.Vendor, GL.GetString(StringName.Vendor)); - Logger?.InfoFormat("{0}: {1}", StringName.Renderer, GL.GetString(StringName.Renderer)); - Logger?.InfoFormat("{0}: {1}", StringName.Version, GL.GetString(StringName.Version)); - Logger?.InfoFormat("{0}: {1}", StringName.ShadingLanguageVersion, GL.GetString(StringName.ShadingLanguageVersion)); - int numExtensions; - GL.GetInteger(GetPName.NumExtensions, out numExtensions); - Logger?.DebugFormat("Number available extensions: {0}", numExtensions); - for (var i = 0; i < numExtensions; i++) Logger?.DebugFormat("{0}: {1}", i, GL.GetString(StringNameIndexed.Extensions, i)); - Logger?.InfoFormat("Initializing game window: {0}", title); - // set up GameWindow events - Resize += OnResize; - UpdateFrame += OnUpdateFrame; - // set up frame timer - FrameTimer = new FrameTimer(); - } - - private void OnResize(object sender, EventArgs eventArgs) - { - Logger?.InfoFormat("Window resized to: {0}x{1}", Width, Height); - } - - private void OnUpdateFrame(object sender, FrameEventArgs e) - { - FrameTimer.Time(); - } - } -} diff --git a/ObjectTK.Tools/FrameTimer.cs b/ObjectTK.Tools/FrameTimer.cs deleted file mode 100644 index 81517e7..0000000 --- a/ObjectTK.Tools/FrameTimer.cs +++ /dev/null @@ -1,99 +0,0 @@ -// -// FrameTimer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Diagnostics; - -namespace ObjectTK.Tools -{ - /// <summary> - /// Handles frame timing and fps calculation. - /// </summary> - public class FrameTimer - { - /// <summary> - /// Total number of frames rendered. - /// </summary> - public int FramesRendered { get; private set; } - - /// <summary> - /// Time spent for the last completed frame in milliseconds. - /// </summary> - public double FrameTime { get; private set; } - - /// <summary> - /// Frames per second calculated from the time spent on the last frame. - /// </summary> - public double FpsBasedOnFrameTime { get; private set; } - - /// <summary> - /// Frames per second calculated from the number of frames completed within the last second. - /// </summary> - public double FpsBasedOnFramesRendered { get; private set; } - - /// <summary> - /// Total time running in milliseconds. - /// </summary> - public double TimeRunning { get; protected set; } - - private readonly Stopwatch _stopwatch; - private double _elapsed; - private int _fpsFrameCounter; - - private double _lastIntermediateTime; - - /// <summary> - /// Initializes a new instance of the FrameTimer class. - /// </summary> - public FrameTimer() - { - _stopwatch = new Stopwatch(); - //Application.Idle += (sender, args) => Time(); - _stopwatch.Start(); - } - - /// <summary> - /// Calculates timings based on the intervals between subsequent calls. Call once each frame.<br/> - /// Determines frames per seconds and other statistics. - /// </summary> - public void Time() - { - // retrieve time spent since last frame - FrameTime = _stopwatch.Elapsed.TotalMilliseconds; - _stopwatch.Restart(); - // count time running - TimeRunning += FrameTime; - // calculate fps based on time spent on one frame - FpsBasedOnFrameTime = (int) (1000/FrameTime); - // calculate fps based on frames rendered during one second - _elapsed += FrameTime; - _fpsFrameCounter++; - if (_elapsed > 1000) - { - _elapsed -= 1000; - FpsBasedOnFramesRendered = _fpsFrameCounter; - _fpsFrameCounter = 0; - } - // count frames rendered - FramesRendered++; - // reset intermediate timings - _lastIntermediateTime = 0; - } - - /// <summary> - /// Calculates the interval between two subsequent calls in milliseconds. - /// </summary> - public double IntermediateTiming() - { - var elapsed = _stopwatch.Elapsed.TotalMilliseconds; - var time = elapsed - _lastIntermediateTime; - _lastIntermediateTime = elapsed; - return time; - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/ObjectTK.Tools.csproj b/ObjectTK.Tools/ObjectTK.Tools.csproj deleted file mode 100644 index 6b8226a..0000000 --- a/ObjectTK.Tools/ObjectTK.Tools.csproj +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProjectGuid>{E38997F8-7ECE-4B35-BB94-7E609F68D217}</ProjectGuid> - <OutputType>Library</OutputType> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>ObjectTK.Tools</RootNamespace> - <AssemblyName>ObjectTK.Tools</AssemblyName> - <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> - <FileAlignment>512</FileAlignment> - <TargetFrameworkProfile> - </TargetFrameworkProfile> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - <Prefer32Bit>false</Prefer32Bit> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - <Prefer32Bit>false</Prefer32Bit> - </PropertyGroup> - <PropertyGroup> - <StartupObject /> - </PropertyGroup> - <ItemGroup> - <None Include="packages.config" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Cameras\Camera.cs" /> - <Compile Include="Cameras\CameraBehavior.cs" /> - <Compile Include="Cameras\CameraState.cs" /> - <Compile Include="Cameras\FreeLookAlignedBehavior.cs" /> - <Compile Include="Cameras\FreeLookBehavior.cs" /> - <Compile Include="Cameras\GimbalBehavior.cs" /> - <Compile Include="Cameras\ThirdPersonBehavior.cs" /> - <Compile Include="DerpWindow.cs" /> - <Compile Include="FrameTimer.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="Shapes\Circle.cs" /> - <Compile Include="Shapes\ColorCube.cs" /> - <Compile Include="Shapes\ColoredShape.cs" /> - <Compile Include="Shapes\Cube.cs" /> - <Compile Include="Shapes\IndexedShape.cs" /> - <Compile Include="Shapes\LayeredQuads.cs" /> - <Compile Include="Shapes\Quad.cs" /> - <Compile Include="Shapes\Rect.cs" /> - <Compile Include="Shapes\Shape.cs" /> - <Compile Include="Shapes\TexturedCube.cs" /> - <Compile Include="Shapes\TexturedQuad.cs" /> - <Compile Include="Shapes\TexturedShape.cs" /> - </ItemGroup> - <ItemGroup> - <Reference Include="OpenTK, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Drawing" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\ObjectTK\ObjectTK.csproj"> - <Project>{0EE3347B-1BBE-44CA-8295-22DA13AE914A}</Project> - <Name>ObjectTK</Name> - </ProjectReference> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project> \ No newline at end of file diff --git a/ObjectTK.Tools/Properties/AssemblyInfo.cs b/ObjectTK.Tools/Properties/AssemblyInfo.cs deleted file mode 100644 index 082e496..0000000 --- a/ObjectTK.Tools/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,48 +0,0 @@ -#region License -// ObjectTK License -// Copyright (C) 2013-2015 J.C.Bernack -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -#endregion -using System.Reflection; -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("ObjectTK Tools")] -[assembly: AssemblyDescription("Additional features to complement ObjectTK")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("JcBernack")] -[assembly: AssemblyProduct("ObjectTK.Tools")] -[assembly: AssemblyCopyright("Copyright © 2013-2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8133d931-0992-47fd-b4a0-f7ee832615cd")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.*")] \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/Circle.cs b/ObjectTK.Tools/Shapes/Circle.cs deleted file mode 100644 index 3c4cabc..0000000 --- a/ObjectTK.Tools/Shapes/Circle.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// Circle.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class Circle - : Shape - { - public Circle(float radius) - { - DefaultMode = PrimitiveType.TriangleFan; - const int z = 0; - const int slices = 64; - const float dtheta = MathHelper.TwoPi / (slices - 1); - var theta = 0f; - Vertices = new Vector3[slices+1]; - Vertices[0] = new Vector3(0, 0, z); - for (var i = 0; i < slices; i++) - { - Vertices[i+1] = new Vector3((float)Math.Cos(theta) * radius, (float)Math.Sin(theta) * radius, z); - theta += dtheta; - } - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/ColorCube.cs b/ObjectTK.Tools/Shapes/ColorCube.cs deleted file mode 100644 index 0446e94..0000000 --- a/ObjectTK.Tools/Shapes/ColorCube.cs +++ /dev/null @@ -1,45 +0,0 @@ -// -// ColorCube.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class ColorCube - : ColoredShape - { - public ColorCube() - { - DefaultMode = PrimitiveType.Triangles; - - // use default cube - using (var cube = new Cube()) - { - Vertices = cube.Vertices; - Indices = cube.Indices; - } - - // add color to the vertices - Colors = new List<Color> - { - Color.DarkRed, - Color.DarkRed, - Color.Gold, - Color.Gold, - Color.DarkRed, - Color.DarkRed, - Color.Gold, - Color.Gold - }.Select(_ => _.ToRgba32()).ToArray(); - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/ColoredShape.cs b/ObjectTK.Tools/Shapes/ColoredShape.cs deleted file mode 100644 index c9731d7..0000000 --- a/ObjectTK.Tools/Shapes/ColoredShape.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// ColoredShape.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Buffers; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public abstract class ColoredShape - : IndexedShape - { - public uint[] Colors { get; protected set; } - public Buffer<uint> ColorBuffer { get; protected set; } - - public override void UpdateBuffers() - { - base.UpdateBuffers(); - ColorBuffer = new Buffer<uint>(); - ColorBuffer.Init(BufferTarget.ArrayBuffer, Colors); - } - - protected override void Dispose(bool manual) - { - base.Dispose(manual); - if (!manual) return; - if (ColorBuffer != null) ColorBuffer.Dispose(); - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/Cube.cs b/ObjectTK.Tools/Shapes/Cube.cs deleted file mode 100644 index e16c92c..0000000 --- a/ObjectTK.Tools/Shapes/Cube.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// Cube.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class Cube - : IndexedShape - { - public Cube() - { - DefaultMode = PrimitiveType.Triangles; - - Vertices = new[] - { - 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 uint[] - { - // 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 - 5, 1, 0, 0, 4, 5, - // right face - 1, 5, 6, 6, 2, 1 - }; - } - } -} diff --git a/ObjectTK.Tools/Shapes/IndexedShape.cs b/ObjectTK.Tools/Shapes/IndexedShape.cs deleted file mode 100644 index 388a875..0000000 --- a/ObjectTK.Tools/Shapes/IndexedShape.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// IndexedShape.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Buffers; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public abstract class IndexedShape - : Shape - { - public uint[] Indices { get; protected set; } - public Buffer<uint> IndexBuffer { get; protected set; } - - public override void UpdateBuffers() - { - base.UpdateBuffers(); - IndexBuffer = new Buffer<uint>(); - IndexBuffer.Init(BufferTarget.ElementArrayBuffer, Indices); - } - - protected override void Dispose(bool manual) - { - base.Dispose(manual); - if (!manual) return; - if (IndexBuffer != null) IndexBuffer.Dispose(); - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/LayeredQuads.cs b/ObjectTK.Tools/Shapes/LayeredQuads.cs deleted file mode 100644 index 0cfafec..0000000 --- a/ObjectTK.Tools/Shapes/LayeredQuads.cs +++ /dev/null @@ -1,38 +0,0 @@ -// -// LayeredQuads.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class LayeredQuads - : IndexedShape - { - public LayeredQuads(int layers) - { - DefaultMode = PrimitiveType.Triangles; - const float size = 1; - var z = -size / 2f; - var step = size / (layers-1); - Vertices = new Vector3[4*layers]; - Indices = new uint[6*layers]; - var order = new uint[]{ 0, 1, 2, 2, 3, 0 }; - for (uint i = 0; i < layers; ++i) - { - Vertices[i * 4 + 0] = new Vector3(-size / 2, -size / 2, z); - Vertices[i * 4 + 1] = new Vector3(+size / 2, -size / 2, z); - Vertices[i * 4 + 2] = new Vector3(+size / 2, +size / 2, z); - Vertices[i * 4 + 3] = new Vector3(-size / 2, +size / 2, z); - for (uint j = 0; j < 6; j++) Indices[i * 6 + j] = i*4 + order[j]; - z += step; - } - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/Quad.cs b/ObjectTK.Tools/Shapes/Quad.cs deleted file mode 100644 index df6f760..0000000 --- a/ObjectTK.Tools/Shapes/Quad.cs +++ /dev/null @@ -1,34 +0,0 @@ -// -// Quad.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class Quad - : Shape - { - public Quad() - { - DefaultMode = PrimitiveType.TriangleStrip; - - // Source: http://www.opengl.org/archives/resources/faq/technical/transformations.htm (9.090 How do I draw a full-screen quad?) - // Your rectangle or quad's Z value should be in the range of –1.0 to 1.0, with –1.0 mapping to the zNear clipping plane, and 1.0 to the zFar clipping plane. - const int z = 0; - Vertices = new[] - { - new Vector3(-1, -1, z), - new Vector3( 1, -1, z), - new Vector3(-1, 1, z), - new Vector3( 1, 1, z) - }; - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/Rect.cs b/ObjectTK.Tools/Shapes/Rect.cs deleted file mode 100644 index 2aff09d..0000000 --- a/ObjectTK.Tools/Shapes/Rect.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// Rect.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class Rect - : Shape - { - public Rect(float right, float top) - : this(-1, -1, right, top) - { - } - - public Rect(float left, float bottom, float right, float top) - { - DefaultMode = PrimitiveType.LineLoop; - const int z = 0; - Vertices = new[] - { - new Vector3(left, bottom, z), - new Vector3(right, bottom, z), - new Vector3(right, top, z), - new Vector3(left, top, z) - }; - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/Shape.cs b/ObjectTK.Tools/Shapes/Shape.cs deleted file mode 100644 index e26bf8c..0000000 --- a/ObjectTK.Tools/Shapes/Shape.cs +++ /dev/null @@ -1,44 +0,0 @@ -// -// Shape.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Buffers; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - /// <summary> - /// TODO: needs a total refactoring - /// does not prevent multiple calls to UpdateBuffers() and causes resource leaks - /// does not fit well to an inheritance chain - /// there may be a shape just with vertices - /// there may be an indexed shape with vertices and indices - /// there may be a colored, indexed shape with vertices, indices and colors - /// there may be a colored shape with vertices and colors but no indices... - /// </summary> - public abstract class Shape - : GLResource - { - public PrimitiveType DefaultMode { get; set; } - public Vector3[] Vertices { get; protected set; } - public Buffer<Vector3> VertexBuffer { get; protected set; } - - public virtual void UpdateBuffers() - { - VertexBuffer = new Buffer<Vector3>(); - VertexBuffer.Init(BufferTarget.ArrayBuffer, Vertices); - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - if (VertexBuffer != null) VertexBuffer.Dispose(); - } - } -} diff --git a/ObjectTK.Tools/Shapes/TexturedCube.cs b/ObjectTK.Tools/Shapes/TexturedCube.cs deleted file mode 100644 index cec25d5..0000000 --- a/ObjectTK.Tools/Shapes/TexturedCube.cs +++ /dev/null @@ -1,45 +0,0 @@ -// -// TexturedCube.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Graphics.OpenGL; -using System.Linq; - -namespace ObjectTK.Tools.Shapes -{ - public class TexturedCube - : TexturedShape - { - public TexturedCube() - { - DefaultMode = PrimitiveType.Triangles; - - var quad_uv_map = new[] - { - new Vector2(0, 0), - new Vector2(0, 1), - new Vector2(1, 1), - new Vector2(1, 1), - new Vector2(1, 0), - new Vector2(0, 0), - }; - - // use default cube - using (var cube = new Cube()) - { - // Cube uses indexed vertices, TexturedShape assumes a flat vertices array - // So we need to assemble the missing vertices ourself - Vertices = cube.Indices.Select(idx => cube.Vertices[idx]).ToArray(); - - // Use predefined uv texture mapping for vertices - TexCoords = Enumerable.Range(0, Vertices.Length).Select(i => quad_uv_map[i % quad_uv_map.Length]).ToArray(); - } - } - } -} diff --git a/ObjectTK.Tools/Shapes/TexturedQuad.cs b/ObjectTK.Tools/Shapes/TexturedQuad.cs deleted file mode 100644 index ebb78da..0000000 --- a/ObjectTK.Tools/Shapes/TexturedQuad.cs +++ /dev/null @@ -1,42 +0,0 @@ -// -// TexturedQuad.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public class TexturedQuad - : TexturedShape - { - public TexturedQuad() - { - DefaultMode = PrimitiveType.TriangleStrip; - - // Source: http://www.opengl.org/archives/resources/faq/technical/transformations.htm (9.090 How do I draw a full-screen quad?) - // Your rectangle or quad's Z value should be in the range of –1.0 to 1.0, with –1.0 mapping to the zNear clipping plane, and 1.0 to the zFar clipping plane. - const int z = 0; - Vertices = new[] - { - new Vector3(-1, -1, z), - new Vector3( 1, -1, z), - new Vector3(-1, 1, z), - new Vector3( 1, 1, z) - }; - - TexCoords = new[] - { - new Vector2(0,0), - new Vector2(1,0), - new Vector2(0,1), - new Vector2(1,1) - }; - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/Shapes/TexturedShape.cs b/ObjectTK.Tools/Shapes/TexturedShape.cs deleted file mode 100644 index ad122fc..0000000 --- a/ObjectTK.Tools/Shapes/TexturedShape.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// TexturedShape.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Buffers; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Tools.Shapes -{ - public abstract class TexturedShape - : Shape - { - public Vector2[] TexCoords { get; protected set; } - public Buffer<Vector2> TexCoordBuffer { get; protected set; } - - public override void UpdateBuffers() - { - base.UpdateBuffers(); - TexCoordBuffer = new Buffer<Vector2>(); - TexCoordBuffer.Init(BufferTarget.ArrayBuffer, TexCoords); - } - - protected override void Dispose(bool manual) - { - base.Dispose(manual); - if (TexCoordBuffer != null) TexCoordBuffer.Dispose(); - } - } -} \ No newline at end of file diff --git a/ObjectTK.Tools/packages.config b/ObjectTK.Tools/packages.config deleted file mode 100644 index 725fa42..0000000 --- a/ObjectTK.Tools/packages.config +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<packages> - <package id="OpenTK" version="1.1.1589.5942" targetFramework="net40" /> -</packages> \ No newline at end of file diff --git a/ObjectTK.sln b/ObjectTK.sln deleted file mode 100644 index 93682a5..0000000 --- a/ObjectTK.sln +++ /dev/null @@ -1,45 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK", "ObjectTK\ObjectTK.csproj", "{0EE3347B-1BBE-44CA-8295-22DA13AE914A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "Examples\Examples.csproj", "{B05720A6-8E0A-4D53-96D1-AA341AE0D0D5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F291BD61-42A4-4FBC-B05C-C24BC97EB2EE}" - ProjectSection(SolutionItems) = preProject - README.md = README.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "ObjectTK.Tools\ObjectTK.Tools.csproj", "{E38997F8-7ECE-4B35-BB94-7E609F68D217}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Compiler", "ObjectTK.Compiler\ObjectTK.Compiler.csproj", "{ABD0BE84-792D-4F52-82E2-C869585B3C29}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0EE3347B-1BBE-44CA-8295-22DA13AE914A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0EE3347B-1BBE-44CA-8295-22DA13AE914A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0EE3347B-1BBE-44CA-8295-22DA13AE914A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0EE3347B-1BBE-44CA-8295-22DA13AE914A}.Release|Any CPU.Build.0 = Release|Any CPU - {B05720A6-8E0A-4D53-96D1-AA341AE0D0D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B05720A6-8E0A-4D53-96D1-AA341AE0D0D5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B05720A6-8E0A-4D53-96D1-AA341AE0D0D5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B05720A6-8E0A-4D53-96D1-AA341AE0D0D5}.Release|Any CPU.Build.0 = Release|Any CPU - {E38997F8-7ECE-4B35-BB94-7E609F68D217}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E38997F8-7ECE-4B35-BB94-7E609F68D217}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E38997F8-7ECE-4B35-BB94-7E609F68D217}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E38997F8-7ECE-4B35-BB94-7E609F68D217}.Release|Any CPU.Build.0 = Release|Any CPU - {ABD0BE84-792D-4F52-82E2-C869585B3C29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ABD0BE84-792D-4F52-82E2-C869585B3C29}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ABD0BE84-792D-4F52-82E2-C869585B3C29}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ABD0BE84-792D-4F52-82E2-C869585B3C29}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/ObjectTK.sln.DotSettings b/ObjectTK.sln.DotSettings deleted file mode 100644 index 38f2b95..0000000 --- a/ObjectTK.sln.DotSettings +++ /dev/null @@ -1,19 +0,0 @@ -<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> - <s:String x:Key="/Default/CodeStyle/CodeCleanup/Profiles/=Insert_0020Header/@EntryIndexedValue"><?xml version="1.0" encoding="utf-16"?><Profile name="Insert Header"><CSUpdateFileHeader>True</CSUpdateFileHeader><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags></Profile></s:String> - <s:String x:Key="/Default/CodeStyle/FileHeader/FileHeaderRegionName/@EntryValue">License</s:String> - <s:String x:Key="/Default/CodeStyle/FileHeader/FileHeaderText/@EntryValue">$SOLUTION$ License
 -Copyright (C) 2013-2015 J.C.Bernack
 -
 -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version.
 -
 -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details.
 -
 -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>.</s:String> - <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TK/@EntryIndexedValue">TK</s:String></wpf:ResourceDictionary> \ No newline at end of file diff --git a/ObjectTK/Buffers/Buffer.cs b/ObjectTK/Buffers/Buffer.cs deleted file mode 100644 index bd165cd..0000000 --- a/ObjectTK/Buffers/Buffer.cs +++ /dev/null @@ -1,259 +0,0 @@ -// -// Buffer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Runtime.InteropServices; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Buffers -{ - /// <summary> - /// Represents a buffer object. - /// </summary> - /// <typeparam name="T">The type of elements in the buffer object.</typeparam> - public class Buffer<T> - : GLObject - where T : struct - { - /// <summary> - /// A value indicating whether the buffer has been initialized and thus has access to allocated memory. - /// </summary> - public bool Initialized { get; private set; } - - /// <summary> - /// The size in bytes of one element within the buffer. - /// </summary> - public int ElementSize { get; protected set; } - - /// <summary> - /// The number of elements for which buffer memory was allocated. - /// </summary> - public int ElementCount { get; private set; } - - /// <summary> - /// The index to the element which will be written to on the next usage of SubData(). - /// </summary> - public int CurrentElementIndex { get; set; } - - /// <summary> - /// The number of elements with data explicitly written. - /// </summary> - public int ActiveElementCount { get; set; } - - /// <summary> - /// Retrieves data back from vram. - /// Mainly for debugging purposes. - /// </summary> - public T[] Content - { - get - { - var items = new T[ElementCount]; - GL.BindBuffer(BufferTarget.ArrayBuffer, Handle); - GL.GetBufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, (IntPtr)(ElementSize * ElementCount), items); - return items; - } - } - - /// <summary> - /// Creates a new, uninitialized buffer object using an explicitly given element size in bytes. - /// </summary> - public Buffer(int elementSize) - : base(GL.GenBuffer()) - { - Initialized = false; - ElementSize = elementSize; - } - - /// <summary> - /// Creates a new, uninitialized buffer object using the element size determined by Marshal.SizeOf(). - /// </summary> - public Buffer() - : this(Marshal.SizeOf(typeof(T))) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteBuffer(Handle); - } - - /// <summary> - /// Allocates buffer memory and uploads given data to it. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="data">The data to be transfered into the buffer.</param> - /// <param name="usageHint">The usage hint of the buffer object.</param> - public void Init(BufferTarget bufferTarget, T[] data, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) - { - Init(bufferTarget, data.Length, data, usageHint); - ActiveElementCount = data.Length; - CurrentElementIndex = 0; - } - - /// <summary> - /// Allocates buffer memory without initializing it. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="elementCount">The number of elements to allocate memory for.</param> - /// <param name="usageHint">The usage hint of the buffer object.</param> - public void Init(BufferTarget bufferTarget, int elementCount, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) - { - Init(bufferTarget, elementCount, null, usageHint); - ActiveElementCount = 0; - CurrentElementIndex = 0; - } - - /// <summary> - /// Allocates buffer memory and initializes it to the given data. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="elementCount">The number of elements to allocate memory for.</param> - /// <param name="data">The data to upload into the buffer.</param> - /// <param name="usageHint">The usage hint of the buffer object.</param> - protected void Init(BufferTarget bufferTarget, int elementCount, T[] data, BufferUsageHint usageHint) - { - Initialized = true; - ElementCount = elementCount; - var fullSize = elementCount * ElementSize; - GL.BindBuffer(bufferTarget, Handle); - GL.BufferData(bufferTarget, (IntPtr)fullSize, data, usageHint); - CheckBufferSize(bufferTarget, fullSize); - } - - /// <summary> - /// Overwrites part of the buffer with the given data and automatically indexes forward through the available memory. - /// Skips back to the beginning automatically once the end was reached. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="data">The data to be transfered into the buffer.</param> - public void SubData(BufferTarget bufferTarget, T[] data) - { - if (data.Length > ElementCount) throw new ArgumentException( - string.Format("Buffer not large enough to hold data. Buffer size: {0}. Elements to write: {1}.", ElementCount, data.Length)); - // check if data does not fit at the end of the buffer - var rest = ElementCount - CurrentElementIndex; - if (rest >= data.Length) - { - // add the elements of data to the buffer at the current index - SubData(bufferTarget, data, CurrentElementIndex); - // skip forward through the buffer - CurrentElementIndex += data.Length; - // remember the total number of elements with data - if (ActiveElementCount < CurrentElementIndex) ActiveElementCount = CurrentElementIndex; - // skip back if the end was reached - // in this case it can only be reached exactly because otherwise it would be handled by the else-case - if (CurrentElementIndex >= ElementCount) CurrentElementIndex = 0; - } - else - { - // first fill the end of the buffer - SubData(bufferTarget, data, CurrentElementIndex, rest); - // proceed to add the remaining elements at the beginning - rest = data.Length - rest; - SubData(bufferTarget, data, 0, rest); - CurrentElementIndex = rest; - // remember that the full buffer was already written to - ActiveElementCount = ElementCount; - } - } - - /// <summary> - /// Overwrites part of the buffer with the given data at the given offset. - /// Writes all data available in data. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="data">The data to be transfered into the buffer.</param> - /// <param name="offset">The index to the first element of the buffer to be overwritten.</param> - public void SubData(BufferTarget bufferTarget, T[] data, int offset) - { - SubData(bufferTarget, data, offset, data.Length); - } - - /// <summary> - /// Overwrites part of the buffer with the given data at the given offset. - /// Writes <paramref name="count" /> elements of data. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="data">The data to be transfered into the buffer.</param> - /// <param name="offset">The index to the first element of the buffer to be overwritten.</param> - /// <param name="count">The number of elements from data to write.</param> - public void SubData(BufferTarget bufferTarget, T[] data, int offset, int count) - { - if (count > ElementCount - offset) throw new ArgumentException( - string.Format("Buffer not large enough to hold data. Buffer size: {0}. Offset: {1}. Elements to write: {2}.", ElementCount, offset, count)); - if (count > data.Length) throw new ArgumentException( - string.Format("Not enough data to write to buffer. Data length: {0}. Elements to write: {1}.", data.Length, count)); - GL.BindBuffer(bufferTarget, Handle); - GL.BufferSubData(bufferTarget, (IntPtr)(ElementSize * offset), (IntPtr)(ElementSize * count), data); - } - - /// <summary> - /// Clear the buffer to default values. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - public void Clear(BufferTarget bufferTarget) - { - SubData(bufferTarget, new T[ElementCount], 0, ElementCount); - } - - /// <summary> - /// "Orphan" the buffer by calling glBufferData() with the exact same size and usage hint, - /// but with a NULL pointer as the new data. This will let OpenGL allocate a new buffer - /// under the same handle and continue using it without synchronization, even if the old - /// buffer may still be in use by commands remaining in the queue. - /// </summary> - /// <param name="bufferTarget">The BufferTarget to use when binding the buffer.</param> - /// <param name="usageHint">The usage hint of the buffer object.</param> - public void Orphan(BufferTarget bufferTarget, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) - { - if (!Initialized) throw new InvalidOperationException("Can not orphan uninitialized buffer."); - Init(bufferTarget, ElementCount, usageHint); - // GL 4.3 - //GL.InvalidateBufferData(Handle); - } - - /// <summary> - /// Copies elements from the source buffer to this buffer. - /// Copied on server-side only, no synchronization or transfer of data to host required. - /// </summary> - /// <param name="source">The source buffer to copy data from.</param> - /// <param name="readOffset">Element offset into the source buffer.</param> - /// <param name="writeOffset">Element offset into this buffer</param> - /// <param name="count">The Number of elements to copy.</param> - public void CopyFrom(Buffer<T> source, int readOffset, int writeOffset, int count) - { - GL.BindBuffer(BufferTarget.CopyReadBuffer, source.Handle); - GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle); - GL.CopyBufferSubData(BufferTarget.CopyReadBuffer, BufferTarget.CopyWriteBuffer, - (IntPtr)(ElementSize * readOffset), (IntPtr)(ElementSize * writeOffset), (IntPtr)(ElementSize * count)); - } - - /// <summary> - /// Copies elements from the source buffer to this buffer until the end of either buffer is reached. - /// </summary> - /// <param name="source">The source buffer to copy elements from.</param> - public void CopyFrom(Buffer<T> source) - { - CopyFrom(source, 0, 0, Math.Min(ElementCount, source.ElementCount)); - } - - /// <summary> - /// Checks if uploaded size matches the expected size. - /// </summary> - protected void CheckBufferSize(BufferTarget bufferTarget, int size) - { - int uploadedSize; - GL.GetBufferParameter(bufferTarget, BufferParameterName.BufferSize, out uploadedSize); - if (uploadedSize != size) throw new ApplicationException( - string.Format("Problem uploading data to buffer object. Tried to upload {0} bytes, but uploaded {1}.", size, uploadedSize)); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Buffers/BufferPod.cs b/ObjectTK/Buffers/BufferPod.cs deleted file mode 100644 index 4272f96..0000000 --- a/ObjectTK/Buffers/BufferPod.cs +++ /dev/null @@ -1,109 +0,0 @@ -// -// BufferPod.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Buffers -{ - /// <summary> - /// Represents two buffer objects which are bundled together to simplify ping-ponging. - /// </summary> - /// <typeparam name="T">The type of elements in the buffer objects.</typeparam> - public class BufferPod<T> - : GLResource - where T : struct - { - /// <summary> - /// First or front buffer. - /// </summary> - public Buffer<T> Ping { private set; get; } - - /// <summary> - /// Second or back buffer. - /// </summary> - public Buffer<T> Pong { private set; get; } - - /// <summary> - /// Requests two new, uninitialized <see cref="Buffer{T}"/> objects. - /// </summary> - public BufferPod() - { - Ping = new Buffer<T>(); - Pong = new Buffer<T>(); - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - Ping.Dispose(); - Pong.Dispose(); - } - - /// <summary> - /// Allocates memory for both buffer objects without initializing it. - /// </summary> - /// <param name="target">The BufferTarget to use when binding the buffers.</param> - /// <param name="elementCount">The number of elements for each buffer to allocate memory for.</param> - /// <param name="usageHint">The usage hint for both buffer objects.</param> - public void Init(BufferTarget target, int elementCount, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) - { - Ping.Init(target, elementCount, usageHint); - Pong.Init(target, elementCount, usageHint); - } - - /// <summary> - /// Allocates memory for both buffer objects and initializes the first buffer with the given data. - /// The second buffer is left uninitialized. - /// </summary> - /// <param name="target">The BufferTarget to use when binding the buffers.</param> - /// <param name="data">The data to upload to the first buffer and allocate enough memory for in the second buffer.</param> - /// <param name="usageHint">The usage hint for both buffer objects.</param> - public void Init(BufferTarget target, T[] data, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) - { - Ping.Init(target, data, usageHint); - Pong.Init(target, data.Length, usageHint); - } - - /// <summary> - /// Changes the size of both buffer objects. - /// </summary> - /// <param name="target">The BufferTarget to use when binding the buffers.</param> - /// <param name="elementCount">The new number of elements for each buffer to allocate memory for.</param> - /// <param name="usageHint">The usage hint for both buffer objects.</param> - public void Resize(BufferTarget target, int elementCount, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) - { - // wrap current element index into the new buffer size if it is smaller than before - Ping.CurrentElementIndex %= elementCount; - // prevent active element count from exceeding the new buffer size - Ping.ActiveElementCount = Math.Min(Ping.ActiveElementCount, elementCount); - // copy data into resized buffer - Pong.Init(target, elementCount, usageHint); - if (Ping.Initialized) Pong.CopyFrom(Ping); - // swap buffers - Swap(); - // resize the other buffer - Pong.Init(target, elementCount, usageHint); - } - - /// <summary> - /// Swaps the two buffer objects. - /// </summary> - public void Swap() - { - // copy over current "state" - Pong.CurrentElementIndex = Ping.CurrentElementIndex; - Pong.ActiveElementCount = Ping.ActiveElementCount; - // swap buffers - var tmp = Ping; - Ping = Pong; - Pong = tmp; - } - } -} \ No newline at end of file diff --git a/ObjectTK/Buffers/Framebuffer.cs b/ObjectTK/Buffers/Framebuffer.cs deleted file mode 100644 index 2dccdf9..0000000 --- a/ObjectTK/Buffers/Framebuffer.cs +++ /dev/null @@ -1,193 +0,0 @@ -// -// Framebuffer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using ObjectTK.Exceptions; -using ObjectTK.Textures; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Buffers -{ - /// <summary> - /// Represents a framebuffer object. - /// </summary> - public class Framebuffer - : GLObject - { - /// <summary> - /// Creates a new framebuffer object. - /// </summary> - public Framebuffer() - : base(GL.GenFramebuffer()) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteFramebuffer(Handle); - } - - /// <summary> - /// Binds this framebuffer. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - public void Bind(FramebufferTarget target) - { - GL.BindFramebuffer(target, Handle); - } - - /// <summary> - /// Unbind this framebuffer, i.e. bind the default framebuffer. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - public static void Unbind(FramebufferTarget target) - { - GL.BindFramebuffer(target, 0); - } - - /// <summary> - /// Attaches the given texture level to the an attachment point. - /// </summary> - /// <remarks> - /// If texture is a three-dimensional, cube map array, cube map, one- or two-dimensional array, or two-dimensional multisample array texture - /// the specified texture level is an array of images and the framebuffer attachment is considered to be layered. - /// </remarks> - /// <param name="target">The framebuffer target to bind to.</param> - /// <param name="attachment">The attachment point to attach to.</param> - /// <param name="texture">The texture to attach.</param> - /// <param name="level">The level of the texture to attach.</param> - public void Attach(FramebufferTarget target, FramebufferAttachment attachment, Texture texture, int level = 0) - { - texture.AssertLevel(level); - AssertActive(target); - GL.FramebufferTexture(target, attachment, texture.Handle, level); - CheckState(target); - } - - /// <summary> - /// Attaches a single layer of the given texture level to an attachment point. - /// </summary> - /// <remarks> - /// Note that for cube maps and cube map arrays the <paramref name="layer"/> parameter actually indexes the layer-faces.<br/> - /// Thus for cube maps the layer parameter equals the face to be bound.<br/> - /// For cube map arrays the layer parameter can be calculated as 6 * arrayLayer + face, which is done automatically when using - /// the corresponding overload <see cref="Attach(FramebufferTarget, FramebufferAttachment, TextureCubemapArray, int, int, int)"/>. - /// </remarks> - /// <param name="target">The framebuffer target to bind to.</param> - /// <param name="attachment">The attachment point to attach to.</param> - /// <param name="texture">The texture to attach.</param> - /// <param name="layer">The layer of the texture to attach.</param> - /// <param name="level">The level of the texture to attach.</param> - public void Attach(FramebufferTarget target, FramebufferAttachment attachment, LayeredTexture texture, int layer, int level = 0) - { - texture.AssertLevel(level); - AssertActive(target); - GL.FramebufferTextureLayer(target, attachment, texture.Handle, level, layer); - CheckState(target); - } - - /// <summary> - /// Attaches a single face of the given cube map texture level to the an attachment point. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - /// <param name="attachment">The attachment point to attach to.</param> - /// <param name="texture">The texture to attach.</param> - /// <param name="face">The cube map face of the texture to attach.</param> - /// <param name="level">The level of the texture to attach.</param> - public void Attach(FramebufferTarget target, FramebufferAttachment attachment, TextureCubemap texture, int face, int level = 0) - { - Attach(target, attachment, (LayeredTexture)texture, face, level); - } - - /// <summary> - /// Attaches a single face of the given cube map array texture level to an attachment point. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - /// <param name="attachment">The attachment point to attach to.</param> - /// <param name="texture">The texture to attach.</param> - /// <param name="arrayLayer">The layer of the texture to attach.</param> - /// <param name="face">The cube map face of the texture to attach.</param> - /// <param name="level">The level of the texture to attach.</param> - public void Attach(FramebufferTarget target, FramebufferAttachment attachment, TextureCubemapArray texture, int arrayLayer, int face, int level = 0) - { - Attach(target, attachment, (LayeredTexture)texture, 6 * arrayLayer + face, level); - } - - /// <summary> - /// Attaches the render buffer to the given attachment point. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - /// <param name="attachment">The attachment point to attach to.</param> - /// <param name="renderbuffer">Render buffer to attach.</param> - public void Attach(FramebufferTarget target, FramebufferAttachment attachment, Renderbuffer renderbuffer) - { - AssertActive(target); - GL.FramebufferRenderbuffer(target, attachment, RenderbufferTarget.Renderbuffer, renderbuffer.Handle); - CheckState(target); - } - - /// <summary> - /// Detaches the currently attached texture from the given attachment point. - /// </summary> - /// <param name="attachment">The attachment point to detach from.</param> - /// <param name="target">The framebuffer target to bind to.</param> - public void DetachTexture(FramebufferTarget target, FramebufferAttachment attachment) - { - AssertActive(target); - GL.FramebufferTexture(target, attachment, 0, 0); - CheckState(target); - } - - /// <summary> - /// Detaches the currently attached render buffer from the given attachment point. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - /// <param name="attachment">The attachment point to detach from.</param> - public void DetachRenderbuffer(FramebufferTarget target, FramebufferAttachment attachment) - { - AssertActive(target); - GL.FramebufferRenderbuffer(target, attachment, RenderbufferTarget.Renderbuffer, 0); - CheckState(target); - } - - /// <summary> - /// Check if the current framebuffer status is "frambuffer complete", throws on error. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - public void CheckState(FramebufferTarget target) - { -#if DEBUG - Utility.Assert("Error on framebuffer attach/detach"); - Utility.Assert(GL.CheckFramebufferStatus(target), FramebufferErrorCode.FramebufferComplete, "Framebuffer is not framebuffer complete."); -#endif - } - - /// <summary> - /// Throws an <see cref="ObjectNotBoundException"/> if this framebuffer is not the currently active one. - /// </summary> - /// <param name="target">The framebuffer target to bind to.</param> - public void AssertActive(FramebufferTarget target) - { -#if DEBUG - int activeHandle; - GetPName binding; - switch (target) - { - case FramebufferTarget.ReadFramebuffer: binding = GetPName.ReadFramebufferBinding; break; - case FramebufferTarget.DrawFramebuffer: binding = GetPName.DrawFramebufferBinding; break; - case FramebufferTarget.Framebuffer: binding = GetPName.FramebufferBinding; break; - default: throw new ArgumentOutOfRangeException(); - } - GL.GetInteger(binding, out activeHandle); - if (activeHandle != Handle) throw new ObjectNotBoundException("Can not access an unbound framebuffer. Call Framebuffer.Bind() first."); -#endif - } - } -} \ No newline at end of file diff --git a/ObjectTK/Buffers/Renderbuffer.cs b/ObjectTK/Buffers/Renderbuffer.cs deleted file mode 100644 index 52d259a..0000000 --- a/ObjectTK/Buffers/Renderbuffer.cs +++ /dev/null @@ -1,46 +0,0 @@ -// -// Renderbuffer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Buffers -{ - /// <summary> - /// Represents a renderbuffer object. - /// </summary> - public class Renderbuffer - : GLObject - { - /// <summary> - /// Creates a new renderbuffer object. - /// </summary> - public Renderbuffer() - : base(GL.GenRenderbuffer()) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteRenderbuffer(Handle); - } - - /// <summary> - /// Initializes the renderbuffer with the given parameters. - /// </summary> - /// <param name="storage">Specifies the internal format.</param> - /// <param name="width">The width of the renderbuffer.</param> - /// <param name="height">The height of the renderbuffer.</param> - public void Init(RenderbufferStorage storage, int width, int height) - { - GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, Handle); - GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, storage, width, height); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Buffers/TransformFeedback.cs b/ObjectTK/Buffers/TransformFeedback.cs deleted file mode 100644 index cd03378..0000000 --- a/ObjectTK/Buffers/TransformFeedback.cs +++ /dev/null @@ -1,132 +0,0 @@ -// -// TransformFeedback.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using ObjectTK.Exceptions; -using ObjectTK.Shaders.Variables; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Buffers -{ - /// <summary> - /// Represents a transform feedback object. - /// </summary> - public class TransformFeedback - : GLObject - { - /// <summary> - /// Creates a new transform feedback buffer. - /// </summary> - public TransformFeedback() - : base(GL.GenTransformFeedback()) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteTransformFeedback(Handle); - } - - /// <summary> - /// Binds the transform feedback buffer. - /// </summary> - public void Bind() - { - GL.BindTransformFeedback(TransformFeedbackTarget.TransformFeedback, Handle); - } - - /// <summary> - /// Unbinds the transform feedback buffer. - /// </summary> - public void UnBind() - { - AssertActive(); - GL.BindTransformFeedback(TransformFeedbackTarget.TransformFeedback, 0); - } - - /// <summary> - /// Start transform feedback operation. - /// </summary> - /// <param name="primitiveMode">Specify the output type of the primitives that will be recorded into the buffer objects that are bound for transform feedback.</param> - public void Begin(TransformFeedbackPrimitiveType primitiveMode) - { - AssertActive(); - GL.BeginTransformFeedback(primitiveMode); - } - - /// <summary> - /// End transform feedback operation. - /// </summary> - public void End() - { - AssertActive(); - GL.EndTransformFeedback(); - } - - /// <summary> - /// Pause transform feedback operations. - /// </summary> - public void Pause() - { - AssertActive(); - GL.PauseTransformFeedback(); - } - - /// <summary> - /// Resume transform feedback operations. - /// </summary> - public void Resume() - { - AssertActive(); - GL.ResumeTransformFeedback(); - } - - /// <summary> - /// Binds a buffer to the binding index utilized by the given transform feeedback varying. - /// </summary> - /// <param name="transformOut">Specifies a transform feedback varying.</param> - /// <param name="buffer">Specifies a buffer object to bind.</param> - public void BindOutput<T>(TransformOut transformOut, Buffer<T> buffer) - where T : struct - { - AssertActive(); - GL.BindBufferBase(BufferRangeTarget.TransformFeedbackBuffer, transformOut.Index, buffer.Handle); - } - - /// <summary> - /// Binds part of a buffer to the binding index utilized by the given transform feeedback varying. - /// </summary> - /// <remarks> - /// If multiple parts of the same buffer are bound as transform feedback output targets they must not overlap. - /// </remarks> - /// <param name="transformOut">Specifies a transform feedback varying.</param> - /// <param name="buffer">Specifies a buffer object to bind.</param> - /// <param name="offset">Specifies the starting offset in bytes into the buffer object.</param> - /// <param name="size">Specifies the amount of data in bytes that can be written to the buffer.</param> - public void BindOutput<T>(TransformOut transformOut, Buffer<T> buffer, int offset, int size) - where T : struct - { - AssertActive(); - GL.BindBufferRange(BufferRangeTarget.TransformFeedbackBuffer, transformOut.Index, buffer.Handle, (IntPtr)offset, (IntPtr)size); - } - - /// <summary> - /// Throws an <see cref="ObjectNotBoundException"/> if this vertex array is not the currently active one. - /// </summary> - public void AssertActive() - { -#if DEBUG - int activeHandle; - GL.GetInteger(GetPName.TransformFeedbackBinding, out activeHandle); - if (activeHandle != Handle) throw new ObjectNotBoundException("Transform feedback object is not bound."); -#endif - } - } -} \ No newline at end of file diff --git a/ObjectTK/Buffers/VertexArray.cs b/ObjectTK/Buffers/VertexArray.cs deleted file mode 100644 index 57d515b..0000000 --- a/ObjectTK/Buffers/VertexArray.cs +++ /dev/null @@ -1,237 +0,0 @@ -// -// VertexArray.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using ObjectTK.Exceptions; -using ObjectTK.Shaders.Variables; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Buffers -{ - /// <summary> - /// Represents a vertex array object.<br/> - /// TODO: add support for instanced vertex attributes with glVertexAttribDivisor (or maybe glVertexBindingDivisor) - /// </summary> - public class VertexArray - : GLObject - { - /// <summary> - /// Initializes a new vertex array object. - /// </summary> - public VertexArray() - : base(GL.GenVertexArray()) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteVertexArray(Handle); - } - - /// <summary> - /// Bind the vertex array. - /// </summary> - public void Bind() - { - GL.BindVertexArray(Handle); - } - - /// <summary> - /// Render primitives from array data. - /// </summary> - /// <param name="mode">Specifies what kind of primitives to render.</param> - /// <param name="first">Specifies the starting index in the enabled arrays.</param> - /// <param name="count">Specifies the number of indices to be rendered.</param> - public void DrawArrays(PrimitiveType mode, int first, int count) - { - AssertActive(); - GL.DrawArrays(mode, first, count); - } - - public void DrawArraysInstances(PrimitiveType mode, int first, int count, int instanceCount) - { - AssertActive(); - GL.DrawArraysInstanced(mode, first, count, instanceCount); - } - - public void DrawArraysIndirect(PrimitiveType mode, int offset = 0) - { - AssertActive(); - GL.DrawArraysIndirect(mode, new IntPtr(offset)); - } - - public void MultiDrawArrays(PrimitiveType mode, int[] first, int[] count) - { - AssertActive(); - if (first.Length != count.Length) throw new ArgumentException("The length of first and count must be equal."); - GL.MultiDrawArrays(mode, first, count, count.Length); - } - - /// <summary> - /// Render primitives from array data using the element buffer. - /// </summary> - /// <param name="mode">Specifies what kind of primitives to render.</param> - /// <param name="count">Specifies the number of elements to be rendered.</param> - /// <param name="type">Specifies the type of the values in indices.</param> - public void DrawElements(PrimitiveType mode, int count, DrawElementsType type = DrawElementsType.UnsignedInt) - { - AssertActive(); - GL.DrawElements(mode, count, type, IntPtr.Zero); - } - - public void DrawElementsIndirect(PrimitiveType mode, DrawElementsType type = DrawElementsType.UnsignedInt, int offset = 0) - { - AssertActive(); - GL.DrawElementsIndirect(mode, (All)type, new IntPtr(offset)); - } - - public void MultiDrawElements(PrimitiveType mode, int[] count, DrawElementsType type = DrawElementsType.UnsignedInt) - { - AssertActive(); - GL.MultiDrawElements(mode, count, type, IntPtr.Zero, count.Length); - } - - public void DrawTransformFeedback(PrimitiveType mode, TransformFeedback transformFeedback) - { - AssertActive(); - GL.DrawTransformFeedback(mode, transformFeedback.Handle); - } - - /// <summary> - /// Binds the given buffer to the element array buffer target. - /// </summary> - public void BindElementBuffer<T>(Buffer<T> buffer) - where T : struct - { - AssertActive(); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, buffer.Handle); - } - - /// <summary> - /// Unbinds any buffer bound to the element array buffer target. - /// </summary> - public void UnbindElementBuffer() - { - AssertActive(); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. Uses the buffers element size as the stride parameter with an offset of zero. - /// The other parameters, namely components, type and normalized are chosen according to the corresponding <see cref="VertexAttribAttribute"/> attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer) - where T : struct - { - BindAttribute(attribute, buffer, attribute.Components, attribute.Type, buffer.ElementSize, 0, attribute.Normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. Uses the buffers element size as the stride parameter and the given offset. - /// The other parameters, namely components, type and normalized are chosen according to the corresponding <see cref="VertexAttribAttribute"/> attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer, int offset) - where T : struct - { - BindAttribute(attribute, buffer, attribute.Components, attribute.Type, buffer.ElementSize, offset, attribute.Normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. Uses the given stride and offset parameters. - /// The other parameters, namely components, type and normalized are chosen according to the corresponding <see cref="VertexAttribAttribute"/> attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer, int stride, int offset) - where T : struct - { - BindAttribute(attribute, buffer, attribute.Components, attribute.Type, stride, offset, attribute.Normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer, int stride, int offset, bool normalized) - where T : struct - { - BindAttribute(attribute, buffer, attribute.Components, attribute.Type, stride, offset, normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer, int components, int stride, int offset) - where T : struct - { - BindAttribute(attribute, buffer, components, attribute.Type, stride, offset, attribute.Normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer, int components, int stride, int offset, bool normalized) - where T : struct - { - BindAttribute(attribute, buffer, components, attribute.Type, stride, offset, normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. - /// </summary> - public void BindAttribute<T>(VertexAttrib attribute, Buffer<T> buffer, int components, VertexAttribPointerType type, int stride, int offset, bool normalized) - where T : struct - { - if (!attribute.Active) return; - BindAttribute(attribute.Index, buffer, components, type, stride, offset, normalized); - } - - /// <summary> - /// Binds the buffer to the given vertex attribute. - /// </summary> - public void BindAttribute<T>(int index, Buffer<T> buffer, int components, VertexAttribPointerType type, int stride, int offset, bool normalized) - where T : struct - { - AssertActive(); - // bind given buffer - GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Handle); - // make sure the vertex attribute is enabled - GL.EnableVertexAttribArray(index); - // set the vertex attribute pointer to the current buffer - GL.VertexAttribPointer(index, components, type, normalized, stride, offset); - } - - /// <summary> - /// Disable the given vertex attribute. - /// </summary> - public void UnbindAttribute(VertexAttrib attribute) - { - UnbindAttribute(attribute.Index); - } - - /// <summary> - /// Disable the given vertex attribute. - /// </summary> - public void UnbindAttribute(int index) - { - AssertActive(); - GL.DisableVertexAttribArray(index); - } - - /// <summary> - /// Throws an <see cref="ObjectNotBoundException"/> if this vertex array is not the currently active one. - /// </summary> - public void AssertActive() - { -#if DEBUG - int activeHandle; - GL.GetInteger(GetPName.VertexArrayBinding, out activeHandle); - if (activeHandle != Handle) throw new ObjectNotBoundException("Vertex array object is not bound."); -#endif - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/ObjectNotBoundException.cs b/ObjectTK/Exceptions/ObjectNotBoundException.cs deleted file mode 100644 index dfefe7d..0000000 --- a/ObjectTK/Exceptions/ObjectNotBoundException.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// ObjectNotBoundException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when an object is used which must be bound before usage. - /// </summary> - [Serializable] - public class ObjectNotBoundException - : ObjectTKException - { - internal ObjectNotBoundException(string message) - : base(message) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/ObjectTKException.cs b/ObjectTK/Exceptions/ObjectTKException.cs deleted file mode 100644 index f7f8109..0000000 --- a/ObjectTK/Exceptions/ObjectTKException.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// ObjectTKException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when an ObjectTK related error occurs. - /// </summary> - [Serializable] - public class ObjectTKException - : Exception - { - internal ObjectTKException(string message) - : base(message) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/ProgramException.cs b/ObjectTK/Exceptions/ProgramException.cs deleted file mode 100644 index d5eb444..0000000 --- a/ObjectTK/Exceptions/ProgramException.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// ProgramException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Runtime.Serialization; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when a program related error occurs. - /// </summary> - [Serializable] - public class ProgramException - : ObjectTKException - { - public string InfoLog { get; private set; } - - internal ProgramException(string message, string infoLog) - : base(message) - { - InfoLog = infoLog; - } - - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - info.AddValue("InfoLog", InfoLog); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/ProgramLinkException.cs b/ObjectTK/Exceptions/ProgramLinkException.cs deleted file mode 100644 index 10c5b47..0000000 --- a/ObjectTK/Exceptions/ProgramLinkException.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// ProgramLinkException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when a program link error occurs. - /// </summary> - [Serializable] - public class ProgramLinkException - : ProgramException - { - internal ProgramLinkException(string message, string infoLog) - : base(message, infoLog) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/QueryException.cs b/ObjectTK/Exceptions/QueryException.cs deleted file mode 100644 index 44041f2..0000000 --- a/ObjectTK/Exceptions/QueryException.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// QueryException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when a query related error occurs. - /// </summary> - [Serializable] - public class QueryException - : ObjectTKException - { - internal QueryException(string message) - : base(message) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/ShaderCompileException.cs b/ObjectTK/Exceptions/ShaderCompileException.cs deleted file mode 100644 index d11f4a9..0000000 --- a/ObjectTK/Exceptions/ShaderCompileException.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// ShaderCompileException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when a shader compile error occurs. - /// </summary> - [Serializable] - public class ShaderCompileException - : ProgramException - { - internal ShaderCompileException(string message, string infoLog) - : base(message, infoLog) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Exceptions/UniformTypeNotSupportedException.cs b/ObjectTK/Exceptions/UniformTypeNotSupportedException.cs deleted file mode 100644 index f83f249..0000000 --- a/ObjectTK/Exceptions/UniformTypeNotSupportedException.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -// UniformTypeNotSupportedException.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Runtime.Serialization; -using ObjectTK.Shaders.Variables; - -namespace ObjectTK.Exceptions -{ - /// <summary> - /// The exception that is thrown when the generic type parameter used for an instance of <see cref="Uniform{T}"/> is not supported. - /// </summary> - [Serializable] - public class UniformTypeNotSupportedException - : ObjectTKException - { - /// <summary> - /// The unsupported type parameter to <see cref="Uniform{T}"/> which caused the initialization to fail. - /// </summary> - public readonly Type UniformType; - - internal UniformTypeNotSupportedException(Type uniformType) - : base(string.Format("Uniforms of type {0} are not supported", uniformType.Name)) - { - UniformType = uniformType; - } - - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - info.AddValue("UniformType", UniformType); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Extensions.cs b/ObjectTK/Extensions.cs deleted file mode 100644 index 40c478b..0000000 --- a/ObjectTK/Extensions.cs +++ /dev/null @@ -1,69 +0,0 @@ -// -// Extensions.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Reflection; -using OpenTK; - -namespace ObjectTK -{ - /// <summary> - /// Contains extension methods. - /// </summary> - public static class Extensions - { - /// <summary> - /// Transforms this <see cref="Color"/> object to a <see cref="Vector4"/>.<br/> - /// The resulting vector contains values in the range of (0,1). - /// </summary> - /// <param name="color">The Color object to transform.</param> - /// <returns>A Vector4 object containing the color information.</returns> - public static Vector4 ToVector4(this Color color) - { - return new Vector4(color.R/255f, color.G/255f, color.B/255f, color.A/255f); - } - - /// <summary> - /// Transforms this <see cref="Color"/> object to an unsigned integer.<br/> - /// The components are formatted compatible to OpenGL. - /// </summary> - /// <param name="color">The Color object to transform.</param> - /// <returns>An unsigned integer containing the color information.</returns> - public static uint ToRgba32(this Color color) - { - return (uint)(color.A << 24 | color.B << 16 | color.G << 8 | color.R); - } - - /// <summary> - /// Transforms this unsigned integer to a <see cref="Color"/> object.<br/> - /// Requires the information formatted like the output of <see cref="ToRgba32"/>. - /// </summary> - /// <param name="color">The unsigned integer to transform.</param> - /// <returns>A Color object containing the same information.</returns> - public static Color Rgba32ToColor(this uint color) - { - const uint mask = 0x000000FF; - return Color.FromArgb((int)(color >> 24 & mask), (int)(color & mask), (int)(color >> 8 & mask), (int)(color >> 16 & mask)); - } - - /// <summary> - /// Retrieves custom attributes in a typed enumerable. - /// </summary> - /// <typeparam name="T">The type of attribute to search for. Only attributes that are assignable to this type are returned.</typeparam> - /// <param name="type">The member on which to look for custom attributes.</param> - /// <param name="inherit">Specifies whether to search this member's inheritance chain to find the attributes.</param> - /// <returns>An IEnumerable of custom attributes applied to this member.</returns> - public static IEnumerable<T> GetCustomAttributes<T>(this MemberInfo type, bool inherit) - { - return type.GetCustomAttributes(typeof(T), inherit).Cast<T>(); - } - } -} diff --git a/ObjectTK/GLObject.cs b/ObjectTK/GLObject.cs deleted file mode 100644 index b80f8b9..0000000 --- a/ObjectTK/GLObject.cs +++ /dev/null @@ -1,55 +0,0 @@ -// -// GLObject.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; - -namespace ObjectTK -{ - /// <summary> - /// Represents an OpenGL handle.<br/> - /// Must be disposed explicitly, otherwise there will be a memory leak which will be logged as a warning. - /// </summary> - public abstract class GLObject - : GLResource - , IEquatable<GLObject> - { - /// <summary> - /// The OpenGL handle. - /// </summary> - public readonly int Handle; - - /// <summary> - /// Initializes a new instance of the GLResource class. - /// </summary> - protected GLObject(int handle) - { - Handle = handle; - } - - public bool Equals(GLObject other) - { - return other != null && Handle.Equals(other.Handle); - } - - public override bool Equals(object obj) - { - return obj is GLObject && Equals((GLObject) obj); - } - - public override int GetHashCode() - { - return Handle.GetHashCode(); - } - - public override string ToString() - { - return string.Format("{0}({1})", GetType().Name, Handle); - } - } -} \ No newline at end of file diff --git a/ObjectTK/GLResource.cs b/ObjectTK/GLResource.cs deleted file mode 100644 index 5e33c08..0000000 --- a/ObjectTK/GLResource.cs +++ /dev/null @@ -1,91 +0,0 @@ -// -// GLResource.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Reflection; -using ObjectTK.Exceptions; - -namespace ObjectTK -{ - /// <summary> - /// Represents an OpenGL resource.<br/> - /// Must be disposed explicitly, otherwise a warning will be logged indicating a memory leak.<br/> - /// Can be derived to inherit the dispose pattern. - /// </summary> - public abstract class GLResource - : IDisposable - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(GLResource)); - - /// <summary> - /// Gets a values specifying if this resource has already been disposed. - /// </summary> - public bool IsDisposed { get; private set; } - - /// <summary> - /// Initializes a new instance of the GLObject class. - /// </summary> - protected GLResource() - { - IsDisposed = false; - } - - /// <summary> - /// Called by the garbage collector and an indicator for a resource leak because the manual dispose prevents this destructor from being called. - /// </summary> - ~GLResource() - { - Logger?.WarnFormat("GLResource leaked: {0}", this); - Dispose(false); -#if DEBUG - throw new ObjectTKException(string.Format("GLResource leaked: {0}", this)); -#endif - } - - /// <summary> - /// Releases all OpenGL handles related to this resource. - /// </summary> - public void Dispose() - { - // safely handle multiple calls to dispose - if (IsDisposed) return; - IsDisposed = true; - // dipose this resource - Dispose(true); - // prevent the destructor from being called - GC.SuppressFinalize(this); - // make sure the garbage collector does not eat our object before it is properly disposed - GC.KeepAlive(this); - } - - /// <summary> - /// Releases all OpenGL handles related to this resource. - /// </summary> - /// <param name="manual">True if the call is performed explicitly and within the OpenGL thread, false if it is caused by the garbage collector and therefore from another thread and the result of a resource leak.</param> - protected abstract void Dispose(bool manual); - - /// <summary> - /// Automatically calls <see cref="Dispose()"/> on all <see cref="GLResource"/> objects found on the given object. - /// </summary> - /// <param name="obj"></param> - public static void DisposeAll(object obj) - { - // get all fields, including backing fields for properties - foreach (var field in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) - { - // check if it should be released - if (typeof (GLResource).IsAssignableFrom(field.FieldType)) - { - // and release it - ((GLResource)field.GetValue(obj)).Dispose(); - } - } - } - } -} \ No newline at end of file diff --git a/ObjectTK/Logging/DefaultLogImpl.cs b/ObjectTK/Logging/DefaultLogImpl.cs deleted file mode 100644 index e42acb0..0000000 --- a/ObjectTK/Logging/DefaultLogImpl.cs +++ /dev/null @@ -1,135 +0,0 @@ -// -// DefaultLogImpl.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using log4net; -using log4net.Core; - -namespace ObjectTK.Logging -{ - public class DefaultLogImpl : IObjectTKLogger - { - protected virtual Type ThisDeclaringType => typeof(DefaultLogImpl); - protected ILogger _logger => _log.Logger; - - protected readonly ILog _log; - - public DefaultLogImpl(ILog logger) - { - _log = logger; - } - - public bool IsFatalEnabled => _log.IsFatalEnabled; - - public bool IsWarnEnabled => _log.IsWarnEnabled; - - public bool IsInfoEnabled => _log.IsInfoEnabled; - - public bool IsDebugEnabled => _log.IsDebugEnabled; - - public bool IsErrorEnabled => _log.IsErrorEnabled; - - private void Log(Level level, object message, Exception exception = null) - { - if (!_logger.IsEnabledFor(level)) return; - _logger.Log(ThisDeclaringType, level, message, exception); - } - - private void LogFormat(Level level, IFormatProvider provider, string format, params object[] args) - { - if (!_logger.IsEnabledFor(level)) return; - - var message = (provider == null) ? - string.Format(format, args) : - string.Format(provider, format, args); - - _logger.Log(ThisDeclaringType, level, message, null); - } - - private void LogFormat(Level level, string format, params object[] args) - { - LogFormat(null, format, args); - } - - public void Debug(object message, Exception exception = null) - { - Log(Level.Debug, message); - } - - public void DebugFormat(IFormatProvider provider, string format, params object[] args) - { - LogFormat(Level.Debug, provider, format, args); - } - - public void DebugFormat(string format, params object[] args) - { - LogFormat(Level.Debug, null, format, args); - } - - public void Error(object message, Exception exception = null) - { - Log(Level.Error, message); - } - - public void ErrorFormat(IFormatProvider provider, string format, params object[] args) - { - LogFormat(Level.Error, provider, format, args); - } - - public void ErrorFormat(string format, params object[] args) - { - LogFormat(Level.Error, null, format, args); - } - - public void Fatal(object message, Exception exception = null) - { - Log(Level.Fatal, message); - } - - public void FatalFormat(IFormatProvider provider, string format, params object[] args) - { - LogFormat(Level.Fatal, provider, format, args); - } - - public void FatalFormat(string format, params object[] args) - { - LogFormat(Level.Fatal, null, format, args); - } - - public void Info(object message, Exception exception = null) - { - Log(Level.Info, message); - } - - public void InfoFormat(IFormatProvider provider, string format, params object[] args) - { - LogFormat(Level.Info, provider, format, args); - } - - public void InfoFormat(string format, params object[] args) - { - LogFormat(Level.Info, null, format, args); - } - - public void Warn(object message, Exception exception = null) - { - Log(Level.Warn, message); - } - - public void WarnFormat(IFormatProvider provider, string format, params object[] args) - { - LogFormat(Level.Warn, provider, format, args); - } - - public void WarnFormat(string format, params object[] args) - { - LogFormat(Level.Warn, null, format, args); - } - } -} diff --git a/ObjectTK/Logging/IObjectTKLogger.cs b/ObjectTK/Logging/IObjectTKLogger.cs deleted file mode 100644 index 57b1b89..0000000 --- a/ObjectTK/Logging/IObjectTKLogger.cs +++ /dev/null @@ -1,45 +0,0 @@ -// -// IObjectTKLogger.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ObjectTK.Logging -{ - public interface IObjectTKLogger - { - bool IsFatalEnabled { get; } - bool IsWarnEnabled { get; } - bool IsInfoEnabled { get; } - bool IsDebugEnabled { get; } - bool IsErrorEnabled { get; } - - void Debug(object message, Exception exception = null); - void DebugFormat(IFormatProvider provider, string format, params object[] args); - void DebugFormat(string format, params object[] args); - - void Error(object message, Exception exception = null); - void ErrorFormat(IFormatProvider provider, string format, params object[] args); - void ErrorFormat(string format, params object[] args); - - void Fatal(object message, Exception exception = null); - void FatalFormat(IFormatProvider provider, string format, params object[] args); - void FatalFormat(string format, params object[] args); - - void Info(object message, Exception exception = null); - void InfoFormat(IFormatProvider provider, string format, params object[] args); - void InfoFormat(string format, params object[] args); - - void Warn(object message, Exception exception = null); - void WarnFormat(IFormatProvider provider, string format, params object[] args); - void WarnFormat(string format, params object[] args); - } -} diff --git a/ObjectTK/Logging/LogFactory.cs b/ObjectTK/Logging/LogFactory.cs deleted file mode 100644 index 32e5f46..0000000 --- a/ObjectTK/Logging/LogFactory.cs +++ /dev/null @@ -1,31 +0,0 @@ -// -// LogFactory.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.IO; -using log4net; - -namespace ObjectTK.Logging -{ - public static class LogFactory - { - public static readonly bool IsAvailable = File.Exists(AppDomain.CurrentDomain.BaseDirectory + "log4net.dll"); - - static IObjectTKLogger CreateLogger(Type type) - { - var logger = LogManager.GetLogger(type); - return logger != null ? new DefaultLogImpl(logger) : null; - } - - public static IObjectTKLogger GetLogger(Type type) - { - return IsAvailable ? CreateLogger(type) : null; - } - } -} diff --git a/ObjectTK/MathF.cs b/ObjectTK/MathF.cs deleted file mode 100644 index f0255ba..0000000 --- a/ObjectTK/MathF.cs +++ /dev/null @@ -1,52 +0,0 @@ -// -// MathF.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK; - -namespace ObjectTK -{ - /// <summary> - /// Provides mathematical constants and functions with float precision. - /// </summary> - public static class MathF - { - /// <summary> - /// Returns the sine of the specified angle. - /// </summary> - /// <param name="angle">An angle, measured in radians.</param> - /// <returns>The sine of angle. If angle is equal to NaN, NegativeInfinity, or PositiveInfinity, this method returns NaN.</returns> - public static float Sin(float angle) - { - return (float)Math.Sin(angle); - } - - /// <summary> - /// Returns the cosine of the specified angle. - /// </summary> - /// <param name="angle">An angle, measured in radians.</param> - /// <returns>The cosine of angle. If angle is equal to NaN, NegativeInfinity, or PositiveInfinity, this method returns NaN.</returns> - public static float Cos(float angle) - { - return (float)Math.Cos(angle); - } - - /// <summary> - /// Return the normal matrix, that is the upper 3x3 part of the inverted and transposed matrix. - /// </summary> - /// <param name="matrix">Specifies the transformation matrix.</param> - /// <returns>The normal matrix.</returns> - public static Matrix3 GetNormalMatrix(this Matrix4 matrix) - { - matrix.Invert(); - matrix.Transpose(); - return new Matrix3(matrix); - } - } -} \ No newline at end of file diff --git a/ObjectTK/ObjectTK.csproj b/ObjectTK/ObjectTK.csproj deleted file mode 100644 index c9c5171..0000000 --- a/ObjectTK/ObjectTK.csproj +++ /dev/null @@ -1,128 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProductVersion>8.0.30703</ProductVersion> - <SchemaVersion>2.0</SchemaVersion> - <ProjectGuid>{0EE3347B-1BBE-44CA-8295-22DA13AE914A}</ProjectGuid> - <OutputType>Library</OutputType> - <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>ObjectTK</RootNamespace> - <AssemblyName>ObjectTK</AssemblyName> - <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> - <FileAlignment>512</FileAlignment> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - <DocumentationFile>bin\Debug\ObjectTK.xml</DocumentationFile> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - <DocumentationFile>bin\Release\ObjectTK.xml</DocumentationFile> - </PropertyGroup> - <ItemGroup> - <Reference Include="log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath> - </Reference> - <Reference Include="OpenTK, Version=1.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\packages\OpenTK.1.1.1589.5942\lib\NET40\OpenTK.dll</HintPath> - </Reference> - <Reference Include="System" /> - <Reference Include="System.Core" /> - <Reference Include="System.Drawing" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Buffers\Buffer.cs" /> - <Compile Include="Buffers\BufferPod.cs" /> - <Compile Include="Buffers\Framebuffer.cs" /> - <Compile Include="Buffers\VertexArray.cs" /> - <Compile Include="Buffers\Renderbuffer.cs" /> - <Compile Include="Buffers\TransformFeedback.cs" /> - <Compile Include="Exceptions\ObjectTKException.cs" /> - <Compile Include="Exceptions\ObjectNotBoundException.cs" /> - <Compile Include="Exceptions\ProgramException.cs" /> - <Compile Include="Exceptions\ProgramLinkException.cs" /> - <Compile Include="Exceptions\QueryException.cs" /> - <Compile Include="Exceptions\ShaderCompileException.cs" /> - <Compile Include="Exceptions\UniformTypeNotSupportedException.cs" /> - <Compile Include="Extensions.cs" /> - <Compile Include="GLObject.cs" /> - <Compile Include="GLResource.cs" /> - <Compile Include="Logging\DefaultLogImpl.cs" /> - <Compile Include="Logging\IObjectTKLogger.cs" /> - <Compile Include="Logging\LogFactory.cs" /> - <Compile Include="MathF.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="Queries\QueryIndexer.cs" /> - <Compile Include="Queries\QueryMapping.cs" /> - <Compile Include="Shaders\ComputeProgram.cs" /> - <Compile Include="Shaders\Effect.cs" /> - <Compile Include="Shaders\Program.cs" /> - <Compile Include="Shaders\ProgramFactory.cs" /> - <Compile Include="Shaders\Shader.cs" /> - <Compile Include="Shaders\TransformProgram.cs" /> - <Compile Include="Shaders\Sources\ComputeShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Sources\FragmentShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Sources\GeometryShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Sources\ShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Sources\TessControlShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Sources\TessEvaluationShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Sources\VertexShaderSourceAttribute.cs" /> - <Compile Include="Shaders\Variables\BufferBinding.cs" /> - <Compile Include="Shaders\Variables\FragData.cs" /> - <Compile Include="Shaders\Variables\ImageUniform.cs" /> - <Compile Include="Shaders\Variables\ShaderStorage.cs" /> - <Compile Include="Shaders\Variables\ProgramVariable.cs" /> - <Compile Include="Shaders\Variables\TextureUniform.cs" /> - <Compile Include="Shaders\Variables\TransformOut.cs" /> - <Compile Include="Shaders\Variables\Uniform.cs" /> - <Compile Include="Shaders\Variables\UniformBuffer.cs" /> - <Compile Include="Shaders\Variables\UniformSetter.cs" /> - <Compile Include="Shaders\Variables\VertexAttrib.cs" /> - <Compile Include="Shaders\Variables\VertexAttribAttribute.cs" /> - <Compile Include="Textures\TextureBuffer.cs" /> - <Compile Include="Textures\BitmapFormat.cs" /> - <Compile Include="Textures\LayeredTexture.cs" /> - <Compile Include="Textures\Sampler.cs" /> - <Compile Include="Textures\Texture.cs" /> - <Compile Include="Textures\Texture1D.cs" /> - <Compile Include="Textures\Texture1DArray.cs" /> - <Compile Include="Textures\Texture2D.cs" /> - <Compile Include="Textures\Texture2DArray.cs" /> - <Compile Include="Textures\Texture2DMultisample.cs" /> - <Compile Include="Textures\Texture2DMultisampleArray.cs" /> - <Compile Include="Textures\Texture3D.cs" /> - <Compile Include="Textures\TextureCubemap.cs" /> - <Compile Include="Textures\TextureCubemapArray.cs" /> - <Compile Include="Textures\BitmapTexture.cs" /> - <Compile Include="Textures\TextureFactory.cs" /> - <Compile Include="Textures\TextureRectangle.cs" /> - <Compile Include="Utility.cs" /> - <Compile Include="Vector3i.cs" /> - </ItemGroup> - <ItemGroup> - <None Include="packages.config" /> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project> \ No newline at end of file diff --git a/ObjectTK/Properties/AssemblyInfo.cs b/ObjectTK/Properties/AssemblyInfo.cs deleted file mode 100644 index c9458d9..0000000 --- a/ObjectTK/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,48 +0,0 @@ -#region License -// ObjectTK License -// Copyright (C) 2013-2015 J.C.Bernack -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -#endregion -using System.Reflection; -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("ObjectTK")] -[assembly: AssemblyDescription("Abstraction layer on top of OpenTK to provide OpenGL features in an object-oriented and type-safe manner with modern C#-style")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("JcBernack")] -[assembly: AssemblyProduct("ObjectTK")] -[assembly: AssemblyCopyright("Copyright © 2013-2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8133d931-0992-47fd-b4a0-f7ee832615cd")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.*")] \ No newline at end of file diff --git a/ObjectTK/Queries/QueryIndexer.cs b/ObjectTK/Queries/QueryIndexer.cs deleted file mode 100644 index eb12ef7..0000000 --- a/ObjectTK/Queries/QueryIndexer.cs +++ /dev/null @@ -1,69 +0,0 @@ -// -// QueryIndexer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Collections.Generic; -using ObjectTK.Exceptions; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Queries -{ - /// <summary> - /// Base class for <see cref="QueryMapping{T}"/>.<br/> - /// Provides methods to prevent query collisions on standard and indexable <see cref="QueryTarget"/>s. - /// </summary> - public abstract class QueryIndexer - : GLResource - { - /// <summary> - /// Stores indices currently in use for each QueryTarget. - /// </summary> - private static readonly Dictionary<QueryTarget, SortedSet<int>> TargetIndices = new Dictionary<QueryTarget, SortedSet<int>>(); - - /// <summary> - /// Defines which <see cref="QueryTarget"/> is indexable. - /// </summary> - private static readonly List<QueryTarget> IndexableTargets = new List<QueryTarget> - { - QueryTarget.PrimitivesGenerated, - QueryTarget.TransformFeedbackPrimitivesWritten - }; - - /// <summary> - /// Acquires an unused index for the given <see cref="QueryTarget"/>. - /// </summary> - /// <param name="target">The QueryTarget to acquire an index for.</param> - /// <returns>Unused index.</returns> - protected static int AcquireIndex(QueryTarget target) - { - if (!TargetIndices.ContainsKey(target)) TargetIndices.Add(target, new SortedSet<int>()); - // find first free index - var i = 0; - foreach (var index in TargetIndices[target]) - { - if (index > i) break; - i++; - } - if (!IndexableTargets.Contains(target) && i > 0) throw new QueryException( - string.Format("Query target not indexable and the single target it already in use: {0}", target)); - // remember index is in use - TargetIndices[target].Add(i); - return i; - } - - /// <summary> - /// Releases a previously acquired index for the given <see cref="QueryTarget"/>. - /// </summary> - /// <param name="target">The QueryTarget to release the index from.</param> - /// <param name="index">The index to release.</param> - protected static void ReleaseIndex(QueryTarget target, int index) - { - TargetIndices[target].Remove(index); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Queries/QueryMapping.cs b/ObjectTK/Queries/QueryMapping.cs deleted file mode 100644 index e5b08a9..0000000 --- a/ObjectTK/Queries/QueryMapping.cs +++ /dev/null @@ -1,166 +0,0 @@ -// -// QueryMapping.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.Linq; -using ObjectTK.Exceptions; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Queries -{ - /// <summary> - /// Provides named queries of hardware counters. - /// </summary> - /// <typeparam name="T">An enum type containing the query names.</typeparam> - public class QueryMapping<T> - : QueryIndexer - where T : struct, IConvertible - { - /// <summary> - /// Represents an OpenGL query. - /// </summary> - private class QueryMap - : GLObject - { - internal bool Active; - internal QueryTarget Target; - internal int Index; - - public int Value; - public int Average; - - public QueryMap() - : base(GL.GenQuery()) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteQuery(Handle); - } - } - - - /// <summary> - /// Gets the average value measured for the given query name. - /// </summary> - /// <param name="key"></param> - public float this[T key] - { - get - { - return _queries[key].Average; - } - } - - /// <summary> - /// Elapsed time is measured in nanoseconds and divided by this factor for better readability.<br/> - /// A factor of 1,000 therefore results in microseconds, a factor of 1,000,000 results in milliseconds. - /// </summary> - public int ElapsedTimeFactor = 1000; - - /// <summary> - /// Weighting factor used for averaging.<br/> - /// A value close to 1 enables very fast averaging, giving noisy results.<br/> - /// A value close to 0 gives a better mean, reacting much slower to fluctuations in the results.<br/> - /// The default value is 0.05f.<br/> - /// Let the current and the previous query result be A and B, respectively, then the average is calculated with this formula:<br/> - /// average = A * AveragingFactor + B * (1-AveragingFactor);<br/> - /// </summary> - public float AveragingFactor = 0.05f; - - /// <summary> - /// Holds all QueryMap objects. - /// </summary> - private readonly Dictionary<T, QueryMap> _queries; - - /// <summary> - /// Initializes a new instance of this QueryMapping and generates required query objects. - /// </summary> - public QueryMapping() - { - if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); - // create a query object for each enum entry - _queries = Enum.GetValues(typeof (T)).Cast<T>().ToDictionary(_ => _, _ => new QueryMap()); - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - foreach (var queryMap in _queries.Values) - { - queryMap.Dispose(); - } - } - - /// <summary> - /// Begins the given query name. - /// </summary> - /// <param name="mapping">The query name to begin.</param> - /// <param name="target">The query target to capture.</param> - public void Begin(T mapping, QueryTarget target) - { - var map = _queries[mapping]; - if (map.Active) throw new QueryException(string.Format("Query already active: {0} {1}", target, mapping)); - map.Active = true; - map.Target = target; - map.Index = AcquireIndex(target); - GL.BeginQueryIndexed(target, map.Index, map.Handle); - } - - /// <summary> - /// End the given query name. - /// </summary> - /// <param name="mapping">The query name to end.</param> - public void End(T mapping) - { - var map = _queries[mapping]; - if (!map.Active) throw new QueryException(string.Format("Query not active: {0}", mapping)); - GL.EndQueryIndexed(map.Target, map.Index); - ReleaseIndex(map.Target, map.Index); - map.Active = false; - } - - /// <summary> - /// Updates all query results. - /// </summary> - public void Update() - { - foreach (var map in _queries.Values) - { - // get current value - GL.GetQueryObject(map.Handle, GetQueryObjectParam.QueryResult, out map.Value); - // scale elapsed time - if (map.Target == QueryTarget.TimeElapsed) map.Value /= ElapsedTimeFactor; - // calculate averaged value - map.Average = (int)(map.Value * AveragingFactor + map.Average * (1 - AveragingFactor)); - } - } - - /// <summary> - /// Retrieves query results. - /// </summary> - /// <returns>The query results.</returns> - public IEnumerable<KeyValuePair<T, int>> GetValues() - { - return _queries.Select(map => new KeyValuePair<T, int>(map.Key, map.Value.Value)); - } - - /// <summary> - /// Retrieves averaged query results. - /// </summary> - /// <returns>The averaged query results.</returns> - public IEnumerable<KeyValuePair<T, int>> GetAverages() - { - return _queries.Select(map => new KeyValuePair<T, int>(map.Key, map.Value.Average)); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/ComputeProgram.cs b/ObjectTK/Shaders/ComputeProgram.cs deleted file mode 100644 index 2554211..0000000 --- a/ObjectTK/Shaders/ComputeProgram.cs +++ /dev/null @@ -1,125 +0,0 @@ -// -// ComputeProgram.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Linq; -using ObjectTK.Shaders.Sources; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders -{ - /// <summary> - /// Represents a program object which contains compute shaders. - /// </summary> - public class ComputeProgram - : Program - { - /// <summary> - /// The work group size of the compute shader. - /// </summary> - public Vector3i WorkGroupSize { get; protected set; } - - /// <summary> - /// The total number of work groups of this compute shader. - /// </summary> - public int WorkGroupTotalSize { get; protected set; } - - /// <summary> - /// The maximum work group size of compute shaders.<br/> - /// The values are hardware dependent and queried from OpenGL. - /// </summary> - public static Vector3i MaximumWorkGroupSize { get; protected set; } - - static ComputeProgram() - { - int x,y,z; - GL.GetInteger((GetIndexedPName)All.MaxComputeWorkGroupCount, 0, out x); - GL.GetInteger((GetIndexedPName)All.MaxComputeWorkGroupCount, 1, out y); - GL.GetInteger((GetIndexedPName)All.MaxComputeWorkGroupCount, 2, out z); - MaximumWorkGroupSize = new Vector3i(x,y,z); - } - - /// <summary> - /// Initializes a new instance of this compute shader.<br/> - /// Retrieves shader source filenames from ShaderSourceAttributes tagged to this type. - /// </summary> - protected ComputeProgram() - { - if (ShaderSourceAttribute.GetShaderSources(GetType()).Any(_ => _.Type != ShaderType.ComputeShader)) - throw new ApplicationException("Invalid ShaderType supplied to compute shader via ShaderSourceAttribute(s)."); - } - - public override void Link() - { - base.Link(); - // query the work group size - var sizes = new int[3]; - GL.GetProgram(Handle, (GetProgramParameterName)All.ComputeWorkGroupSize, sizes); - WorkGroupSize = new Vector3i(sizes[0], sizes[1], sizes[2]); - WorkGroupTotalSize = sizes[0] * sizes[1] * sizes[2]; - } - - /// <summary> - /// Splits a given number of work groups up to the three dimensions. - /// The number of work groups in any dimensions is kept less or equal to the supported maximum. - /// The resulting total number of work groups may be larger than the given number. - /// </summary> - public static Vector3i SplitWorkGroups(long groups) - { - //TODO: add missing limitations. there is not only the limitation on workgroup size in each dimension but also for the total number of work groups - if (groups > (long)MaximumWorkGroupSize.X * MaximumWorkGroupSize.Y * MaximumWorkGroupSize.Z) - throw new ArgumentOutOfRangeException("groups", groups, "Maximum number of work groups exceeded."); - double n = groups; - // determine number of layers needed - var z = (int)Math.Ceiling(n / ((long)MaximumWorkGroupSize.X * MaximumWorkGroupSize.Y)); - // determine the number of items per layer - n = Math.Ceiling(n / z); - // determine x and y to have the smallest number of items equal or larger to n - var y = (int)Math.Ceiling(n / MaximumWorkGroupSize.X); - var x = (int)Math.Ceiling(n / y); - return new Vector3i(x, y, z); - } - - /// <summary> - /// Dispatches the currently active compute shader. - /// </summary> - public static void Dispatch(int x, int y, int z) - { - GL.DispatchCompute(x, y, z); - } - - /// <summary> - /// Dispatches the currently active compute shader. - /// </summary> - /// <param name="workGroups">The number of work groups to be launched for each dimension.</param> - public static void Dispatch(Vector3i workGroups) - { - GL.DispatchCompute(workGroups.X, workGroups.Y, workGroups.Z); - } - - /// <summary> - /// Dispatches the currently active compute shader. - /// May split the number of work groups up to more dimensions. - /// </summary> - public static void Dispatch(int total) - { - Dispatch(SplitWorkGroups(total)); - } - - /// <summary> - /// Dispatches the currently active compute shader. - /// Uses the shaders work group size to launch as many work groups as necessary to reach the given number of invocations. - /// May also split the number of work groups up to more dimensions. - /// </summary> - public void DispatchInvocations(int invocations) - { - Dispatch((int)Math.Ceiling((float)invocations / WorkGroupTotalSize)); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Effect.cs b/ObjectTK/Shaders/Effect.cs deleted file mode 100644 index 921307a..0000000 --- a/ObjectTK/Shaders/Effect.cs +++ /dev/null @@ -1,156 +0,0 @@ -// -// Effect.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace ObjectTK.Shaders -{ - /// <summary> - /// Represents an effect file which may contain several sections, each containing the source of a shader.<br/> - /// Similar implementation to GLSW: http://prideout.net/blog/?p=11 - /// </summary> - public class Effect - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(Effect)); - - private static readonly Dictionary<string, Effect> Cache = new Dictionary<string, Effect>(); - - /// <summary> - /// Specifies the Path to the effects source file. - /// </summary> - public string Path { get; private set; } - - /// <summary> - /// Holds all sections contained within this effect. - /// </summary> - private readonly Dictionary<string, Section> _sections; - - /// <summary> - /// Represents a section within an effect file. - /// </summary> - public class Section - { - /// <summary> - /// Holds a reference to the effect which contains this section. - /// </summary> - public Effect Effect; - - /// <summary> - /// The shader key to this section. - /// </summary> - public string ShaderKey; - - /// <summary> - /// The source within this section. - /// </summary> - public string Source; - - /// <summary> - /// Specifies the first line number of this section within the effect file. - /// </summary> - public int FirstLineNumber; - } - - private Effect(string path) - { - Path = path; - _sections = new Dictionary<string, Section>(); - } - - /// <summary> - /// Retrieves the best matching section to the given shader key. - /// </summary> - /// <param name="shaderKey">The shader key to find the best match for.</param> - /// <returns>A section containing shader source.</returns> - public Section GetMatchingSection(string shaderKey) - { - Section closestMatch = null; - foreach (var section in _sections.Values) - { - // find longest matching section key - if (shaderKey.StartsWith(section.ShaderKey) && (closestMatch == null || section.ShaderKey.Length > closestMatch.ShaderKey.Length)) - { - closestMatch = section; - } - } - return closestMatch; - } - - /// <summary> - /// Retrieves the best matching section from the effect file. - /// </summary> - /// <param name="effectPath">Specifies the path to the effect file.</param> - /// <param name="shaderKey">The shader key to find the best match for.</param> - /// <returns>A section containing shader source.</returns> - public static Section GetSection(string effectPath, string shaderKey) - { - return LoadEffect(effectPath).GetMatchingSection(shaderKey); - } - - /// <summary> - /// Loads the the given effect file and parses its sections. - /// </summary> - /// <param name="path">Specifies the path to the effect file.</param> - /// <returns>A new Effect object containing the parsed content from the file.</returns> - public static Effect LoadEffect(string path) - { - // return cached effect if available - if (Cache.ContainsKey(path)) return Cache[path]; - // otherwise load the whole effect file - const string sectionSeparator = "--"; - try - { - using (var reader = new StreamReader(path)) - { - var effect = new Effect(path); - var source = new StringBuilder(); - Section section = null; - var lineNumber = 1; - while (!reader.EndOfStream) - { - // read the file line by line - var line = reader.ReadLine(); - if (line == null) break; - // count line number - lineNumber++; - // append code to current section until a section separator is reached - if (!line.StartsWith(sectionSeparator)) - { - source.AppendLine(line); - continue; - } - // write source to current section - if (section != null) section.Source = source.ToString(); - // start new section - section = new Section - { - Effect = effect, - ShaderKey = line.Substring(sectionSeparator.Length).Trim(), - FirstLineNumber = lineNumber - }; - effect._sections.Add(section.ShaderKey, section); - source.Clear(); - } - // make sure the last section is finished - if (section != null) section.Source = source.ToString(); - // cache the effect - Cache.Add(path, effect); - return effect; - } - } - catch (FileNotFoundException ex) - { - Logger?.Error("Effect source file not found.", ex); - throw; - } - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Program.cs b/ObjectTK/Shaders/Program.cs deleted file mode 100644 index 5dee7a7..0000000 --- a/ObjectTK/Shaders/Program.cs +++ /dev/null @@ -1,133 +0,0 @@ -// -// Program.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using ObjectTK.Exceptions; -using ObjectTK.Shaders.Variables; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders -{ - /// <summary> - /// Represents a program object. - /// </summary> - public class Program - : GLObject - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(Program)); - - /// <summary> - /// The name of this shader program. - /// </summary> - public string Name { get { return GetType().Name; } } - - private List<ProgramVariable> _variables; - - /// <summary> - /// Initializes a new program object. - /// </summary> - protected Program() - : base(GL.CreateProgram()) - { - Logger?.InfoFormat("Creating shader program: {0}", Name); - InitializeShaderVariables(); - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteProgram(Handle); - } - - private void InitializeShaderVariables() - { - const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public; - _variables = new List<ProgramVariable>(); - foreach (var property in GetType().GetProperties(flags).Where(_ => typeof(ProgramVariable).IsAssignableFrom(_.PropertyType))) - { - var instance = (ProgramVariable)Activator.CreateInstance(property.PropertyType, true); - instance.Initialize(this, property); - property.SetValue(this, instance, null); - _variables.Add(instance); - } - } - - /// <summary> - /// Activate the program. - /// </summary> - public void Use() - { - GL.UseProgram(Handle); - } - - /// <summary> - /// Attach shader object. - /// </summary> - /// <param name="shader">Specifies the shader object to attach.</param> - public void Attach(Shader shader) - { - GL.AttachShader(Handle, shader.Handle); - } - - /// <summary> - /// Detach shader object. - /// </summary> - /// <param name="shader">Specifies the shader object to detach.</param> - public void Detach(Shader shader) - { - GL.DetachShader(Handle, shader.Handle); - } - - /// <summary> - /// Link the program. - /// </summary> - public virtual void Link() - { - Logger?.DebugFormat("Linking program: {0}", Name); - GL.LinkProgram(Handle); - CheckLinkStatus(); - // call OnLink() on all ShaderVariables - _variables.ForEach(_ => _.OnLink()); - } - - /// <summary> - /// Assert that no link error occured. - /// </summary> - private void CheckLinkStatus() - { - // check link status - int linkStatus; - GL.GetProgram(Handle, GetProgramParameterName.LinkStatus, out linkStatus); - Logger?.DebugFormat("Link status: {0}", linkStatus); - // check program info log - var info = GL.GetProgramInfoLog(Handle); - if (!string.IsNullOrEmpty(info)) Logger?.InfoFormat("Link log:\n{0}", info); - // log message and throw exception on link error - if (linkStatus == 1) return; - var msg = string.Format("Error linking program: {0}", Name); - Logger?.Error(msg); - throw new ProgramLinkException(msg, info); - } - - /// <summary> - /// Throws an <see cref="ObjectNotBoundException"/> if this program is not the currently active one. - /// </summary> - public void AssertActive() - { -#if DEBUG - int activeHandle; - GL.GetInteger(GetPName.CurrentProgram, out activeHandle); - if (activeHandle != Handle) throw new ObjectNotBoundException("Program object is not currently active."); -#endif - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/ProgramFactory.cs b/ObjectTK/Shaders/ProgramFactory.cs deleted file mode 100644 index ab9c71a..0000000 --- a/ObjectTK/Shaders/ProgramFactory.cs +++ /dev/null @@ -1,163 +0,0 @@ -// -// ProgramFactory.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using ObjectTK.Exceptions; -using ObjectTK.Shaders.Sources; - -namespace ObjectTK.Shaders -{ - /// <summary> - /// Contains methods to automatically initialize program objects. - /// </summary> - public static class ProgramFactory - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(ProgramFactory)); - - /// <summary> - /// The base path used when looking for shader files.<br/> - /// Default is: Data/Shaders/ - /// </summary> - public static string BasePath { get; set; } - - /// <summary> - /// Specifies the default extension appended to effect names.<br/> - /// Default is: glsl - /// </summary> - public static string Extension { get; set; } - - static ProgramFactory() - { - BasePath = Path.Combine("Data", "Shaders"); - Extension = "glsl"; - } - - /// <summary> - /// Initializes a program object using the shader sources tagged to the type with <see cref="ShaderSourceAttribute"/>. - /// </summary> - /// <typeparam name="T">Specifies the program type to create.</typeparam> - /// <returns>A compiled and linked program.</returns> - public static T Create<T>() - where T : Program - { - // retrieve shader types and filenames from attributes - var shaders = ShaderSourceAttribute.GetShaderSources(typeof(T)); - if (shaders.Count == 0) throw new ObjectTKException("ShaderSourceAttribute(s) missing!"); - // create program instance - var program = (T)Activator.CreateInstance(typeof(T)); - try - { - // compile and attach all shaders - foreach (var attribute in shaders) - { - // create a new shader of the appropriate type - using (var shader = new Shader(attribute.Type)) - { - Logger?.DebugFormat("Compiling {0}: {1}", attribute.Type, attribute.EffectKey); - // load the source from effect(s) - var included = new List<Effect.Section>(); - var source = GetShaderSource(attribute.EffectKey, included); - // assign source filenames for proper information log output - shader.SourceFiles = included.Select(_ => _.Effect.Path).ToList(); - // compile shader source - shader.CompileSource(source); - // attach shader to the program - program.Attach(shader); - } - } - // link and return the program - program.Link(); - } - catch - { - program.Dispose(); - throw; - } - return program; - } - - /// <summary> - /// Load shader source file(s).<br/> - /// Supports multiple source files via "#include xx" directives and corrects the line numbering by using the glsl standard #line directive. - /// </summary> - /// <param name="effectKey">Specifies the effect key to load.</param> - /// <param name="included">Holds the effectKeys of all shaders already loaded to prevent multiple inclusions.</param> - /// <returns>The fully assembled shader source.</returns> - private static string GetShaderSource(string effectKey, List<Effect.Section> included = null) - { - if (included == null) included = new List<Effect.Section>(); - // retrieve effect section - Effect.Section section; - try - { - var directory = Path.GetDirectoryName(effectKey); - var filename = Path.GetFileName(effectKey); - var separator = filename.IndexOf('.'); - var effectPath = Path.ChangeExtension(Path.Combine(BasePath, directory, filename.Substring(0, separator)), Extension); - var shaderKey = filename.Substring(separator + 1); - section = Effect.GetSection(effectPath, shaderKey); - } - catch (Exception ex) - { - throw new Exception(string.Format("Invalid effect key: {0}", effectKey), ex); - } - if (section == null) throw new Exception(string.Format("Shader source not found: {0}", effectKey)); - // check for multiple includes of the same section - if (included.Contains(section)) - { - Logger?.WarnFormat("Shader already included: {0}", effectKey); - return ""; - } - included.Add(section); - // parse source for #include directives and insert proper #line annotations - using (var reader = new StringReader(section.Source)) - { - var source = new StringBuilder(); - var lineNumber = section.FirstLineNumber; - var fileNumber = included.Count-1; - var fixLine = true; - while (true) - { - var line = reader.ReadLine(); - if (line == null) break; - // check if it is an include statement - const string includeKeyword = "#include"; - const string versionKeyword = "#version"; - if (!line.StartsWith(includeKeyword)) - { - // add correct line number offset to the corresponding section within the effect file - if ((fixLine)&& !line.StartsWith(versionKeyword) ) - { - source.AppendLine(string.Format("#line {0} {1}", lineNumber, fileNumber)); - fixLine = false; - } - source.AppendLine(line); - } - else - { - // parse the included filename - var includedEffectKey = line.Remove(0, includeKeyword.Length).Trim(); - // make the include path relative to the current file - includedEffectKey = Path.Combine(Path.GetDirectoryName(effectKey) ?? "", includedEffectKey); - // replace current line with the source of the included section - source.Append(GetShaderSource(includedEffectKey, included)); - // remember to fix the line numbering on the next line - fixLine = true; - } - lineNumber++; - } - return source.ToString(); - } - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Shader.cs b/ObjectTK/Shaders/Shader.cs deleted file mode 100644 index 2e5daaa..0000000 --- a/ObjectTK/Shaders/Shader.cs +++ /dev/null @@ -1,92 +0,0 @@ -// -// Shader.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Collections.Generic; -using System.Text.RegularExpressions; -using ObjectTK.Exceptions; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders -{ - /// <summary> - /// Represents a shader object. - /// </summary> - public class Shader - : GLObject - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(Shader)); - - /// <summary> - /// Specifies the type of this shader. - /// </summary> - public readonly ShaderType Type; - - /// <summary> - /// Specifies a list of source filenames which are used to improve readability of the the information log in case of an error. - /// </summary> - public List<string> SourceFiles; - - /// <summary> - /// Used to match and replace the source filenames into the information log. - /// </summary> - private static readonly Regex Regenechse = new Regex(@"^ERROR: (\d+):", RegexOptions.Multiline); - - /// <summary> - /// Initializes a new shader object of the given type. - /// </summary> - /// <param name="type"></param> - public Shader(ShaderType type) - : base(GL.CreateShader(type)) - { - Type = type; - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteShader(Handle); - } - - /// <summary> - /// Loads the given source file and compiles the shader. - /// </summary> - public void CompileSource(string source) - { - GL.ShaderSource(Handle, source); - GL.CompileShader(Handle); - CheckCompileStatus(); - } - - /// <summary> - /// Assert that no compile error occured. - /// </summary> - private void CheckCompileStatus() - { - // check compile status - int compileStatus; - GL.GetShader(Handle, ShaderParameter.CompileStatus, out compileStatus); - Logger?.DebugFormat("Compile status: {0}", compileStatus); - // check shader info log - var info = GL.GetShaderInfoLog(Handle); - if (SourceFiles != null) info = Regenechse.Replace(info, GetSource); - if (!string.IsNullOrEmpty(info)) Logger?.InfoFormat("Compile log:\n{0}", info); - // log message and throw exception on compile error - if (compileStatus == 1) return; - const string msg = "Error compiling shader."; - Logger?.Error(msg); - throw new ShaderCompileException(msg, info); - } - - private string GetSource(Match match) - { - var index = int.Parse(match.Groups[1].Value); - return index < SourceFiles.Count ? string.Format("ERROR: {0}:", SourceFiles[index]) : match.ToString(); - } - } -} diff --git a/ObjectTK/Shaders/Sources/ComputeShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/ComputeShaderSourceAttribute.cs deleted file mode 100644 index bb8a8ca..0000000 --- a/ObjectTK/Shaders/Sources/ComputeShaderSourceAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// ComputeShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies the source of a compute shader. - /// </summary> - public class ComputeShaderSourceAttribute - : ShaderSourceAttribute - { - /// <summary> - /// Initializes a new instance of the ComputeShaderSourceAttribute. - /// </summary> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - public ComputeShaderSourceAttribute(string effectKey) - : base(ShaderType.ComputeShader, effectKey) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Sources/FragmentShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/FragmentShaderSourceAttribute.cs deleted file mode 100644 index 50a0a62..0000000 --- a/ObjectTK/Shaders/Sources/FragmentShaderSourceAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// FragmentShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies the source of a fragment shader. - /// </summary> - public class FragmentShaderSourceAttribute - : ShaderSourceAttribute - { - /// <summary> - /// Initializes a new instance of the FragmentShaderSourceAttribute. - /// </summary> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - public FragmentShaderSourceAttribute(string effectKey) - : base(ShaderType.FragmentShader, effectKey) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Sources/GeometryShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/GeometryShaderSourceAttribute.cs deleted file mode 100644 index ca555ae..0000000 --- a/ObjectTK/Shaders/Sources/GeometryShaderSourceAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// GeometryShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies the source of a geometry shader. - /// </summary> - public class GeometryShaderSourceAttribute - : ShaderSourceAttribute - { - /// <summary> - /// Initializes a new instance of the GeometryShaderSourceAttribute. - /// </summary> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - public GeometryShaderSourceAttribute(string effectKey) - : base(ShaderType.GeometryShader, effectKey) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Sources/ShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/ShaderSourceAttribute.cs deleted file mode 100644 index 6fb77d4..0000000 --- a/ObjectTK/Shaders/Sources/ShaderSourceAttribute.cs +++ /dev/null @@ -1,56 +0,0 @@ -// -// ShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.Linq; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies a source file which contains a single shader of predefined type. - /// </summary> - [AttributeUsage(AttributeTargets.Class)] - public class ShaderSourceAttribute - : Attribute - { - /// <summary> - /// Specifies the type of shader. - /// </summary> - public ShaderType Type { get; private set; } - - /// <summary> - /// Specifies the effect key for this shader.<br/> - /// Example: Path/to/file/CoolShader.Fragment.Diffuse - /// </summary> - public string EffectKey { get; private set; } - - /// <summary> - /// Initializes a new instance of the ShaderSourceAttribute. - /// </summary> - /// <param name="type">Specifies the type of the shader.</param> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - protected ShaderSourceAttribute(ShaderType type, string effectKey) - { - Type = type; - EffectKey = effectKey; - } - - /// <summary> - /// Retrieves all shader sources from attributes tagged to the given program type. - /// </summary> - /// <param name="programType">Specifies the type of the program of which the shader sources are to be found.</param> - /// <returns>A mapping of ShaderType and source path.</returns> - public static List<ShaderSourceAttribute> GetShaderSources(Type programType) - { - return programType.GetCustomAttributes<ShaderSourceAttribute>(true).ToList(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Sources/TessControlShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/TessControlShaderSourceAttribute.cs deleted file mode 100644 index 0e2b165..0000000 --- a/ObjectTK/Shaders/Sources/TessControlShaderSourceAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// TessControlShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies the source of a vertex shader. - /// </summary> - public class TessControlShaderSourceAttribute - : ShaderSourceAttribute - { - /// <summary> - /// Initializes a new instance of the TessControlShaderSourceAttribute. - /// </summary> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - public TessControlShaderSourceAttribute(string effectKey) - : base(ShaderType.TessControlShader, effectKey) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Sources/TessEvaluationShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/TessEvaluationShaderSourceAttribute.cs deleted file mode 100644 index fe00f44..0000000 --- a/ObjectTK/Shaders/Sources/TessEvaluationShaderSourceAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// TessEvaluationShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies the source of a vertex shader. - /// </summary> - public class TessEvaluationShaderSourceAttribute - : ShaderSourceAttribute - { - /// <summary> - /// Initializes a new instance of the TessEvaluationShaderSourceAttribute. - /// </summary> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - public TessEvaluationShaderSourceAttribute(string effectKey) - : base(ShaderType.TessEvaluationShader, effectKey) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Sources/VertexShaderSourceAttribute.cs b/ObjectTK/Shaders/Sources/VertexShaderSourceAttribute.cs deleted file mode 100644 index eb56e04..0000000 --- a/ObjectTK/Shaders/Sources/VertexShaderSourceAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// VertexShaderSourceAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Sources -{ - /// <summary> - /// Specifies the source of a vertex shader. - /// </summary> - public class VertexShaderSourceAttribute - : ShaderSourceAttribute - { - /// <summary> - /// Initializes a new instance of the VertexShaderSourceAttribute. - /// </summary> - /// <param name="effectKey">Specifies the effect key for this shader.</param> - public VertexShaderSourceAttribute(string effectKey) - : base(ShaderType.VertexShader, effectKey) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/TransformProgram.cs b/ObjectTK/Shaders/TransformProgram.cs deleted file mode 100644 index ceda9bb..0000000 --- a/ObjectTK/Shaders/TransformProgram.cs +++ /dev/null @@ -1,80 +0,0 @@ -// -// TransformProgram.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Linq; -using ObjectTK.Exceptions; -using ObjectTK.Shaders.Variables; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders -{ - /// <summary> - /// Represents a program object which utilizes transform feedback. - /// </summary> - public class TransformProgram - : Program - { - /// <summary> - /// Represents "gl_NextBuffer" when specifying feedback varyings and using advanced interleaving. - /// </summary> - public static TransformOut NextBuffer = new TransformOut("gl_NextBuffer"); - - /// <summary> - /// Represents "gl_SkipComponents1" when specifying feedback varyings and using advanced interleaving. - /// </summary> - public static TransformOut SkipComponents1 = new TransformOut("gl_SkipComponents1"); - - /// <summary> - /// Represents "gl_SkipComponents2" when specifying feedback varyings and using advanced interleaving. - /// </summary> - public static TransformOut SkipComponents2 = new TransformOut("gl_SkipComponents2"); - - /// <summary> - /// Represents "gl_SkipComponents3" when specifying feedback varyings and using advanced interleaving. - /// </summary> - public static TransformOut SkipComponents3 = new TransformOut("gl_SkipComponents3"); - - /// <summary> - /// Represents "gl_SkipComponents4" when specifying feedback varyings and using advanced interleaving. - /// </summary> - public static TransformOut SkipComponents4 = new TransformOut("gl_SkipComponents4"); - - /// <summary> - /// Holds a list of all special keywords which can only be used with advanced interleaving. - /// </summary> - private static readonly TransformOut[] SpecialOuts = { NextBuffer, SkipComponents1, SkipComponents2, SkipComponents3, SkipComponents4 }; - - /// <summary> - /// Specify values to record in transform feedback buffers. - /// </summary> - /// <remarks> - /// Transform feedback varyings must be specified before linking the program. Either specify them in the constructor of the program - /// or call <see cref="Program.Link"/> again after a call to this method.<br/> - /// To specify the keywords introduced with advanced interleaving "gl_NextBuffer" and "gl_SkipComponents#" - /// use the TransformOut dummy-instances <see cref="NextBuffer"/> and <see cref="SkipComponents1"/>, etc. - /// </remarks> - /// <param name="bufferMode">Identifies the mode used to capture the varying variables when transform feedback is active. bufferMode must be InterleavedAttribs or SeparateAttribs.</param> - /// <param name="feedbackVaryings">An array of TransformOut objects specifying the varying variables to use for transform feedback.</param> - public void FeedbackVaryings(TransformFeedbackMode bufferMode, params TransformOut[] feedbackVaryings) - { - //TODO: find out if the varyings buffer binding indices can be queried from OpenGL - var index = 0; - foreach (var output in feedbackVaryings) - { - if (bufferMode == TransformFeedbackMode.SeparateAttribs && SpecialOuts.Contains(output)) - throw new ObjectTKException("Advanced interleaving features can not be used with separate mode."); - // set the outputs buffer binding index - output.Index = index; - // increase the index if all outputs get routed to a separate bindind or if the gl_NextBuffer keyword is found - if (bufferMode == TransformFeedbackMode.SeparateAttribs || output == NextBuffer) index++; - } - GL.TransformFeedbackVaryings(Handle, feedbackVaryings.Length, feedbackVaryings.Select(_ => _.Name).ToArray(), bufferMode); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/BufferBinding.cs b/ObjectTK/Shaders/Variables/BufferBinding.cs deleted file mode 100644 index f2b8cac..0000000 --- a/ObjectTK/Shaders/Variables/BufferBinding.cs +++ /dev/null @@ -1,98 +0,0 @@ -// -// BufferBinding.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using ObjectTK.Buffers; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a shader buffer binding point identified by its resource index. - /// </summary> - public abstract class BufferBinding - : ProgramVariable - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(BufferBinding)); - - /// <summary> - /// The target to use when binding to this point. - /// </summary> - public readonly BufferRangeTarget BindingTarget; - - /// <summary> - /// The resource index of this binding point. - /// </summary> - public int Index { get; private set; } - - /// <summary> - /// Current binding point - /// </summary> - protected int Binding; - - private readonly ProgramInterface _programInterface; - - internal BufferBinding(BufferRangeTarget bindingTarget, ProgramInterface programInterface) - { - BindingTarget = bindingTarget; - _programInterface = programInterface; - } - - internal override void OnLink() - { - Index = GL.GetProgramResourceIndex(ProgramHandle, _programInterface, Name); - Active = Index > -1; - if (!Active) Logger?.WarnFormat("Binding block not found or not active: {0}", Name); - Binding = -1; - } - - /// <summary> - /// Assigns a binding point. - /// </summary> - public virtual void ChangeBinding(int binding) - { - Binding = binding; - } - - /// <summary> - /// Binds a buffer to this binding point. - /// </summary> - /// <typeparam name="T">The type of the container elements.</typeparam> - /// <param name="buffer">The buffer to bind.</param> - public void BindBuffer<T>(Buffer<T> buffer) - where T : struct - { - if (!Active) return; - GL.BindBufferBase(BindingTarget, Binding, buffer.Handle); - } - - /// <summary> - /// Binds a buffer to this binding point. - /// </summary> - /// <typeparam name="T">The type of the container elements.</typeparam> - /// <param name="buffer">The buffer to bind.</param> - /// <param name="offset">The starting offset in basic machine units into the buffer object buffer. </param> - /// <param name="size">The amount of data in machine units that can be read from the buffer object while used as an indexed target. </param> - public void BindBuffer<T>(Buffer<T> buffer, int offset, int size) - where T : struct - { - if (!Active) return; - GL.BindBufferRange(BindingTarget, Binding, buffer.Handle, (IntPtr)offset, (IntPtr)size); - } - - /// <summary> - /// Unbinds any buffer from this binding point. - /// </summary> - public void Unbind() - { - if (!Active) return; - GL.BindBufferBase(BindingTarget, Binding, 0); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/FragData.cs b/ObjectTK/Shaders/Variables/FragData.cs deleted file mode 100644 index 7ce8484..0000000 --- a/ObjectTK/Shaders/Variables/FragData.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -// FragData.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a fragment shader output.<br/> - /// TODO: implement methods to bind output to a specific attachment - /// see glBindFragDataLocation, glDrawBuffers and http://stackoverflow.com/questions/1733838/fragment-shaders-output-variables - /// </summary> - public sealed class FragData - : ProgramVariable - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(FragData)); - - /// <summary> - /// The location of the output. - /// </summary> - public int Location { get; private set; } - - internal FragData() - { - } - - internal override void OnLink() - { - //TODO: find out what GL.GetFragDataIndex(); does - Location = GL.GetFragDataLocation(ProgramHandle, Name); - if (Location == -1) Logger?.WarnFormat("Output variable not found or not active: {0}", Name); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/ImageUniform.cs b/ObjectTK/Shaders/Variables/ImageUniform.cs deleted file mode 100644 index 907fcbe..0000000 --- a/ObjectTK/Shaders/Variables/ImageUniform.cs +++ /dev/null @@ -1,138 +0,0 @@ -// -// ImageUniform.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Textures; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents an image uniform. - /// </summary> - public sealed class ImageUniform - : Uniform<int> - { - internal ImageUniform() - : base(GL.Uniform1) - { - } - - /// <summary> - /// Binds the given buffer texture to an image unit. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="textureBuffer">The buffer texture to bind.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, TextureBuffer textureBuffer, TextureAccess access) - { - Bind(imageUnit, textureBuffer, 0, false, 0, access); - } - - /// <summary> - /// Binds a single face of the given texture level to an image unit.<br/> - /// Calculates the index of the layer-face as 6 * arrayLayer + face. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="texture">The texture to bind.</param> - /// <param name="level">The mipmap level to bind.</param> - /// <param name="arrayLayer">The layer of the texture to bind.</param> - /// <param name="face">The cube map face to bind.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, TextureCubemapArray texture, int level, int arrayLayer, int face, TextureAccess access) - { - // note: the layer parameter indexes the layer-faces, hence the multiplication of the array-layer by 6 - Bind(imageUnit, texture, level, false, 6 * arrayLayer + face, access); - } - - /// <summary> - /// Binds a single face of the given texture level to an image unit. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="texture">The texture to bind.</param> - /// <param name="level">The mipmap level to bind.</param> - /// <param name="face">The cube map face to bind.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, TextureCubemap texture, int level, int face, TextureAccess access) - { - Bind(imageUnit, texture, level, false, face, access); - } - - /// <summary> - /// Binds a single layer of the given texture level to an image unit.<br/> - /// Note that for cube maps and cube map arrays the <paramref name="layer"/> parameter actually indexes the layer-faces.<br/> - /// Thus for cube maps the layer parameter equals the face to be bound.<br/> - /// For cube map arrays the layer parameter can be calculated as 6 * arrayLayer + face, which is done automatically when using - /// the corresponding overload <see cref="Bind(int,TextureCubemapArray,int,int,int,OpenTK.Graphics.OpenGL.TextureAccess)"/>. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="texture">The texture to bind.</param> - /// <param name="level">The mipmap level to bind.</param> - /// <param name="layer">The layer of the texture to bind.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, LayeredTexture texture, int level, int layer, TextureAccess access) - { - Bind(imageUnit, texture, level, false, layer, access); - } - - /// <summary> - /// Binds an entire level of the given texture to an image unit.<br/> - /// The mipmap level defaults to zero. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="texture">The texture to bind.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, Texture texture, TextureAccess access) - { - Bind(imageUnit, texture, 0, true, 0, access); - } - - /// <summary> - /// Binds an entire level of the given texture to an image unit. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="texture">The texture to bind.</param> - /// <param name="level">The mipmap level to bind.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, Texture texture, int level, TextureAccess access) - { - Bind(imageUnit, texture, level, true, 0, access); - } - - /// <summary> - /// Binds a single level of a texture to an image unit. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="texture">The texture to bind.</param> - /// <param name="level">The mipmap level to bind.</param> - /// <param name="layered">Specifies whether a layered texture binding is to be established.</param> - /// <param name="layer">If <paramref name="layered"/> is false, specifies the layer of the texture to be bound, ignored otherwise.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - public void Bind(int imageUnit, Texture texture, int level, bool layered, int layer, TextureAccess access) - { - texture.AssertLevel(level); - Bind(imageUnit, texture.Handle, level, layered, layer, access, texture.InternalFormat); - } - - /// <summary> - /// Binds a single level of a texture to an image unit. - /// </summary> - /// <param name="imageUnit">The image unit to use.</param> - /// <param name="textureHandle">The handle of the texture.</param> - /// <param name="level">The mipmap level to bind.</param> - /// <param name="layered">Specifies whether a layered texture binding is to be established.</param> - /// <param name="layer">If <paramref name="layered"/> is false, specifies the layer of the texture to be bound, ignored otherwise.</param> - /// <param name="access">Specifies the type of access allowed on the image.</param> - /// <param name="format">Specifies the format that the elements of the texture will be treated as.</param> - public void Bind(int imageUnit, int textureHandle, int level, bool layered, int layer, TextureAccess access, SizedInternalFormat format) - { - Set(imageUnit); - GL.BindImageTexture(imageUnit, textureHandle, level, layered, layer, access, format); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/ProgramVariable.cs b/ObjectTK/Shaders/Variables/ProgramVariable.cs deleted file mode 100644 index 4bba1ed..0000000 --- a/ObjectTK/Shaders/Variables/ProgramVariable.cs +++ /dev/null @@ -1,59 +0,0 @@ -// -// ProgramVariable.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Reflection; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a shader variable identified by its name and the corresponding program handle. - /// </summary> - public abstract class ProgramVariable - { - /// <summary> - /// The handle of the program to which this variable relates. - /// </summary> - protected Program Program { get; private set; } - - /// <summary> - /// The handle of the program to which this variable relates. - /// </summary> - public int ProgramHandle { get { return Program.Handle; } } - - /// <summary> - /// The name of this shader variable. - /// </summary> - public string Name { get; protected set; } - - /// <summary> - /// Specifies whether this variable is active.<br/> - /// Unused variables are generally removed by OpenGL and cause them to be inactive. - /// </summary> - public bool Active { get; protected set; } - - /// <summary> - /// Initializes this instance using the given Program and PropertyInfo. - /// </summary> - internal virtual void Initialize(Program program, PropertyInfo property) - { - Program = program; - Name = property.Name; - } - - /// <summary> - /// When overridden in a derived class, handles initialization which must occur after the program object is linked. - /// </summary> - internal virtual void OnLink() { } - - public override string ToString() - { - return string.Format("{0}.{1}", Program.Name, Name); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/ShaderStorage.cs b/ObjectTK/Shaders/Variables/ShaderStorage.cs deleted file mode 100644 index efc166a..0000000 --- a/ObjectTK/Shaders/Variables/ShaderStorage.cs +++ /dev/null @@ -1,43 +0,0 @@ -// -// ShaderStorage.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a shader storage buffer object (SSBO) binding. - /// </summary> - public sealed class ShaderStorage - : BufferBinding - { - internal ShaderStorage() - : base(BufferRangeTarget.ShaderStorageBuffer, ProgramInterface.ShaderStorageBlock) - { - } - - internal override void OnLink() - { - base.OnLink(); - //TODO: find out if the current binding point can be queried, like it can be for uniform blocks - // set the binding point to the blocks index - if (Active) ChangeBinding(Index); - } - - /// <summary> - /// Assigns a binding point to this shader storage block. - /// </summary> - /// <param name="binding"></param> - public override void ChangeBinding(int binding) - { - base.ChangeBinding(binding); - GL.ShaderStorageBlockBinding(ProgramHandle, Index, binding); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/TextureUniform.cs b/ObjectTK/Shaders/Variables/TextureUniform.cs deleted file mode 100644 index c8b0782..0000000 --- a/ObjectTK/Shaders/Variables/TextureUniform.cs +++ /dev/null @@ -1,54 +0,0 @@ -// -// TextureUniform.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Textures; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a typed texture uniform. Allows only textures of the given type to be bound. - /// </summary> - public class TextureUniform<T> - : Uniform<int> - where T : Texture - { - internal TextureUniform() - : base(GL.Uniform1) - { - } - - /// <summary> - /// Sets this uniform to sample from the given texture unit.<br/> - /// Calls to <see cref="Set(TextureUnit)"/> are equivalent to <see cref="Uniform{T}.Set"/> - /// with the corresponding integer, it just adds readability. - /// </summary> - /// <param name="unit">The texture unit to sample from.</param> - public void Set(TextureUnit unit) - { - Set((int)unit - (int)TextureUnit.Texture0); - } - - /// <summary> - /// Binds a texture to the given texture unit and sets the corresponding uniform to the respective number to access it. - /// </summary> - /// <param name="unit">The texture unit to bind to.</param> - /// <param name="texture">The texture to bind.</param> - public void BindTexture(TextureUnit unit, T texture) - { - Set(unit); - texture.Bind(unit); - } - } - - /// <summary> - /// Represents a texture uniform. Allows any texture type to be bound. - /// </summary> - public sealed class TextureUniform : TextureUniform<Texture> { } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/TransformOut.cs b/ObjectTK/Shaders/Variables/TransformOut.cs deleted file mode 100644 index 0d41be1..0000000 --- a/ObjectTK/Shaders/Variables/TransformOut.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -// TransformOut.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a transform feedback output varying. - /// </summary> - public sealed class TransformOut - : ProgramVariable - { - /// <summary> - /// Specifies the transform feedback buffer binding index of this output. - /// </summary> - public int Index { get; internal set; } - - internal TransformOut() - { - Index = -1; - Active = false; - } - - /// <summary> - /// Initializes a dummy instance of TransformOut used for the keywords introduced with advanced interleaving. - /// </summary> - internal TransformOut(string name) - { - Name = name; - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/Uniform.cs b/ObjectTK/Shaders/Variables/Uniform.cs deleted file mode 100644 index 6723b9b..0000000 --- a/ObjectTK/Shaders/Variables/Uniform.cs +++ /dev/null @@ -1,85 +0,0 @@ -// -// Uniform.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a uniform. - /// </summary> - /// <typeparam name="T">The type of the uniform.</typeparam> - public class Uniform<T> - : ProgramVariable - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(Uniform<T>)); - - /// <summary> - /// The location of the uniform within the shader program. - /// </summary> - public int Location { get; private set; } - - /// <summary> - /// Action used to set the uniform.<br/> - /// Inputs are the uniforms location and the value to set. - /// </summary> - private readonly Action<int, T> _setter; - - /// <summary> - /// The current value of the uniform. - /// </summary> - private T _value; - - /// <summary> - /// Gets or sets the current value of the shader uniform. - /// </summary> - public T Value - { - get - { - return _value; - } - set - { - Set(value); - } - } - - internal Uniform() - : this(UniformSetter.Get<T>()) - { - } - - public Uniform(Action<int, T> setter) - { - if (setter == null) throw new ArgumentNullException("setter"); - _setter = setter; - } - - internal override void OnLink() - { - Location = GL.GetUniformLocation(ProgramHandle, Name); - Active = Location > -1; - if (!Active) Logger?.WarnFormat("Uniform not found or not active: {0}", Name); - } - - /// <summary> - /// Sets the given value to the program uniform.<br/> - /// Must be called on an active program, i.e. after <see cref="Program"/>.<see cref="Program.Use()"/>. - /// </summary> - /// <param name="value">The value to set.</param> - public void Set(T value) - { - Program.AssertActive(); - _value = value; - if (Active) _setter(Location, value); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/UniformBuffer.cs b/ObjectTK/Shaders/Variables/UniformBuffer.cs deleted file mode 100644 index 68acffe..0000000 --- a/ObjectTK/Shaders/Variables/UniformBuffer.cs +++ /dev/null @@ -1,68 +0,0 @@ -// -// UniformBuffer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a uniform buffer object (UBO) binding. - /// </summary> - public sealed class UniformBuffer - : BufferBinding - { - internal UniformBuffer() - : base(BufferRangeTarget.UniformBuffer, ProgramInterface.UniformBlock) - { - } - - internal override void OnLink() - { - base.OnLink(); - // retrieve the default binding point - if (Active) GL.GetActiveUniformBlock(ProgramHandle, Index, ActiveUniformBlockParameter.UniformBlockBinding, out Binding); - } - - /// <summary> - /// Assigns a binding point to this uniform block. - /// </summary> - /// <param name="binding">The binding point to assign.</param> - public override void ChangeBinding(int binding) - { - base.ChangeBinding(binding); - if (!Active) return; - GL.UniformBlockBinding(ProgramHandle, Index, binding); - } - - /// <summary> - /// Retrieves the total size of the uniform block. - /// </summary> - /// <returns>The total size of the uniform block.</returns> - public int GetBlockSize() - { - int size; - GL.GetActiveUniformBlock(ProgramHandle, Index, ActiveUniformBlockParameter.UniformBlockDataSize, out size); - return size; - } - - /// <summary> - /// Retrieves the offsets of the uniforms within the block to the start of the block. - /// </summary> - /// <param name="offsets">The offsets of the uniforms within the block.</param> - public void GetBlockOffsets(out int[] offsets) - { - int uniforms; - GL.GetActiveUniformBlock(ProgramHandle, Index, ActiveUniformBlockParameter.UniformBlockActiveUniforms, out uniforms); - var indices = new int[uniforms]; - GL.GetActiveUniformBlock(ProgramHandle, Index, ActiveUniformBlockParameter.UniformBlockActiveUniformIndices, indices); - offsets = new int[uniforms]; - GL.GetActiveUniforms(ProgramHandle, uniforms, indices, ActiveUniformParameter.UniformOffset, offsets); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/UniformSetter.cs b/ObjectTK/Shaders/Variables/UniformSetter.cs deleted file mode 100644 index 52661cf..0000000 --- a/ObjectTK/Shaders/Variables/UniformSetter.cs +++ /dev/null @@ -1,80 +0,0 @@ -// -// UniformSetter.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using ObjectTK.Exceptions; -using OpenTK; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - internal abstract class UniformSetter - { - protected abstract Type MappedType { get; } - - private class Map<T> - : UniformSetter - { - protected override Type MappedType { get { return typeof(T); } } - - public readonly Action<int, T> Setter; - - public Map(Action<int, T> setter) - { - Setter = setter; - } - } - - private UniformSetter() { } - - private static readonly List<UniformSetter> Setters = new List<UniformSetter>(); - - static UniformSetter() - { - Setters = new List<UniformSetter> - { - new Map<bool>((_,value) => GL.Uniform1(_, value ? 1 : 0)), - new Map<int>(GL.Uniform1), - new Map<uint>(GL.Uniform1), - new Map<float>(GL.Uniform1), - new Map<double>(GL.Uniform1), - new Map<Half>((_, half) => GL.Uniform1(_, half)), - new Map<Color>((_, color) => GL.Uniform4(_, color)), - new Map<Vector2>(GL.Uniform2), - new Map<Vector3>(GL.Uniform3), - new Map<Vector4>(GL.Uniform4), - new Map<Vector2d>((_, vector) => GL.Uniform2(_, vector.X, vector.Y)), - new Map<Vector2h>((_, vector) => GL.Uniform2(_, vector.X, vector.Y)), - new Map<Vector3d>((_, vector) => GL.Uniform3(_, vector.X, vector.Y, vector.Z)), - new Map<Vector3h>((_, vector) => GL.Uniform3(_, vector.X, vector.Y, vector.Z)), - new Map<Vector4d>((_, vector) => GL.Uniform4(_, vector.X, vector.Y, vector.Z, vector.W)), - new Map<Vector4h>((_, vector) => GL.Uniform4(_, vector.X, vector.Y, vector.Z, vector.W)), - new Map<Matrix2>((_, matrix) => GL.UniformMatrix2(_, false, ref matrix)), - new Map<Matrix3>((_, matrix) => GL.UniformMatrix3(_, false, ref matrix)), - new Map<Matrix4>((_, matrix) => GL.UniformMatrix4(_, false, ref matrix)), - new Map<Matrix2x3>((_, matrix) => GL.UniformMatrix2x3(_, false, ref matrix)), - new Map<Matrix2x4>((_, matrix) => GL.UniformMatrix2x4(_, false, ref matrix)), - new Map<Matrix3x2>((_, matrix) => GL.UniformMatrix3x2(_, false, ref matrix)), - new Map<Matrix3x4>((_, matrix) => GL.UniformMatrix3x4(_, false, ref matrix)), - new Map<Matrix4x2>((_, matrix) => GL.UniformMatrix4x2(_, false, ref matrix)), - new Map<Matrix4x3>((_, matrix) => GL.UniformMatrix4x3(_, false, ref matrix)) - }; - } - - public static Action<int, T> Get<T>() - { - var setter = Setters.FirstOrDefault(_ => _.MappedType == typeof(T)); - if (setter == null) throw new UniformTypeNotSupportedException(typeof(T)); - return ((Map<T>)setter).Setter; - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/VertexAttrib.cs b/ObjectTK/Shaders/Variables/VertexAttrib.cs deleted file mode 100644 index e40ed5c..0000000 --- a/ObjectTK/Shaders/Variables/VertexAttrib.cs +++ /dev/null @@ -1,71 +0,0 @@ -// -// VertexAttrib.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System.Linq; -using System.Reflection; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Represents a vertex attribute. - /// </summary> - public sealed class VertexAttrib - : ProgramVariable - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(VertexAttrib)); - - /// <summary> - /// The vertex attributes location within the shader. - /// </summary> - public int Index { get; private set; } - - /// <summary> - /// The number components to read. - /// </summary> - public int Components { get; private set; } - - /// <summary> - /// The type of each component. - /// </summary> - public VertexAttribPointerType Type { get; private set; } - - /// <summary> - /// Specifies whether the components should be normalized. - /// </summary> - public bool Normalized { get; private set; } - - internal VertexAttrib() - { - } - - internal override void Initialize(Program program, PropertyInfo property) - { - base.Initialize(program, property); - var attribute = property.GetCustomAttributes<VertexAttribAttribute>(false).FirstOrDefault() ?? new VertexAttribAttribute(); - Components = attribute.Components; - Type = attribute.Type; - Normalized = attribute.Normalized; - if (attribute.Index > 0) BindAttribLocation(attribute.Index); - } - - public void BindAttribLocation(int index) - { - Index = index; - GL.BindAttribLocation(ProgramHandle, index, Name); - } - - internal override void OnLink() - { - Index = GL.GetAttribLocation(ProgramHandle, Name); - Active = Index > -1; - if (!Active) Logger?.WarnFormat("Vertex attribute not found or not active: {0}", Name); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Shaders/Variables/VertexAttribAttribute.cs b/ObjectTK/Shaders/Variables/VertexAttribAttribute.cs deleted file mode 100644 index bd891f8..0000000 --- a/ObjectTK/Shaders/Variables/VertexAttribAttribute.cs +++ /dev/null @@ -1,93 +0,0 @@ -// -// VertexAttribAttribute.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Shaders.Variables -{ - /// <summary> - /// Defines default values when binding buffers to the attributed <see cref="VertexAttrib"/>. - /// </summary> - [AttributeUsage(AttributeTargets.Property)] - public class VertexAttribAttribute - : Attribute - { - /// <summary> - /// The number components to read.<br/> - /// Defaults to 4. - /// </summary> - public int Components { get; protected set; } - - /// <summary> - /// The type of each component.<br/> - /// Defaults to Float. - /// </summary> - public VertexAttribPointerType Type { get; protected set; } - - /// <summary> - /// Specifies whether the components should be normalized.<br/> - /// Defaults to false. - /// </summary> - public bool Normalized { get; protected set; } - - /// <summary> - /// Specifies the generic vertex attribute index this named attribute variable binds to.<br/> - /// If set explicitly this named attribute variable is bound to that generic vertex attribute index before the program is linked.<br/> - /// Defaults to -1, which causes the index to be retrieved after the program is linked. - /// </summary> - public int Index { get; protected set; } - - /// <summary> - /// Initializes a new instance of the VertexAttribAttribute with default values.<br/> - /// The default is 4 components of type float without normalization. - /// </summary> - public VertexAttribAttribute() - : this(4, VertexAttribPointerType.Float, false, -1) - { - } - - /// <summary> - /// Initializes a new instance of the VertexAttribAttribute.<br/> - /// Normalization defaults to false. - /// </summary> - /// <param name="components">The number of components to read.</param> - /// <param name="type">The type of each component.</param> - public VertexAttribAttribute(int components, VertexAttribPointerType type) - : this(components, type, false, -1) - { - } - - /// <summary> - /// Initializes a new instance of the VertexAttribAttribute. - /// </summary> - /// <param name="components">The number of components to read.</param> - /// <param name="type">The type of each component.</param> - /// <param name="normalized">Specifies whether each component should be normalized.</param> - public VertexAttribAttribute(int components, VertexAttribPointerType type, bool normalized) - : this(components, type, normalized, -1) - { - } - - /// <summary> - /// Initializes a new instance of the VertexAttribAttribute. - /// </summary> - /// <param name="components">The number of components to read.</param> - /// <param name="type">The type of each component.</param> - /// <param name="normalized">Specifies whether each component should be normalized.</param> - /// <param name="index"></param> - public VertexAttribAttribute(int components, VertexAttribPointerType type, bool normalized, int index) - { - Components = components; - Type = type; - Normalized = normalized; - Index = index; - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/BitmapFormat.cs b/ObjectTK/Textures/BitmapFormat.cs deleted file mode 100644 index 5a17214..0000000 --- a/ObjectTK/Textures/BitmapFormat.cs +++ /dev/null @@ -1,64 +0,0 @@ -// -// BitmapFormat.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Collections.Generic; -using System.Drawing; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - internal class BitmapFormat - { - public SizedInternalFormat InternalFormat; - public PixelFormat PixelFormat; - public PixelType PixelType; - - private static readonly Dictionary<System.Drawing.Imaging.PixelFormat, BitmapFormat> FormatMap = new Dictionary - <System.Drawing.Imaging.PixelFormat, BitmapFormat> - { - { - System.Drawing.Imaging.PixelFormat.Format24bppRgb, new BitmapFormat - { - InternalFormat = SizedInternalFormat.Rgba8, - PixelFormat = PixelFormat.Bgr, - PixelType = PixelType.UnsignedByte - } - }, - { - System.Drawing.Imaging.PixelFormat.Format32bppArgb, new BitmapFormat - { - InternalFormat = SizedInternalFormat.Rgba8, - PixelFormat = PixelFormat.Bgra, - PixelType = PixelType.UnsignedByte - } - } - }; - - // prevent instantiation - protected BitmapFormat() { } - - static BitmapFormat() - { - // does not work - //_formatMap.Add(System.Drawing.Imaging.PixelFormat.Format16bppRgb555, _formatMap[System.Drawing.Imaging.PixelFormat.Format16bppArgb1555]); - // has alpha too? wtf? - FormatMap.Add(System.Drawing.Imaging.PixelFormat.Format32bppRgb, - FormatMap[System.Drawing.Imaging.PixelFormat.Format32bppArgb]); - FormatMap.Add(System.Drawing.Imaging.PixelFormat.Canonical, - FormatMap[System.Drawing.Imaging.PixelFormat.Format32bppArgb]); - } - - public static BitmapFormat Get(Bitmap bitmap) - { - if (FormatMap.ContainsKey(bitmap.PixelFormat)) return FormatMap[bitmap.PixelFormat]; - throw new ArgumentException("Error: Unsupported Pixel Format " + bitmap.PixelFormat); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/BitmapTexture.cs b/ObjectTK/Textures/BitmapTexture.cs deleted file mode 100644 index 1530b06..0000000 --- a/ObjectTK/Textures/BitmapTexture.cs +++ /dev/null @@ -1,179 +0,0 @@ -// -// BitmapTexture.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Drawing; -using System.Drawing.Imaging; -using OpenTK.Graphics.OpenGL; -using PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Contains extension methods for texture types. - /// </summary> - public static class BitmapTexture - { - private static BitmapData LockBits(Bitmap bitmap) - { - return bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); - } - - private static void CheckError() - { - GL.Finish(); - Utility.Assert("Error while uploading data to texture."); - } - - /// <summary> - /// Creates a new Texture2D instance compatible to the given bitmap. - /// </summary> - /// <param name="bitmap">Specifies the bitmap to which the new texture will be compatible.</param> - /// <param name="texture">Outputs the newly created texture.</param> - /// <param name="levels">Specifies the number of mipmap levels.</param> - public static void CreateCompatible(Bitmap bitmap, out Texture2D texture, int levels = 0) - { - texture = new Texture2D(BitmapFormat.Get(bitmap).InternalFormat, bitmap.Width, bitmap.Height, levels); - } - - /// <summary> - /// Creates a new Texture2DArray instance compatible to the given bitmap. - /// </summary> - /// <param name="bitmap">Specifies the bitmap to which the new texture will be compatible.</param> - /// <param name="texture">Outputs the newly created texture.</param> - /// <param name="layers">Specifies the number of array layers the texture will contain.</param> - /// <param name="levels">Specifies the number of mipmap levels.</param> - public static void CreateCompatible(Bitmap bitmap, out Texture2DArray texture, int layers, int levels = 0) - { - texture = new Texture2DArray(BitmapFormat.Get(bitmap).InternalFormat, bitmap.Width, bitmap.Height, layers, levels); - } - - /// <summary> - /// Creates a new TextureCubemap instance with faces compatible to the given bitmap. - /// </summary> - /// <param name="bitmap">Specifies the bitmap to which the new texture will be compatible.</param> - /// <param name="texture">Outputs the newly created texture.</param> - /// <param name="levels">Specifies the number of mipmap levels.</param> - public static void CreateCompatible(Bitmap bitmap, out TextureCubemap texture, int levels = 0) - { - if (bitmap.Width != bitmap.Height) throw new ArgumentException("The faces of cube map textures must be square."); - texture = new TextureCubemap(BitmapFormat.Get(bitmap).InternalFormat, bitmap.Width, levels); - } - - /// <summary> - /// Creates a new TextureCubemapArray instance with faces compatible to the given bitmap. - /// </summary> - /// <param name="bitmap">Specifies the bitmap to which the new texture will be compatible.</param> - /// <param name="layers">Specifies the number of array layers the texture will contain.</param> - /// <param name="texture">Outputs the newly created texture.</param> - /// <param name="levels">Specifies the number of mipmap levels.</param> - public static void CreateCompatible(Bitmap bitmap, out TextureCubemapArray texture, int layers, int levels = 0) - { - if (bitmap.Width != bitmap.Height) throw new ArgumentException("The faces of cube map textures must be square."); - texture = new TextureCubemapArray(BitmapFormat.Get(bitmap).InternalFormat, bitmap.Width, layers, levels); - } - - /// <summary> - /// Creates a new TextureRectangle instance compatible to the given bitmap. - /// </summary> - /// <param name="bitmap">Specifies the bitmap to which the new texture will be compatible.</param> - /// <param name="texture">Outputs the newly created texture.</param> - public static void CreateCompatible(Bitmap bitmap, out TextureRectangle texture) - { - texture = new TextureRectangle(BitmapFormat.Get(bitmap).InternalFormat, bitmap.Width, bitmap.Height); - } - - /// <summary> - /// Uploads the contents of a bitmap to the given texture level.<br/> - /// Will result in an OpenGL error if the given bitmap is incompatible with the textures storage. - /// </summary> - public static void LoadBitmap(this Texture2D texture, Bitmap bitmap, int level = 0) - { - texture.Bind(); - var data = LockBits(bitmap); - try - { - var map = BitmapFormat.Get(bitmap); - GL.TexSubImage2D(texture.TextureTarget, level, 0, 0, data.Width, data.Height, - map.PixelFormat, map.PixelType, data.Scan0); - } - finally - { - bitmap.UnlockBits(data); - } - CheckError(); - } - - /// <summary> - /// Uploads the contents of a bitmap to the given texture layer and level.<br/> - /// Will result in an OpenGL error if the given bitmap is incompatible with the textures storage. - /// </summary> - public static void LoadBitmap(this LayeredTexture texture, Bitmap bitmap, int layer, int level = 0) - { - texture.Bind(); - var data = LockBits(bitmap); - try - { - var map = BitmapFormat.Get(bitmap); - GL.TexSubImage3D(texture.TextureTarget, level, 0, 0, layer, data.Width, data.Height, 1, - map.PixelFormat, map.PixelType, data.Scan0); - } - finally - { - bitmap.UnlockBits(data); - } - CheckError(); - } - - /// <summary> - /// Uploads the contents of the bitmaps to all faces of the given cube map level.<br/> - /// Will result in an OpenGL error if any of the given bitmaps is incompatible with the textures storage. - /// </summary> - public static void LoadBitmap(this TextureCubemap texture, Bitmap[] bitmaps, int level = 0) - { - if (bitmaps.Length != 6) throw new ArgumentException("Expected exactly 6 bitmaps for a cube map."); - // load all six faces - for (var face = 0; face < 6; face++) texture.LoadBitmap(bitmaps[face], face, level); - } - - /// <summary> - /// Uploads the contents of a bitmap to a single face of the given cube map level.<br/> - /// Will result in an OpenGL error if the given bitmap is incompatible with the textures storage. - /// </summary> - public static void LoadBitmap(this TextureCubemap texture, Bitmap bitmap, int face, int level = 0) - { - const TextureTarget firstFace = TextureTarget.TextureCubeMapPositiveX; - texture.Bind(); - var data = LockBits(bitmap); - try - { - var map = BitmapFormat.Get(bitmap); - GL.TexSubImage2D(firstFace + face, level, 0, 0, data.Width, data.Height, - map.PixelFormat, map.PixelType, data.Scan0); - } - finally - { - bitmap.UnlockBits(data); - } - CheckError(); - } - - /// <summary> - /// Retrieves the texture data. - /// </summary> - public static T[,] GetContent<T>(this Texture2D texture, PixelFormat pixelFormat, PixelType pixelType, int level = 0) - where T : struct - { - var data = new T[texture.Width, texture.Height]; - texture.Bind(); - GL.GetTexImage(texture.TextureTarget, level, pixelFormat, pixelType, data); - return data; - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/LayeredTexture.cs b/ObjectTK/Textures/LayeredTexture.cs deleted file mode 100644 index b26bbcd..0000000 --- a/ObjectTK/Textures/LayeredTexture.cs +++ /dev/null @@ -1,28 +0,0 @@ -// -// LayeredTexture.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a layered texture.<br/> - /// Layered textures are all array, cube map and 3D textures. - /// </summary> - public abstract class LayeredTexture - : Texture - { - public override bool SupportsLayers { get { return true; } } - - internal LayeredTexture(SizedInternalFormat internalFormat, int levels) - : base(internalFormat, levels) - { - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Sampler.cs b/ObjectTK/Textures/Sampler.cs deleted file mode 100644 index 1d38438..0000000 --- a/ObjectTK/Textures/Sampler.cs +++ /dev/null @@ -1,74 +0,0 @@ -// -// Sampler.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a sampler object. - /// </summary> - public sealed class Sampler - : GLObject - { - /// <summary> - /// Initializes a new sampler object. - /// </summary> - public Sampler() - : base(GL.GenSampler()) - { - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteSampler(Handle); - } - - /// <summary> - /// Binds the sampler to the given texture unit. - /// </summary> - /// <param name="textureUnit">The texture unit to bind to.</param> - public void Bind(TextureUnit textureUnit) - { - Bind((int)textureUnit - (int)TextureUnit.Texture0); - } - - /// <summary> - /// Binds the sampler to the given texture unit. - /// </summary> - /// <param name="unit">The texture unit to bind to.</param> - public void Bind(int unit) - { - GL.BindSampler(unit, Handle); - } - - /// <summary> - /// Sets the given wrap mode on all dimensions R, S and T. - /// </summary> - /// <param name="wrapMode">The wrap mode to apply.</param> - public void SetWrapMode(TextureWrapMode wrapMode) - { - var mode = (int) wrapMode; - SetParameter(SamplerParameterName.TextureWrapR, mode); - SetParameter(SamplerParameterName.TextureWrapS, mode); - SetParameter(SamplerParameterName.TextureWrapT, mode); - } - - /// <summary> - /// Sets sampler parameters. - /// </summary> - /// <param name="parameterName">The parameter name to set.</param> - /// <param name="value">The value to set.</param> - public void SetParameter(SamplerParameterName parameterName, int value) - { - GL.SamplerParameter(Handle, parameterName, value); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture.cs b/ObjectTK/Textures/Texture.cs deleted file mode 100644 index f26229b..0000000 --- a/ObjectTK/Textures/Texture.cs +++ /dev/null @@ -1,218 +0,0 @@ -// -// Texture.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Linq; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a texture object. - /// </summary> - /// <remarks> - /// <code> - /// Type Supports: Mipmaps Layered - /// ------------------------------------------- - /// Texture1D yes - /// Texture2D yes - /// Texture3D yes yes - /// Texture1DArray yes yes - /// Texture2DArray yes yes - /// TextureCubemap yes yes - /// TextureCubemapArray yes yes - /// Texture2DMultisample - /// Texture2DMultisampleArray yes - /// TextureRectangle - /// TextureBuffer - /// </code> - /// </remarks> - public abstract class Texture - : GLObject - { - /// <summary> - /// Specifies the texture target. - /// </summary> - public abstract TextureTarget TextureTarget { get; } - - /// <summary> - /// Specifies whether this texture supports multiple layers.<br/> - /// True for all texture types derived from LayeredTexture, that is all array, cube map and 3D textures. - /// </summary> - public virtual bool SupportsLayers { get { return false; } } - - /// <summary> - /// Specifies whether this texture supports mipmap levels.<br/> - /// False for buffer, rectangle and multisample textures, otherwise true. - /// </summary> - public virtual bool SupportsMipmaps { get { return true; } } - - /// <summary> - /// The number of mipmap levels. - /// </summary> - public int Levels { get; private set; } - - /// <summary> - /// The internal format of the texture. - /// </summary> - public SizedInternalFormat InternalFormat { get; private set; } - - /// <summary> - /// Initializes a new texture object. Creates a new texture handle. - /// </summary> - /// <param name="internalFormat">The internal format of the texture.</param> - /// <param name="levels">The number of mipmap levels.</param> - internal Texture(SizedInternalFormat internalFormat, int levels) - : this(GL.GenTexture(), internalFormat, levels) - { - } - - /// <summary> - /// Initializes a new texture object. Uses the texture handle given.<br/> - /// Internal constructor used by <see cref="TextureFactory"/> to wrap a texture instance around an already existing texture. - /// </summary> - /// <param name="textureHandle">The texture handle.</param> - /// <param name="internalFormat">The internal format of the texture.</param> - /// <param name="levels">The number of mipmap levels.</param> - internal Texture(int textureHandle, SizedInternalFormat internalFormat, int levels) - : base(textureHandle) - { - InternalFormat = internalFormat; - Levels = levels; - } - - protected override void Dispose(bool manual) - { - if (!manual) return; - GL.DeleteTexture(Handle); - } - - /// <summary> - /// Binds the texture to the current texture unit at its default texture target. - /// </summary> - public void Bind() - { - GL.BindTexture(TextureTarget, Handle); - } - - /// <summary> - /// Binds the texture to the given texture unit at its default texture target. - /// </summary> - /// <param name="unit">The texture unit to bind to.</param> - public void Bind(TextureUnit unit) - { - GL.ActiveTexture(unit); - Bind(); - } - - /// <summary> - /// Calculates the maximum number of mipmap levels allowed for the given size in each dimension.<br/> - /// If <paramref name="levels"/> is greater than zero and less or equal to the calculated maximum it is returned without change.<br/> - /// If <paramref name="levels"/> is zero the calculated maximum is returned instead. - /// </summary> - /// <remarks> - /// At the maximum mipmap level the image would consist of exactly one texel, i.e. 1x1 in 2D or 1x1x1 in 3D. - /// </remarks> - /// <param name="levels">Specifies the number of desired mipmap levels.</param> - /// <param name="dimensions">Specifies the size of the textures base image in each dimension.</param> - /// <returns>A valid number of mipmap levels.</returns> - protected static int GetLevels(int levels, params int[] dimensions) - { - var maxLevels = TextureFactory.CalculateMaxMipmapLevels(dimensions); - if (levels > maxLevels || levels < 0) throw new ArgumentOutOfRangeException("levels", levels, - string.Format("The valid range of mipmapping levels for a maximum texture dimension of {0} is [0,{1}]", dimensions.Max(), maxLevels)); - return levels == 0 ? maxLevels : levels; - } - - /// <summary> - /// Automatically generates all mipmaps. - /// </summary> - public void GenerateMipMaps() - { - if (!SupportsMipmaps) throw new InvalidOperationException("Texture does not support mipmaps."); - Bind(); - GL.GenerateMipmap((GenerateMipmapTarget)TextureTarget); - Utility.Assert("Could not generate mipmaps."); - } - - /// <summary> - /// Sets texture parameters. - /// </summary> - /// <param name="parameterName"></param> - /// <param name="value"></param> - public void SetParameter(TextureParameterName parameterName, int value) - { - GL.TexParameter(TextureTarget, parameterName, value); - } - - /// <summary> - /// Sets the given wrap mode on all dimensions R, S and T. - /// </summary> - /// <param name="wrapMode">The wrap mode to apply.</param> - public void SetWrapMode(TextureWrapMode wrapMode) - { - var mode = (int)wrapMode; - SetParameter(TextureParameterName.TextureWrapR, mode); - SetParameter(TextureParameterName.TextureWrapS, mode); - SetParameter(TextureParameterName.TextureWrapT, mode); - } - - /// <summary> - /// Sets the given texture minification and magnification filters. - /// </summary> - /// <param name="minFilter"></param> - /// <param name="magFilter"></param> - public void SetFilter(TextureMinFilter minFilter, TextureMagFilter magFilter) - { - SetParameter(TextureParameterName.TextureMinFilter, (int)minFilter); - SetParameter(TextureParameterName.TextureMagFilter, (int)magFilter); - } - - /// <summary> - /// Sets default texture parameters to ensure texture completeness.<br/> - /// Enables mipmapping if the texture supports it, otherwise filtering is set to linear interpolation. - /// </summary> - public virtual void SetDefaultTexParameters() - { - SetParameter(TextureParameterName.TextureMinFilter, (int)(Levels > 1 ? TextureMinFilter.NearestMipmapLinear : TextureMinFilter.Linear)); - SetParameter(TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - Utility.Assert("Could not set tex parameters."); - } - - /// <summary> - /// Checks if the given mipmap level is supported by this texture.<br/> - /// A supported level is either zero for all textures which do not support mipmapping, - /// or smaller than the number of existing levels. - /// </summary> - /// <param name="level">The mipmap level of the texture.</param> - /// <returns>True if the level is supported, otherwise false.</returns> - public bool SupportsLevel(int level) - { - return (SupportsMipmaps || level == 0) && (level < Levels || !SupportsMipmaps); - } - - /// <summary> - /// Throws an exception if the given mipmap level is not supported by this texture.<br/> - /// The mipmap level must be zero for all texture types which do not support mipmaps. - /// </summary> - /// <param name="level">Specifies a mipmap level of the texture.</param> - internal void AssertLevel(int level) - { - if (!SupportsLevel(level)) throw new ArgumentException(string.Format("Texture does not contain the mipmap level {0} or does not support mipmapping at all.", level)); - } - - /// <summary> - /// Calls GL.<see cref="GL.GetError()"/> to check if there are any errors. - /// </summary> - protected static void CheckError() - { - Utility.Assert("Texture error"); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture1D.cs b/ObjectTK/Textures/Texture1D.cs deleted file mode 100644 index 6d9ed89..0000000 --- a/ObjectTK/Textures/Texture1D.cs +++ /dev/null @@ -1,43 +0,0 @@ -// -// Texture1D.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 1D texture.<br/> - /// Images in this texture all are 1-dimensional. They have width, but no height or depth. - /// </summary> - public sealed class Texture1D - : Texture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture1D; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="levels">The number of mipmap levels.</param> - public Texture1D(SizedInternalFormat internalFormat, int width, int levels = 0) - : base(internalFormat, GetLevels(levels, width)) - { - Width = width; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage1D((TextureTarget1d)TextureTarget, Levels, InternalFormat, Width); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture1DArray.cs b/ObjectTK/Textures/Texture1DArray.cs deleted file mode 100644 index 3ac1bf6..0000000 --- a/ObjectTK/Textures/Texture1DArray.cs +++ /dev/null @@ -1,54 +0,0 @@ -// -// Texture1DArray.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 1D texture array.<br/> - /// Images in this texture all are 1-dimensional. However, it contains multiple sets of 1-dimensional images, - /// all within one texture. The array length is part of the texture's size. - /// </summary> - public sealed class Texture1DArray - : LayeredTexture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture1DArray; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The number of layers.<br/> - /// note: OpenGL seems to call the second coordinate on a 1D texture array the "height", - /// which would make the whole thing almost exactly equal to a 2D texture with the exception that - /// a 1D texture array can be bound to a framebuffer via glFramebufferTextureLayer(). - /// </summary> - public int Layers { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="layers">The number of layers to allocate.</param> - /// <param name="levels">The number of mipmap levels.</param> - public Texture1DArray(SizedInternalFormat internalFormat, int width, int layers, int levels = 0) - : base(internalFormat, GetLevels(levels, width)) - { - Width = width; - Layers = layers; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage2D((TextureTarget2d)TextureTarget, Levels, InternalFormat, Width, Layers); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture2D.cs b/ObjectTK/Textures/Texture2D.cs deleted file mode 100644 index 27d0886..0000000 --- a/ObjectTK/Textures/Texture2D.cs +++ /dev/null @@ -1,61 +0,0 @@ -// -// Texture2D.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 2D texture.<br/> - /// Images in this texture all are 2-dimensional. They have width and height, but no depth. - /// </summary> - public sealed class Texture2D - : Texture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture2D; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The height of the texture. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters.<br/> - /// A value of zero for the number of mipmap levels will default to the maximum number of levels possible for the given bitmaps width and height. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="height">The height of the texture.</param> - /// <param name="levels">The number of mipmap levels.</param> - public Texture2D(SizedInternalFormat internalFormat, int width, int height, int levels = 0) - : base(internalFormat, GetLevels(levels, width, height)) - { - Width = width; - Height = height; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage2D((TextureTarget2d)TextureTarget, Levels, InternalFormat, Width, Height); - CheckError(); - } - - /// <summary> - /// Internal constructor used by <see cref="TextureFactory"/> to wrap a Texture2D instance around an already existing texture. - /// </summary> - internal Texture2D(int textureHandle, SizedInternalFormat internalFormat, int width, int height, int levels) - : base(textureHandle, internalFormat, levels) - { - Width = width; - Height = height; - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture2DArray.cs b/ObjectTK/Textures/Texture2DArray.cs deleted file mode 100644 index e645915..0000000 --- a/ObjectTK/Textures/Texture2DArray.cs +++ /dev/null @@ -1,59 +0,0 @@ -// -// Texture2DArray.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 2D texture array.<br/> - /// Images in this texture all are 2-dimensional. However, it contains multiple sets of 2-dimensional images, - /// all within one texture. The array length is part of the texture's size. - /// </summary> - public sealed class Texture2DArray - : LayeredTexture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture2DArray; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The height of the texture. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// The number of layers. - /// </summary> - public int Layers { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters.<br/> - /// A value of zero for the number of mipmap levels will default to the maximum number of levels possible for the given bitmaps width and height. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="height">The height of the texture.</param> - /// <param name="layers">The number of layers to allocate.</param> - /// <param name="levels">The number of mipmap levels.</param> - public Texture2DArray(SizedInternalFormat internalFormat, int width, int height, int layers, int levels = 0) - : base(internalFormat, GetLevels(levels, width, height)) - { - Width = width; - Height = height; - Layers = layers; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage3D((TextureTarget3d)TextureTarget, Levels, InternalFormat, Width, Height, Layers); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture2DMultisample.cs b/ObjectTK/Textures/Texture2DMultisample.cs deleted file mode 100644 index b4c3796..0000000 --- a/ObjectTK/Textures/Texture2DMultisample.cs +++ /dev/null @@ -1,65 +0,0 @@ -// -// Texture2DMultisample.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 2D multisample texture.<br/> - /// The image in this texture (only one image. No mipmapping) is 2-dimensional. - /// Each pixel in this image contains multiple samples instead of just one value. - /// </summary> - public sealed class Texture2DMultisample - : Texture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture2DMultisample; } } - public override bool SupportsMipmaps { get { return false; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The height of the texture. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// The number of samples per texel. - /// </summary> - public int Samples { get; private set; } - - /// <summary> - /// Specifies whether the texels will use identical sample locations. - /// </summary> - public bool FixedSampleLocations { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="height">The height of the texture.</param> - /// <param name="samples">The number of samples per texel.</param> - /// <param name="fixedSampleLocations">Specifies whether the texels will use identical sample locations.</param> - public Texture2DMultisample(SizedInternalFormat internalFormat, int width, int height, int samples, bool fixedSampleLocations) - : base(internalFormat, 1) - { - Width = width; - Height = height; - Samples = samples; - FixedSampleLocations = fixedSampleLocations; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage2DMultisample((TextureTargetMultisample2d)TextureTarget, Samples, InternalFormat, Width, Height, FixedSampleLocations); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture2DMultisampleArray.cs b/ObjectTK/Textures/Texture2DMultisampleArray.cs deleted file mode 100644 index 767ace5..0000000 --- a/ObjectTK/Textures/Texture2DMultisampleArray.cs +++ /dev/null @@ -1,71 +0,0 @@ -// -// Texture2DMultisampleArray.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 2D multisample array texture.<br/> - /// Combines 2D array and 2D multisample types. No mipmapping. - /// </summary> - public sealed class Texture2DMultisampleArray - : LayeredTexture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture2DMultisampleArray; } } - public override bool SupportsMipmaps { get { return false; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The height of the texture. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// The number of layers. - /// </summary> - public int Layers { get; private set; } - - /// <summary> - /// The number of samples per texel. - /// </summary> - public int Samples { get; private set; } - - /// <summary> - /// Specifies whether the texels will use identical sample locations. - /// </summary> - public bool FixedSampleLocations { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="height">The height of the texture.</param> - /// <param name="layers">The number of layers to allocate.</param> - /// <param name="samples">The number of samples per texel.</param> - /// <param name="fixedSampleLocations">Specifies whether the texels will use identical sample locations.</param> - public Texture2DMultisampleArray(SizedInternalFormat internalFormat, int width, int height, int layers, int samples, bool fixedSampleLocations) - : base(internalFormat, 1) - { - Width = width; - Height = height; - Layers = layers; - Samples = samples; - FixedSampleLocations = fixedSampleLocations; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage3DMultisample((TextureTargetMultisample3d)TextureTarget, Samples, InternalFormat, Width, Height, Layers, FixedSampleLocations); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/Texture3D.cs b/ObjectTK/Textures/Texture3D.cs deleted file mode 100644 index 4d70ef7..0000000 --- a/ObjectTK/Textures/Texture3D.cs +++ /dev/null @@ -1,57 +0,0 @@ -// -// Texture3D.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a 3D texture.<br/> - /// Images in this texture all are 3-dimensional. They have width, height, and depth. - /// </summary> - public sealed class Texture3D - : LayeredTexture - { - public override TextureTarget TextureTarget { get { return TextureTarget.Texture3D; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The height of the texture. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// The depth of the texture. - /// </summary> - public int Depth { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="height">The height of the texture.</param> - /// <param name="depth">The depth of the texture.</param> - /// <param name="levels">The number of mipmap levels.</param> - public Texture3D(SizedInternalFormat internalFormat, int width, int height, int depth, int levels = 0) - : base(internalFormat, GetLevels(levels, width, height, depth)) - { - Width = width; - Height = height; - Depth = depth; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage3D((TextureTarget3d)TextureTarget, Levels, InternalFormat, Width, Height, Depth); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/TextureBuffer.cs b/ObjectTK/Textures/TextureBuffer.cs deleted file mode 100644 index 491979e..0000000 --- a/ObjectTK/Textures/TextureBuffer.cs +++ /dev/null @@ -1,61 +0,0 @@ -// -// TextureBuffer.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using ObjectTK.Buffers; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a buffer texture.<br/> - /// The image in this texture (only one image. No mipmapping) is 1-dimensional. - /// The storage for this data comes from a Buffer Object. - /// </summary> - public sealed class TextureBuffer - : Texture - { - public override TextureTarget TextureTarget { get { return TextureTarget.TextureBuffer; } } - public override bool SupportsMipmaps { get { return false; } } - - /// <summary> - /// Creates a buffer texture and uses the given internal format to access a bound buffer, if not specified otherwise. - /// </summary> - /// <param name="internalFormat"></param> - public TextureBuffer(SizedInternalFormat internalFormat) - : base(internalFormat, 1) - { - } - - /// <summary> - /// Binds the given buffer to this texture.<br/> - /// Applies the internal format specified in the constructor. - /// </summary> - /// <param name="buffer">The buffer to bind.</param> - public void BindBufferToTexture<T>(Buffer<T> buffer) - where T : struct - { - BindBufferToTexture(buffer, InternalFormat); - } - - /// <summary> - /// Binds the given buffer to this texture using the given internal format. - /// </summary> - /// <param name="buffer">The buffer to bind.</param> - /// <param name="internalFormat">The internal format used when accessing the buffer.</param> - /// <typeparam name="T">The type of elements in the buffer object.</typeparam> - public void BindBufferToTexture<T>(Buffer<T> buffer, SizedInternalFormat internalFormat) - where T : struct - { - if (!buffer.Initialized) throw new ArgumentException("Can not bind uninitialized buffer to buffer texture.", "buffer"); - GL.BindTexture(TextureTarget.TextureBuffer, Handle); - GL.TexBuffer(TextureBufferTarget.TextureBuffer, internalFormat, buffer.Handle); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/TextureCubemap.cs b/ObjectTK/Textures/TextureCubemap.cs deleted file mode 100644 index afa5b86..0000000 --- a/ObjectTK/Textures/TextureCubemap.cs +++ /dev/null @@ -1,44 +0,0 @@ -// -// TextureCubemap.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a cubemap texture.<br/> - /// There are exactly 6 distinct sets of 2D images, all of the same size. They act as 6 faces of a cube. - /// </summary> - public sealed class TextureCubemap - : LayeredTexture - { - public override TextureTarget TextureTarget { get { return TextureTarget.TextureCubeMap; } } - - /// <summary> - /// The size of the texture.<br/> - /// This represents both width and height of the texture, because cube maps have to be square. - /// </summary> - public int Size { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="size">The width and height of the cube map faces.</param> - /// <param name="levels">The number of mipmap levels.</param> - public TextureCubemap(SizedInternalFormat internalFormat, int size, int levels = 0) - : base(internalFormat, GetLevels(levels, size)) - { - Size = size; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage2D((TextureTarget2d)TextureTarget, Levels, InternalFormat, Size, Size); - CheckError(); - } - } -} diff --git a/ObjectTK/Textures/TextureCubemapArray.cs b/ObjectTK/Textures/TextureCubemapArray.cs deleted file mode 100644 index cd689c7..0000000 --- a/ObjectTK/Textures/TextureCubemapArray.cs +++ /dev/null @@ -1,54 +0,0 @@ -// -// TextureCubemapArray.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a cubemap texture array.<br/> - /// Images in this texture are all cube maps. It contains multiple sets of cube maps, all within one texture. - /// The array length * 6 (number of cube faces) is part of the texture size. - /// </summary> - public sealed class TextureCubemapArray - : LayeredTexture - { - public override TextureTarget TextureTarget { get { return TextureTarget.TextureCubeMapArray; } } - - /// <summary> - /// The size of the texture.<br/> - /// This represents both width and height of the texture, because cube maps have to be square. - /// </summary> - public int Size { get; private set; } - - /// <summary> - /// The number of layers. - /// </summary> - public int Layers { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="size">The width and height of the cube map faces.</param> - /// <param name="layers">The number of layers to allocate.</param> - /// <param name="levels">The number of mipmap levels.</param> - public TextureCubemapArray(SizedInternalFormat internalFormat, int size, int layers, int levels = 0) - : base(internalFormat, GetLevels(levels, size)) - { - Size = size; - Layers = layers; - GL.BindTexture(TextureTarget, Handle); - // note: the depth parameter is the number of layer-faces hence the multiplication by six, - // see https://www.opengl.org/wiki/Texture_Storage#Immutable_storage - GL.TexStorage3D((TextureTarget3d)TextureTarget, Levels, InternalFormat, Size, Size, 6 * Layers); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/TextureFactory.cs b/ObjectTK/Textures/TextureFactory.cs deleted file mode 100644 index ebcf338..0000000 --- a/ObjectTK/Textures/TextureFactory.cs +++ /dev/null @@ -1,50 +0,0 @@ -// -// TextureFactory.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Linq; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Provides methods for creating texture objects in ways not covered by constructors. - /// </summary> - public static class TextureFactory - { - /// <summary> - /// Creates a new Texture2D instance using the given texture handle.<br/> - /// The width, height and internal format are queried from OpenGL and passed to the instance. - /// The number of mipmap levels can not be queried and must be specified, otherwise it is set to one. - /// TODO: somehow find out the number of mipmap levels because otherwise <see cref="Texture.AssertLevel"/> does not work correctly. - /// </summary> - /// <param name="textureHandle">An active handle to a 2D texture.</param> - /// <param name="levels">The number of mipmap levels.</param> - /// <returns>A new Texture2D instance.</returns> - public static Texture2D AquireTexture2D(int textureHandle, int levels = 1) - { - int width, height, internalFormat; - GL.BindTexture(TextureTarget.Texture2D, textureHandle); - GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureWidth, out width); - GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureHeight, out height); - GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureInternalFormat, out internalFormat); - return new Texture2D(textureHandle, (SizedInternalFormat)internalFormat, width, height, levels); - } - - /// <summary> - /// Calculates the maximum number of mipmap levels allowed, based on the size of all dimensions given. - /// </summary> - /// <param name="dimensions">Specifies the size in all dimensions.</param> - /// <returns>The maximum number of mipmap levels allowed. The last level would consist of 1 texel.</returns> - public static int CalculateMaxMipmapLevels(params int[] dimensions) - { - return 1 + (int)Math.Floor(Math.Log(dimensions.Max())); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Textures/TextureRectangle.cs b/ObjectTK/Textures/TextureRectangle.cs deleted file mode 100644 index 048ee27..0000000 --- a/ObjectTK/Textures/TextureRectangle.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// TextureRectangle.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Textures -{ - /// <summary> - /// Represents a rectangle texture.<br/> - /// The image in this texture (only one image. No mipmapping) is 2-dimensional. - /// Texture coordinates used for these textures are not normalized. - /// </summary> - public sealed class TextureRectangle - : Texture - { - public override TextureTarget TextureTarget { get { return TextureTarget.TextureRectangle; } } - public override bool SupportsMipmaps { get { return false; } } - - /// <summary> - /// The width of the texture. - /// </summary> - public int Width { get; private set; } - - /// <summary> - /// The height of the texture. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// Allocates immutable texture storage with the given parameters. - /// </summary> - /// <param name="internalFormat">The internal format to allocate.</param> - /// <param name="width">The width of the texture.</param> - /// <param name="height">The height of the texture.</param> - public TextureRectangle(SizedInternalFormat internalFormat, int width, int height) - : base(internalFormat, 1) - { - Width = width; - Height = height; - GL.BindTexture(TextureTarget, Handle); - GL.TexStorage2D((TextureTarget2d)TextureTarget, 1, InternalFormat, Width, Height); - CheckError(); - } - } -} \ No newline at end of file diff --git a/ObjectTK/Utility.cs b/ObjectTK/Utility.cs deleted file mode 100644 index 7d4ec84..0000000 --- a/ObjectTK/Utility.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// Utility.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using ObjectTK.Exceptions; -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK -{ - internal static class Utility - { - private static readonly Logging.IObjectTKLogger Logger = Logging.LogFactory.GetLogger(typeof(Utility)); - - public static void Assert(string errorMessage) - { - Assert(GL.GetError(), ErrorCode.NoError, errorMessage); - } - - public static void Assert(ErrorCode desiredErrorCode, string errorMessage) - { - Assert(GL.GetError(), desiredErrorCode, errorMessage); - } - - public static void Assert<T>(T value, T desiredValue, string errorMessage) - { - if (desiredValue.Equals(value)) return; - Logger?.Error(string.Format("Assert failed: {0}\n{1}", value, errorMessage)); - throw new ObjectTKException(string.Format("ErrorCode: {0}\n{1}", value, errorMessage)); - } - } -} diff --git a/ObjectTK/Vector3i.cs b/ObjectTK/Vector3i.cs deleted file mode 100644 index e00968b..0000000 --- a/ObjectTK/Vector3i.cs +++ /dev/null @@ -1,413 +0,0 @@ -// -// Vector3i.cs -// -// Copyright (C) 2018 OpenTK -// -// This software may be modified and distributed under the terms -// of the MIT license. See the LICENSE file for details. -// - -using System; -using System.Runtime.InteropServices; - -namespace ObjectTK -{ - /// <summary>Represents a 3D vector using three 32-bit integer values.</summary> - /// <remarks> - /// The Vector3i structure is suitable for interoperation with unmanaged code requiring three consecutive integers. - /// </remarks> - [Serializable] - public struct Vector3i : IEquatable<Vector3i> - { - #region Fields - - /// <summary> - /// The X component of the Vector3i. - /// </summary> - public int X; - - /// <summary> - /// The Y component of the Vector3i. - /// </summary> - public int Y; - - /// <summary> - /// The Z component of the Vector3i. - /// </summary> - public int Z; - - #endregion - - #region Constructors - - /// <summary> - /// Constructs a new Vector3i. - /// </summary> - /// <param name="x">The x coordinate of the net Vector3i.</param> - /// <param name="y">The y coordinate of the net Vector3i.</param> - /// <param name="z">The z coordinate of the net Vector3i.</param> - public Vector3i(int x, int y, int z) - { - X = x; - Y = y; - Z = z; - } - - #endregion - - #region Public Members - - #region Static - - #region Fields - - /// <summary> - /// Defines a unit-length Vector3i that points towards the X-axis. - /// </summary> - public static readonly Vector3i UnitX = new Vector3i(1, 0, 0); - - /// <summary> - /// Defines a unit-length Vector3i that points towards the Y-axis. - /// </summary> - public static readonly Vector3i UnitY = new Vector3i(0, 1, 0); - - /// <summary> - /// Defines a unit-length Vector3i that points towards the Z-axis. - /// </summary> - public static readonly Vector3i UnitZ = new Vector3i(0, 0, 1); - - /// <summary> - /// Defines a zero-length Vector3i. - /// </summary> - public static readonly Vector3i Zero = new Vector3i(0, 0, 0); - - /// <summary> - /// Defines an instance with all components set to 1. - /// </summary> - public static readonly Vector3i One = new Vector3i(1, 1, 1); - - /// <summary> - /// Defines the size of the Vector3i struct in bytes. - /// </summary> - public static readonly int SizeInBytes = Marshal.SizeOf(new Vector3i()); - - #endregion - - #region Add - - /// <summary> - /// Adds two vectors. - /// </summary> - /// <param name="a">Left operand.</param> - /// <param name="b">Right operand.</param> - /// <returns>Result of operation.</returns> - public static Vector3i Add(Vector3i a, Vector3i b) - { - Add(ref a, ref b, out a); - return a; - } - - /// <summary> - /// Adds two vectors. - /// </summary> - /// <param name="a">Left operand.</param> - /// <param name="b">Right operand.</param> - /// <param name="result">Result of operation.</param> - public static void Add(ref Vector3i a, ref Vector3i b, out Vector3i result) - { - result = new Vector3i(a.X + b.X, a.Y + b.Y, a.Z + b.Z); - } - - #endregion - - #region Subtract - - /// <summary> - /// Subtract one Vector from another - /// </summary> - /// <param name="a">First operand</param> - /// <param name="b">Second operand</param> - /// <returns>Result of subtraction</returns> - public static Vector3i Subtract(Vector3i a, Vector3i b) - { - Subtract(ref a, ref b, out a); - return a; - } - - /// <summary> - /// Subtract one Vector from another - /// </summary> - /// <param name="a">First operand</param> - /// <param name="b">Second operand</param> - /// <param name="result">Result of subtraction</param> - public static void Subtract(ref Vector3i a, ref Vector3i b, out Vector3i result) - { - result = new Vector3i(a.X - b.X, a.Y - b.Y, a.Z - b.Z); - } - - #endregion - - #region Abs - - /// <summary> - /// Applies component-wise absolute evaluation - /// </summary> - /// <param name="value">Absolute operation applies to this vector's components</param> - /// <returns>A vector whose components have absolute value of given vector</returns> - public static Vector3i Abs(Vector3i value) - { - Vector3i result; - Abs(ref value, out result); - return result; - } - - /// <summary> - /// Applies component-wise absolute evaluation - /// </summary> - /// <param name="value">Absolute operation applies to this vector's components</param> - /// <param name="result">A vector whose components have absolute value of given vector <paramref name="value"/></param> - public static void Abs(ref Vector3i value, out Vector3i result) - { - result = new Vector3i(Math.Abs(value.X), Math.Abs(value.Y), Math.Abs(value.Z)); - } - - /// <summary> - /// Applies component-wise absolute evaluation - /// </summary> - /// <param name="value">Absolute operation applies to this vector's components</param> - public static void Abs(ref Vector3i value) - { - Abs(ref value, out value); - } - - #endregion - - #region ComponentMin - - /// <summary> - /// Calculate the component-wise minimum of two vectors - /// </summary> - /// <param name="a">First operand</param> - /// <param name="b">Second operand</param> - /// <returns>The component-wise minimum</returns> - public static Vector3i ComponentMin(Vector3i a, Vector3i b) - { - a.X = a.X < b.X ? a.X : b.X; - a.Y = a.Y < b.Y ? a.Y : b.Y; - a.Z = a.Z < b.Z ? a.Z : b.Z; - return a; - } - - /// <summary> - /// Calculate the component-wise minimum of two vectors - /// </summary> - /// <param name="a">First operand</param> - /// <param name="b">Second operand</param> - /// <param name="result">The component-wise minimum</param> - public static void ComponentMin(ref Vector3i a, ref Vector3i b, out Vector3i result) - { - result.X = a.X < b.X ? a.X : b.X; - result.Y = a.Y < b.Y ? a.Y : b.Y; - result.Z = a.Z < b.Z ? a.Z : b.Z; - } - - #endregion - - #region ComponentMax - - /// <summary> - /// Calculate the component-wise maximum of two vectors - /// </summary> - /// <param name="a">First operand</param> - /// <param name="b">Second operand</param> - /// <returns>The component-wise maximum</returns> - public static Vector3i ComponentMax(Vector3i a, Vector3i b) - { - a.X = a.X > b.X ? a.X : b.X; - a.Y = a.Y > b.Y ? a.Y : b.Y; - a.Z = a.Z > b.Z ? a.Z : b.Z; - return a; - } - - /// <summary> - /// Calculate the component-wise maximum of two vectors - /// </summary> - /// <param name="a">First operand</param> - /// <param name="b">Second operand</param> - /// <param name="result">The component-wise maximum</param> - public static void ComponentMax(ref Vector3i a, ref Vector3i b, out Vector3i result) - { - result.X = a.X > b.X ? a.X : b.X; - result.Y = a.Y > b.Y ? a.Y : b.Y; - result.Z = a.Z > b.Z ? a.Z : b.Z; - } - - #endregion - - #region Clamp - - /// <summary> - /// Clamp a vector to the given minimum and maximum vectors - /// </summary> - /// <param name="vec">Input vector</param> - /// <param name="min">Minimum vector</param> - /// <param name="max">Maximum vector</param> - /// <returns>The clamped vector</returns> - public static Vector3i Clamp(Vector3i vec, Vector3i min, Vector3i max) - { - vec.X = vec.X < min.X ? min.X : vec.X > max.X ? max.X : vec.X; - vec.Y = vec.Y < min.Y ? min.Y : vec.Y > max.Y ? max.Y : vec.Y; - vec.Z = vec.Z < min.Z ? min.Z : vec.Z > max.Z ? max.Z : vec.Z; - return vec; - } - - /// <summary> - /// Clamp a vector to the given minimum and maximum vectors - /// </summary> - /// <param name="vec">Input vector</param> - /// <param name="min">Minimum vector</param> - /// <param name="max">Maximum vector</param> - /// <param name="result">The clamped vector</param> - public static void Clamp(ref Vector3i vec, ref Vector3i min, ref Vector3i max, out Vector3i result) - { - result.X = vec.X < min.X ? min.X : vec.X > max.X ? max.X : vec.X; - result.Y = vec.Y < min.Y ? min.Y : vec.Y > max.Y ? max.Y : vec.Y; - result.Z = vec.Z < min.Z ? min.Z : vec.Z > max.Z ? max.Z : vec.Z; - } - - #endregion - - #endregion - - #region Operators - - /// <summary> - /// Adds the specified instances. - /// </summary> - /// <param name="left">Left operand.</param> - /// <param name="right">Right operand.</param> - /// <returns>Result of addition.</returns> - public static Vector3i operator +(Vector3i left, Vector3i right) - { - left.X += right.X; - left.Y += right.Y; - left.Z += right.Z; - return left; - } - - /// <summary> - /// Subtracts the specified instances. - /// </summary> - /// <param name="left">Left operand.</param> - /// <param name="right">Right operand.</param> - /// <returns>Result of subtraction.</returns> - public static Vector3i operator -(Vector3i left, Vector3i right) - { - left.X -= right.X; - left.Y -= right.Y; - left.Z -= right.Z; - return left; - } - - /// <summary> - /// Negates the specified instance. - /// </summary> - /// <param name="vec">Operand.</param> - /// <returns>Result of negation.</returns> - public static Vector3i operator -(Vector3i vec) - { - vec.X = -vec.X; - vec.Y = -vec.Y; - vec.Z = -vec.Z; - return vec; - } - - /// <summary> - /// Compares the specified instances for equality. - /// </summary> - /// <param name="left">Left operand.</param> - /// <param name="right">Right operand.</param> - /// <returns>True if both instances are equal; false otherwise.</returns> - public static bool operator ==(Vector3i left, Vector3i right) - { - return left.Equals(right); - } - - /// <summary> - /// Compares the specified instances for inequality. - /// </summary> - /// <param name="left">Left operand.</param> - /// <param name="right">Right operand.</param> - /// <returns>True if both instances are not equal; false otherwise.</returns> - public static bool operator !=(Vector3i left, Vector3i right) - { - return !left.Equals(right); - } - - #endregion - - #region Overrides - - #region public override string ToString() - - /// <summary> - /// Returns a System.String that represents the current Vector3i. - /// </summary> - /// <returns></returns> - public override string ToString() - { - return String.Format("({0}, {1}, {2})", X, Y, Z); - } - - #endregion - - #region public override int GetHashCode() - - /// <summary> - /// Returns the hashcode for this instance. - /// </summary> - /// <returns>A System.Int32 containing the unique hashcode for this instance.</returns> - public override int GetHashCode() - { - return X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode(); - } - - #endregion - - #region public override bool Equals(object obj) - - /// <summary> - /// Indicates whether this instance and a specified object are equal. - /// </summary> - /// <param name="obj">The object to compare to.</param> - /// <returns>True if the instances are equal; false otherwise.</returns> - public override bool Equals(object obj) - { - if (!(obj is Vector3i)) - return false; - - return this.Equals((Vector3i)obj); - } - - #endregion - - #endregion - - #endregion - - #region IEquatable<Vector3i> Members - - /// <summary>Indicates whether the current vector is equal to another vector.</summary> - /// <param name="other">A vector to compare with this vector.</param> - /// <returns>true if the current vector is equal to the vector parameter; otherwise, false.</returns> - public bool Equals(Vector3i other) - { - return - X == other.X && - Y == other.Y && - Z == other.Z; - } - - #endregion - } -} \ No newline at end of file diff --git a/ObjectTK/packages.config b/ObjectTK/packages.config deleted file mode 100644 index 338f3df..0000000 --- a/ObjectTK/packages.config +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<packages> - <package id="log4net" version="2.0.3" targetFramework="net40" /> - <package id="OpenTK" version="1.1.1589.5942" targetFramework="net40" /> -</packages> \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 739de4b..0000000 --- a/README.md +++ /dev/null @@ -1,33 +0,0 @@ -What is ObjectTK? -====== - -ObjectTK is a thin abstraction layer on top of OpenTK to provide OpenGL features in an object-oriented and mostly type-safe manner with modern C#-style. -It is fully aimed at modern OpenGL and compatible to the OpenGL4 core profile. - -Currently there are types for the following OpenGL features: -* Programs and Shaders -* Textures -* Vertex array objects -* Buffer objects -* Sampler objects -* Query objects -* Framebuffers -* Renderbuffers - -The main advantages of using these types are: -* Cleaner interface than using the OpenGL API directly. -* Type-safety when suitable. -* Removes the necessary but error-prone boilerplate code from your project. -* Immediate detection of leaked resources. -* Information log via log4net. -* The Debug-Build also includes additional sanity-checks which help tracking down common errors. - -ObjectTK does not force you to use its functionality and skip the OpenGL API at all. It is perfectly fine to use the OpenGL API directly and the ObjectTK types side-by-side, because ObjectTK does not explicitly keep track of any OpenGL state which might get corrupted when you call the OpenGL API without it knowing. This is an essential feature which makes ObjectTK very usable even if it is not a "complete" wrapper around every corner of OpenGL. - -## What about performance? -Just like any wrapper it introduces another layer between the things you want to get done and the hardware, so it may theoretically slow things down a bit, but there are two things to consider: -- When using modern OpenGL, which is the main target of ObjectTK, the number of API-calls is much lower than it used to be. That means that the overhead of each API-call is not that important anymore. -- The wrapper really is very thin, more often than not there is just a single method call between you and the OpenGL API for functionality which might get used very often. For initialization-related stuff the layer may be a little thicker because it does things right, with all possible error-checking and so forth. - -## Examples -For examples please have a look at the Examples project and the wiki pages: [Basic example](https://github.com/JcBernack/ObjectTK/wiki/Basic-example) diff --git a/packages/repositories.config b/packages/repositories.config deleted file mode 100644 index bb8e188..0000000 --- a/packages/repositories.config +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<repositories> - <repository path="..\Examples\packages.config" /> - <repository path="..\ObjectTK.Compiler\packages.config" /> - <repository path="..\ObjectTK.Tools\packages.config" /> - <repository path="..\ObjectTK\packages.config" /> -</repositories> \ No newline at end of file From 61d6d1445edf9535202a7fe65addc6a202ab63fe Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Sun, 11 Oct 2020 18:06:36 -0400 Subject: [PATCH 02/52] Initial commit 2 --- .gitignore | 362 +++++++++++++++++++++++++++++ ObjectTK.Data/Class1.cs | 6 + ObjectTK.Data/ObjectTK.Data.csproj | 11 + ObjectTK.sln | 25 ++ 4 files changed, 404 insertions(+) create mode 100644 .gitignore create mode 100644 ObjectTK.Data/Class1.cs create mode 100644 ObjectTK.Data/ObjectTK.Data.csproj create mode 100644 ObjectTK.sln diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1ee5385 --- /dev/null +++ b/.gitignore @@ -0,0 +1,362 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd diff --git a/ObjectTK.Data/Class1.cs b/ObjectTK.Data/Class1.cs new file mode 100644 index 0000000..5e0bad2 --- /dev/null +++ b/ObjectTK.Data/Class1.cs @@ -0,0 +1,6 @@ +using System; + +namespace ObjectTK.Data { + public class Class1 { + } +} diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Data/ObjectTK.Data.csproj new file mode 100644 index 0000000..c3c4501 --- /dev/null +++ b/ObjectTK.Data/ObjectTK.Data.csproj @@ -0,0 +1,11 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netcoreapp3.1</TargetFramework> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="OpenTK" Version="4.0.2" /> + </ItemGroup> + +</Project> diff --git a/ObjectTK.sln b/ObjectTK.sln new file mode 100644 index 0000000..90e8162 --- /dev/null +++ b/ObjectTK.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {163450BD-24E0-4C3E-A310-3AEBD709E065}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {163450BD-24E0-4C3E-A310-3AEBD709E065}.Debug|Any CPU.Build.0 = Debug|Any CPU + {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.ActiveCfg = Release|Any CPU + {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ED1B1358-95C3-48DA-BF83-8A320A20B918} + EndGlobalSection +EndGlobal From 856a5540d9aedb27909d85f8f3b137f3704eb6f5 Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Sun, 18 Oct 2020 08:47:44 -0400 Subject: [PATCH 03/52] initial commit for textures --- ObjectTK.Data/Class1.cs | 6 ----- ObjectTK.Data/GLObject.cs | 27 +++++++++++++++++++ ObjectTK.Data/Textures/Texture.cs | 9 +++++++ ObjectTK.Data/Textures/Texture1D.cs | 11 ++++++++ ObjectTK.Data/Textures/Texture1DArray.cs | 10 +++++++ ObjectTK.Data/Textures/Texture2D.cs | 12 +++++++++ ObjectTK.Data/Textures/Texture2DArray.cs | 10 +++++++ .../Textures/Texture2DMultisample.cs | 13 +++++++++ .../Textures/Texture2DMultisampleArray.cs | 11 ++++++++ ObjectTK.Data/Textures/Texture3D.cs | 13 +++++++++ ObjectTK.Data/Textures/TextureBuffer.cs | 10 +++++++ ObjectTK.Data/Textures/TextureCubeMap.cs | 11 ++++++++ ObjectTK.Data/Textures/TextureCubeMapArray.cs | 10 +++++++ ObjectTK.Data/Textures/TextureRectangle.cs | 11 ++++++++ 14 files changed, 158 insertions(+), 6 deletions(-) delete mode 100644 ObjectTK.Data/Class1.cs create mode 100644 ObjectTK.Data/GLObject.cs create mode 100644 ObjectTK.Data/Textures/Texture.cs create mode 100644 ObjectTK.Data/Textures/Texture1D.cs create mode 100644 ObjectTK.Data/Textures/Texture1DArray.cs create mode 100644 ObjectTK.Data/Textures/Texture2D.cs create mode 100644 ObjectTK.Data/Textures/Texture2DArray.cs create mode 100644 ObjectTK.Data/Textures/Texture2DMultisample.cs create mode 100644 ObjectTK.Data/Textures/Texture2DMultisampleArray.cs create mode 100644 ObjectTK.Data/Textures/Texture3D.cs create mode 100644 ObjectTK.Data/Textures/TextureBuffer.cs create mode 100644 ObjectTK.Data/Textures/TextureCubeMap.cs create mode 100644 ObjectTK.Data/Textures/TextureCubeMapArray.cs create mode 100644 ObjectTK.Data/Textures/TextureRectangle.cs diff --git a/ObjectTK.Data/Class1.cs b/ObjectTK.Data/Class1.cs deleted file mode 100644 index 5e0bad2..0000000 --- a/ObjectTK.Data/Class1.cs +++ /dev/null @@ -1,6 +0,0 @@ -using System; - -namespace ObjectTK.Data { - public class Class1 { - } -} diff --git a/ObjectTK.Data/GLObject.cs b/ObjectTK.Data/GLObject.cs new file mode 100644 index 0000000..bf14e84 --- /dev/null +++ b/ObjectTK.Data/GLObject.cs @@ -0,0 +1,27 @@ +namespace ObjectTK.Data { + public abstract class GLObject { + + public int Handle { get; } + + private GLObject() { + + } + + public GLObject(int Handle) { + this.Handle = Handle; + } + + public bool Equals(GLObject Other) { + return Other != null && Handle.Equals(Other.Handle); + } + + public override bool Equals(object Other) { + return Other is GLObject GLObject && Equals(GLObject); + } + + public override int GetHashCode() { + return Handle.GetHashCode(); + } + + } +} diff --git a/ObjectTK.Data/Textures/Texture.cs b/ObjectTK.Data/Textures/Texture.cs new file mode 100644 index 0000000..bae6d2a --- /dev/null +++ b/ObjectTK.Data/Textures/Texture.cs @@ -0,0 +1,9 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public abstract class Texture : GLObject { + public abstract TextureTarget TextureTarget { get; } + public SizedInternalFormat InternalFormat { get; set; } + public Texture(int Handle, SizedInternalFormat InternalFormat) : base(Handle) => this.InternalFormat = InternalFormat; + } +} diff --git a/ObjectTK.Data/Textures/Texture1D.cs b/ObjectTK.Data/Textures/Texture1D.cs new file mode 100644 index 0000000..d5184c4 --- /dev/null +++ b/ObjectTK.Data/Textures/Texture1D.cs @@ -0,0 +1,11 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture1D : Texture { + public override TextureTarget TextureTarget => TextureTarget.Texture1D; + public int Width { get; set; } + public int MipLevels { get; set; } + public Texture1D(int Handle, SizedInternalFormat InternalFormat, int Width, int MipLevels) : base(Handle, InternalFormat) => + (this.Width, this.MipLevels) = (Width, MipLevels); + } +} \ No newline at end of file diff --git a/ObjectTK.Data/Textures/Texture1DArray.cs b/ObjectTK.Data/Textures/Texture1DArray.cs new file mode 100644 index 0000000..014aefa --- /dev/null +++ b/ObjectTK.Data/Textures/Texture1DArray.cs @@ -0,0 +1,10 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture1DArray : Texture1D { + public override TextureTarget TextureTarget => TextureTarget.Texture1DArray; + public int Layers { get; set; } + public Texture1DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Layers, int MipLevels) : base(Handle, InternalFormat, Width, MipLevels) => + this.Layers = Layers; + } +} diff --git a/ObjectTK.Data/Textures/Texture2D.cs b/ObjectTK.Data/Textures/Texture2D.cs new file mode 100644 index 0000000..b1963df --- /dev/null +++ b/ObjectTK.Data/Textures/Texture2D.cs @@ -0,0 +1,12 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture2D : Texture { + public override TextureTarget TextureTarget => TextureTarget.Texture2D; + public int Width { get; set; } + public int Height { get; set; } + public int MipLevels { get; set; } + public Texture2D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels) : base(Handle, InternalFormat) => + (this.Width, this.Height, this.MipLevels) = (Width, Height, MipLevels); + } +} diff --git a/ObjectTK.Data/Textures/Texture2DArray.cs b/ObjectTK.Data/Textures/Texture2DArray.cs new file mode 100644 index 0000000..e1e563d --- /dev/null +++ b/ObjectTK.Data/Textures/Texture2DArray.cs @@ -0,0 +1,10 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture2DArray : Texture2D { + public override TextureTarget TextureTarget => TextureTarget.Texture2DArray; + public int Layers { get; set; } + public Texture2DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels, int Layers) : base(Handle, InternalFormat, Width, Height, MipLevels) => + this.Layers = Layers; + } +} diff --git a/ObjectTK.Data/Textures/Texture2DMultisample.cs b/ObjectTK.Data/Textures/Texture2DMultisample.cs new file mode 100644 index 0000000..3d6e8dc --- /dev/null +++ b/ObjectTK.Data/Textures/Texture2DMultisample.cs @@ -0,0 +1,13 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture2DMultisample : Texture { + public override TextureTarget TextureTarget => TextureTarget.Texture2DMultisample; + public int Width { get; set; } + public int Height { get; set; } + public int Samples { get; set; } + public bool FixedSampleLocations { get; set; } + public Texture2DMultisample(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) : base(Handle, InternalFormat) => + (this.Width, this.Height, this.Samples, this.FixedSampleLocations) = (Width, Height, Samples, FixedSampleLocations); + } +} diff --git a/ObjectTK.Data/Textures/Texture2DMultisampleArray.cs b/ObjectTK.Data/Textures/Texture2DMultisampleArray.cs new file mode 100644 index 0000000..749d6ca --- /dev/null +++ b/ObjectTK.Data/Textures/Texture2DMultisampleArray.cs @@ -0,0 +1,11 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture2DMultisampleArray : Texture2DMultisample { + public override TextureTarget TextureTarget => TextureTarget.Texture2DMultisampleArray; + public int Layers { get; set; } + public Texture2DMultisampleArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations, int Layers) : + base(Handle, InternalFormat, Width, Height, Samples, FixedSampleLocations) => + this.Layers = Layers; + } +} diff --git a/ObjectTK.Data/Textures/Texture3D.cs b/ObjectTK.Data/Textures/Texture3D.cs new file mode 100644 index 0000000..9e06fdc --- /dev/null +++ b/ObjectTK.Data/Textures/Texture3D.cs @@ -0,0 +1,13 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class Texture3D : Texture { + public override TextureTarget TextureTarget => TextureTarget.Texture3D; + int Width { get; set; } + int Height { get; set; } + int Layers { get; set; } + public int MipLevels { get; set; } + public Texture3D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) : base(Handle, InternalFormat) => + (this.Width, this.Height, this.Layers, this.MipLevels) = (Width, Height, Layers, MipLevels); + } +} diff --git a/ObjectTK.Data/Textures/TextureBuffer.cs b/ObjectTK.Data/Textures/TextureBuffer.cs new file mode 100644 index 0000000..d4c5217 --- /dev/null +++ b/ObjectTK.Data/Textures/TextureBuffer.cs @@ -0,0 +1,10 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class TextureBuffer : Texture { + public override TextureTarget TextureTarget => TextureTarget.TextureBuffer; + public TextureBuffer(int Handle, SizedInternalFormat InternalFormat) : base(Handle, InternalFormat) { + //TODO: I don't know much about this texture type + } + } +} diff --git a/ObjectTK.Data/Textures/TextureCubeMap.cs b/ObjectTK.Data/Textures/TextureCubeMap.cs new file mode 100644 index 0000000..717871f --- /dev/null +++ b/ObjectTK.Data/Textures/TextureCubeMap.cs @@ -0,0 +1,11 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class TextureCubeMap : Texture { + public override TextureTarget TextureTarget => TextureTarget.TextureCubeMap; + public int Size { get; set; } + public int MipLevels { get; set; } + public TextureCubeMap(int Handle, SizedInternalFormat InternalFormat, int Size, int MipLevels) : base(Handle, InternalFormat) => + (this.Size, this.MipLevels) = (Size, MipLevels); + } +} diff --git a/ObjectTK.Data/Textures/TextureCubeMapArray.cs b/ObjectTK.Data/Textures/TextureCubeMapArray.cs new file mode 100644 index 0000000..001eb74 --- /dev/null +++ b/ObjectTK.Data/Textures/TextureCubeMapArray.cs @@ -0,0 +1,10 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public sealed class TextureCubeMapArray : TextureCubeMap { + public override TextureTarget TextureTarget => TextureTarget.TextureCubeMapArray; + public int Layers { get; set; } + public TextureCubeMapArray(int Handle, SizedInternalFormat InternalFormat, int Size, int Layers, int MipLevels) : base(Handle, InternalFormat, Size, MipLevels) => + this.Layers = Layers; + } +} diff --git a/ObjectTK.Data/Textures/TextureRectangle.cs b/ObjectTK.Data/Textures/TextureRectangle.cs new file mode 100644 index 0000000..0641644 --- /dev/null +++ b/ObjectTK.Data/Textures/TextureRectangle.cs @@ -0,0 +1,11 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public class TextureRectangle : Texture { + public override TextureTarget TextureTarget => TextureTarget.TextureRectangle; + public int Width { get; set; } + public int Height { get; set; } + public TextureRectangle(int Handle, SizedInternalFormat InternalFormat, int Width, int Height) : base(Handle, InternalFormat) => + (this.Width, this.Height) = (Width, Height); + } +} From 366ce6e53981077eb4e8106f5b6c7002a01add52 Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Sun, 18 Oct 2020 09:58:52 -0400 Subject: [PATCH 04/52] refactor textures --- ObjectTK.Data/GLObject.cs | 27 ---- ObjectTK.Data/ObjectTK.Data.csproj | 4 + ObjectTK.Data/Textures/ITexture.cs | 9 ++ ObjectTK.Data/Textures/Texture.cs | 9 -- ObjectTK.Data/Textures/Texture1D.cs | 11 -- ObjectTK.Data/Textures/Texture1DArray.cs | 10 -- ObjectTK.Data/Textures/Texture2D.cs | 12 -- ObjectTK.Data/Textures/Texture2DArray.cs | 10 -- .../Textures/Texture2DMultisample.cs | 13 -- .../Textures/Texture2DMultisampleArray.cs | 11 -- ObjectTK.Data/Textures/Texture3D.cs | 13 -- ObjectTK.Data/Textures/TextureBuffer.cs | 10 -- ObjectTK.Data/Textures/TextureCubeMap.cs | 11 -- ObjectTK.Data/Textures/TextureCubeMapArray.cs | 10 -- ObjectTK.Data/Textures/TextureRectangle.cs | 11 -- ObjectTK.Data/Textures/Textures.cs | 124 ++++++++++++++++++ 16 files changed, 137 insertions(+), 158 deletions(-) delete mode 100644 ObjectTK.Data/GLObject.cs create mode 100644 ObjectTK.Data/Textures/ITexture.cs delete mode 100644 ObjectTK.Data/Textures/Texture.cs delete mode 100644 ObjectTK.Data/Textures/Texture1D.cs delete mode 100644 ObjectTK.Data/Textures/Texture1DArray.cs delete mode 100644 ObjectTK.Data/Textures/Texture2D.cs delete mode 100644 ObjectTK.Data/Textures/Texture2DArray.cs delete mode 100644 ObjectTK.Data/Textures/Texture2DMultisample.cs delete mode 100644 ObjectTK.Data/Textures/Texture2DMultisampleArray.cs delete mode 100644 ObjectTK.Data/Textures/Texture3D.cs delete mode 100644 ObjectTK.Data/Textures/TextureBuffer.cs delete mode 100644 ObjectTK.Data/Textures/TextureCubeMap.cs delete mode 100644 ObjectTK.Data/Textures/TextureCubeMapArray.cs delete mode 100644 ObjectTK.Data/Textures/TextureRectangle.cs create mode 100644 ObjectTK.Data/Textures/Textures.cs diff --git a/ObjectTK.Data/GLObject.cs b/ObjectTK.Data/GLObject.cs deleted file mode 100644 index bf14e84..0000000 --- a/ObjectTK.Data/GLObject.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace ObjectTK.Data { - public abstract class GLObject { - - public int Handle { get; } - - private GLObject() { - - } - - public GLObject(int Handle) { - this.Handle = Handle; - } - - public bool Equals(GLObject Other) { - return Other != null && Handle.Equals(Other.Handle); - } - - public override bool Equals(object Other) { - return Other is GLObject GLObject && Equals(GLObject); - } - - public override int GetHashCode() { - return Handle.GetHashCode(); - } - - } -} diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Data/ObjectTK.Data.csproj index c3c4501..848df19 100644 --- a/ObjectTK.Data/ObjectTK.Data.csproj +++ b/ObjectTK.Data/ObjectTK.Data.csproj @@ -8,4 +8,8 @@ <PackageReference Include="OpenTK" Version="4.0.2" /> </ItemGroup> + <ItemGroup> + <Folder Include="Uniforms\" /> + </ItemGroup> + </Project> diff --git a/ObjectTK.Data/Textures/ITexture.cs b/ObjectTK.Data/Textures/ITexture.cs new file mode 100644 index 0000000..bd4cd28 --- /dev/null +++ b/ObjectTK.Data/Textures/ITexture.cs @@ -0,0 +1,9 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public interface ITexture { + public int Handle { get; } + TextureTarget TextureTarget { get; } + SizedInternalFormat InternalFormat { get; set; } + } +} diff --git a/ObjectTK.Data/Textures/Texture.cs b/ObjectTK.Data/Textures/Texture.cs deleted file mode 100644 index bae6d2a..0000000 --- a/ObjectTK.Data/Textures/Texture.cs +++ /dev/null @@ -1,9 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public abstract class Texture : GLObject { - public abstract TextureTarget TextureTarget { get; } - public SizedInternalFormat InternalFormat { get; set; } - public Texture(int Handle, SizedInternalFormat InternalFormat) : base(Handle) => this.InternalFormat = InternalFormat; - } -} diff --git a/ObjectTK.Data/Textures/Texture1D.cs b/ObjectTK.Data/Textures/Texture1D.cs deleted file mode 100644 index d5184c4..0000000 --- a/ObjectTK.Data/Textures/Texture1D.cs +++ /dev/null @@ -1,11 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture1D : Texture { - public override TextureTarget TextureTarget => TextureTarget.Texture1D; - public int Width { get; set; } - public int MipLevels { get; set; } - public Texture1D(int Handle, SizedInternalFormat InternalFormat, int Width, int MipLevels) : base(Handle, InternalFormat) => - (this.Width, this.MipLevels) = (Width, MipLevels); - } -} \ No newline at end of file diff --git a/ObjectTK.Data/Textures/Texture1DArray.cs b/ObjectTK.Data/Textures/Texture1DArray.cs deleted file mode 100644 index 014aefa..0000000 --- a/ObjectTK.Data/Textures/Texture1DArray.cs +++ /dev/null @@ -1,10 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture1DArray : Texture1D { - public override TextureTarget TextureTarget => TextureTarget.Texture1DArray; - public int Layers { get; set; } - public Texture1DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Layers, int MipLevels) : base(Handle, InternalFormat, Width, MipLevels) => - this.Layers = Layers; - } -} diff --git a/ObjectTK.Data/Textures/Texture2D.cs b/ObjectTK.Data/Textures/Texture2D.cs deleted file mode 100644 index b1963df..0000000 --- a/ObjectTK.Data/Textures/Texture2D.cs +++ /dev/null @@ -1,12 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture2D : Texture { - public override TextureTarget TextureTarget => TextureTarget.Texture2D; - public int Width { get; set; } - public int Height { get; set; } - public int MipLevels { get; set; } - public Texture2D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels) : base(Handle, InternalFormat) => - (this.Width, this.Height, this.MipLevels) = (Width, Height, MipLevels); - } -} diff --git a/ObjectTK.Data/Textures/Texture2DArray.cs b/ObjectTK.Data/Textures/Texture2DArray.cs deleted file mode 100644 index e1e563d..0000000 --- a/ObjectTK.Data/Textures/Texture2DArray.cs +++ /dev/null @@ -1,10 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture2DArray : Texture2D { - public override TextureTarget TextureTarget => TextureTarget.Texture2DArray; - public int Layers { get; set; } - public Texture2DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels, int Layers) : base(Handle, InternalFormat, Width, Height, MipLevels) => - this.Layers = Layers; - } -} diff --git a/ObjectTK.Data/Textures/Texture2DMultisample.cs b/ObjectTK.Data/Textures/Texture2DMultisample.cs deleted file mode 100644 index 3d6e8dc..0000000 --- a/ObjectTK.Data/Textures/Texture2DMultisample.cs +++ /dev/null @@ -1,13 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture2DMultisample : Texture { - public override TextureTarget TextureTarget => TextureTarget.Texture2DMultisample; - public int Width { get; set; } - public int Height { get; set; } - public int Samples { get; set; } - public bool FixedSampleLocations { get; set; } - public Texture2DMultisample(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) : base(Handle, InternalFormat) => - (this.Width, this.Height, this.Samples, this.FixedSampleLocations) = (Width, Height, Samples, FixedSampleLocations); - } -} diff --git a/ObjectTK.Data/Textures/Texture2DMultisampleArray.cs b/ObjectTK.Data/Textures/Texture2DMultisampleArray.cs deleted file mode 100644 index 749d6ca..0000000 --- a/ObjectTK.Data/Textures/Texture2DMultisampleArray.cs +++ /dev/null @@ -1,11 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture2DMultisampleArray : Texture2DMultisample { - public override TextureTarget TextureTarget => TextureTarget.Texture2DMultisampleArray; - public int Layers { get; set; } - public Texture2DMultisampleArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations, int Layers) : - base(Handle, InternalFormat, Width, Height, Samples, FixedSampleLocations) => - this.Layers = Layers; - } -} diff --git a/ObjectTK.Data/Textures/Texture3D.cs b/ObjectTK.Data/Textures/Texture3D.cs deleted file mode 100644 index 9e06fdc..0000000 --- a/ObjectTK.Data/Textures/Texture3D.cs +++ /dev/null @@ -1,13 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class Texture3D : Texture { - public override TextureTarget TextureTarget => TextureTarget.Texture3D; - int Width { get; set; } - int Height { get; set; } - int Layers { get; set; } - public int MipLevels { get; set; } - public Texture3D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) : base(Handle, InternalFormat) => - (this.Width, this.Height, this.Layers, this.MipLevels) = (Width, Height, Layers, MipLevels); - } -} diff --git a/ObjectTK.Data/Textures/TextureBuffer.cs b/ObjectTK.Data/Textures/TextureBuffer.cs deleted file mode 100644 index d4c5217..0000000 --- a/ObjectTK.Data/Textures/TextureBuffer.cs +++ /dev/null @@ -1,10 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class TextureBuffer : Texture { - public override TextureTarget TextureTarget => TextureTarget.TextureBuffer; - public TextureBuffer(int Handle, SizedInternalFormat InternalFormat) : base(Handle, InternalFormat) { - //TODO: I don't know much about this texture type - } - } -} diff --git a/ObjectTK.Data/Textures/TextureCubeMap.cs b/ObjectTK.Data/Textures/TextureCubeMap.cs deleted file mode 100644 index 717871f..0000000 --- a/ObjectTK.Data/Textures/TextureCubeMap.cs +++ /dev/null @@ -1,11 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class TextureCubeMap : Texture { - public override TextureTarget TextureTarget => TextureTarget.TextureCubeMap; - public int Size { get; set; } - public int MipLevels { get; set; } - public TextureCubeMap(int Handle, SizedInternalFormat InternalFormat, int Size, int MipLevels) : base(Handle, InternalFormat) => - (this.Size, this.MipLevels) = (Size, MipLevels); - } -} diff --git a/ObjectTK.Data/Textures/TextureCubeMapArray.cs b/ObjectTK.Data/Textures/TextureCubeMapArray.cs deleted file mode 100644 index 001eb74..0000000 --- a/ObjectTK.Data/Textures/TextureCubeMapArray.cs +++ /dev/null @@ -1,10 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public sealed class TextureCubeMapArray : TextureCubeMap { - public override TextureTarget TextureTarget => TextureTarget.TextureCubeMapArray; - public int Layers { get; set; } - public TextureCubeMapArray(int Handle, SizedInternalFormat InternalFormat, int Size, int Layers, int MipLevels) : base(Handle, InternalFormat, Size, MipLevels) => - this.Layers = Layers; - } -} diff --git a/ObjectTK.Data/Textures/TextureRectangle.cs b/ObjectTK.Data/Textures/TextureRectangle.cs deleted file mode 100644 index 0641644..0000000 --- a/ObjectTK.Data/Textures/TextureRectangle.cs +++ /dev/null @@ -1,11 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public class TextureRectangle : Texture { - public override TextureTarget TextureTarget => TextureTarget.TextureRectangle; - public int Width { get; set; } - public int Height { get; set; } - public TextureRectangle(int Handle, SizedInternalFormat InternalFormat, int Width, int Height) : base(Handle, InternalFormat) => - (this.Width, this.Height) = (Width, Height); - } -} diff --git a/ObjectTK.Data/Textures/Textures.cs b/ObjectTK.Data/Textures/Textures.cs new file mode 100644 index 0000000..538bfd9 --- /dev/null +++ b/ObjectTK.Data/Textures/Textures.cs @@ -0,0 +1,124 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Textures { + public sealed class Texture1D : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture1D; + public int Width { get; set; } + public int MipLevels { get; set; } + public Texture1D(int Handle, SizedInternalFormat InternalFormat, int Width, int MipLevels) => + (this.Handle, this.InternalFormat, this.Width, this.MipLevels) = (Handle, InternalFormat, Width, MipLevels); + } + + public sealed class Texture2D : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture2D; + public int Width { get; set; } + public int Height { get; set; } + public int MipLevels { get; set; } + public Texture2D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels) => + (this.Handle, this.InternalFormat, this.Width, this.Height, this.MipLevels) = (Handle, InternalFormat, Width, Height, MipLevels); + } + + public sealed class Texture1DArray : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture1DArray; + public int Width { get; set; } + public int Layers { get; set; } + public int MipLevels { get; set; } + public Texture1DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Layers, int MipLevels) => + (this.Handle, this.InternalFormat, this.Width, this.Layers, this.MipLevels) = (Handle, InternalFormat, Width, Layers, MipLevels); + } + + public sealed class Texture2DArray : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture2DArray; + public int Width { get; set; } + public int Height { get; set; } + public int Layers { get; set; } + public int MipLevels { get; set; } + public Texture2DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) => + (this.Handle, this.InternalFormat, this.Width, this.Height, this.Layers, this.MipLevels) = (Handle, InternalFormat, Width, Height, Layers, MipLevels); + } + + public sealed class Texture2DMultisample : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture2DMultisample; + public int Width { get; set; } + public int Height { get; set; } + public int Samples { get; set; } + public bool FixedSampleLocations { get; set; } + public Texture2DMultisample(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) => + (this.Handle, this.InternalFormat, this.Width, this.Height, this.Samples, this.FixedSampleLocations) = (Handle, InternalFormat, Width, Height, Samples, FixedSampleLocations); + } + + public sealed class Texture2DMultisampleArray : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture2DMultisampleArray; + public int Width { get; set; } + public int Height { get; set; } + public int Samples { get; set; } + public bool FixedSampleLocations { get; set; } + public int Layers { get; set; } + public Texture2DMultisampleArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int Samples, bool FixedSampleLocations) => + (this.Handle, this.InternalFormat, this.Width, this.Height, this.Layers, this.Samples, this.FixedSampleLocations) = (Handle, InternalFormat, Width, Height, Layers, Samples, FixedSampleLocations); + } + + public sealed class TextureRectangle : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.TextureRectangle; + public int Width { get; set; } + public int Height { get; set; } + public TextureRectangle(int Handle, SizedInternalFormat InternalFormat, int Width, int Height) => + (this.Handle, this.InternalFormat, this.Width, this.Height) = (Handle, InternalFormat, Width, Height); + } + + public sealed class TextureCubeMap : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.TextureCubeMap; + public int Size { get; set; } + public int MipLevels { get; set; } + public TextureCubeMap(int Handle, SizedInternalFormat InternalFormat, int Size, int MipLevels) => + (this.Handle, this.InternalFormat, this.Size, this.MipLevels) = (Handle, InternalFormat, Size, MipLevels); + } + + public sealed class TextureCubeMapArray : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.TextureCubeMapArray; + public int Size { get; set; } + public int Layers { get; set; } + public int MipLevels { get; set; } + public TextureCubeMapArray(int Handle, SizedInternalFormat InternalFormat, int Size, int Layers, int MipLevels) => + (this.Handle, this.InternalFormat, this.Size, this.Layers, this.MipLevels) = (Handle, InternalFormat, Size, Layers, MipLevels); + } + + public sealed class TextureBuffer : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.TextureBuffer; + //TODO: I don't know much about this texture type + public TextureBuffer(int Handle, SizedInternalFormat InternalFormat) => + (this.Handle, this.InternalFormat) = (Handle, InternalFormat); + } + + public sealed class Texture3D : ITexture { + public int Handle { get; } + public SizedInternalFormat InternalFormat { get; set; } + public TextureTarget TextureTarget => TextureTarget.Texture3D; + public int Width { get; set; } + public int Height { get; set; } + public int Layers { get; set; } + public int MipLevels { get; set; } + public Texture3D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) => + (this.Handle, this.InternalFormat, this.Width, this.Height, this.Layers, this.MipLevels) = (Handle, InternalFormat, Width, Height, Layers, MipLevels); + } +} \ No newline at end of file From dfa59b14a8385080bb9858815e6f21a1499ff14b Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Sun, 18 Oct 2020 10:17:44 -0400 Subject: [PATCH 05/52] refactor textures --- ObjectTK.Data/Textures/ITexture.cs | 9 -- ObjectTK.Data/Textures/Textures.cs | 127 ++++++++++++++++++++++++----- 2 files changed, 105 insertions(+), 31 deletions(-) delete mode 100644 ObjectTK.Data/Textures/ITexture.cs diff --git a/ObjectTK.Data/Textures/ITexture.cs b/ObjectTK.Data/Textures/ITexture.cs deleted file mode 100644 index bd4cd28..0000000 --- a/ObjectTK.Data/Textures/ITexture.cs +++ /dev/null @@ -1,9 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Textures { - public interface ITexture { - public int Handle { get; } - TextureTarget TextureTarget { get; } - SizedInternalFormat InternalFormat { get; set; } - } -} diff --git a/ObjectTK.Data/Textures/Textures.cs b/ObjectTK.Data/Textures/Textures.cs index 538bfd9..a5e2528 100644 --- a/ObjectTK.Data/Textures/Textures.cs +++ b/ObjectTK.Data/Textures/Textures.cs @@ -1,64 +1,109 @@ using OpenTK.Graphics.OpenGL; namespace ObjectTK.Data.Textures { + public interface ITexture { + int Handle { get; } + string Name { get; set; } + TextureTarget TextureTarget { get; } + SizedInternalFormat InternalFormat { get; set; } + } + public sealed class Texture1D : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture1D; public int Width { get; set; } public int MipLevels { get; set; } - public Texture1D(int Handle, SizedInternalFormat InternalFormat, int Width, int MipLevels) => - (this.Handle, this.InternalFormat, this.Width, this.MipLevels) = (Handle, InternalFormat, Width, MipLevels); + public Texture1D(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.MipLevels = MipLevels; + } + } public sealed class Texture2D : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2D; public int Width { get; set; } public int Height { get; set; } public int MipLevels { get; set; } - public Texture2D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels) => - (this.Handle, this.InternalFormat, this.Width, this.Height, this.MipLevels) = (Handle, InternalFormat, Width, Height, MipLevels); + public Texture2D(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Height = Height; + this.MipLevels = MipLevels; + } } public sealed class Texture1DArray : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture1DArray; public int Width { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture1DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Layers, int MipLevels) => - (this.Handle, this.InternalFormat, this.Width, this.Layers, this.MipLevels) = (Handle, InternalFormat, Width, Layers, MipLevels); + public Texture1DArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Layers, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Layers = Layers; + this.MipLevels = MipLevels; + } } public sealed class Texture2DArray : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2DArray; public int Width { get; set; } public int Height { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture2DArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) => - (this.Handle, this.InternalFormat, this.Width, this.Height, this.Layers, this.MipLevels) = (Handle, InternalFormat, Width, Height, Layers, MipLevels); + public Texture2DArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Height = Height; + this.Layers = Layers; + this.MipLevels = MipLevels; + } } public sealed class Texture2DMultisample : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2DMultisample; public int Width { get; set; } public int Height { get; set; } public int Samples { get; set; } public bool FixedSampleLocations { get; set; } - public Texture2DMultisample(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) => - (this.Handle, this.InternalFormat, this.Width, this.Height, this.Samples, this.FixedSampleLocations) = (Handle, InternalFormat, Width, Height, Samples, FixedSampleLocations); + public Texture2DMultisample(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Height = Height; + this.Samples = Samples; + this.FixedSampleLocations = FixedSampleLocations; + } } public sealed class Texture2DMultisampleArray : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2DMultisampleArray; public int Width { get; set; } @@ -66,59 +111,97 @@ public sealed class Texture2DMultisampleArray : ITexture { public int Samples { get; set; } public bool FixedSampleLocations { get; set; } public int Layers { get; set; } - public Texture2DMultisampleArray(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int Samples, bool FixedSampleLocations) => - (this.Handle, this.InternalFormat, this.Width, this.Height, this.Layers, this.Samples, this.FixedSampleLocations) = (Handle, InternalFormat, Width, Height, Layers, Samples, FixedSampleLocations); + public Texture2DMultisampleArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int Samples, bool FixedSampleLocations) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Height = Height; + this.Layers = Layers; + this.Samples = Samples; + this.FixedSampleLocations = FixedSampleLocations; + } } public sealed class TextureRectangle : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureRectangle; public int Width { get; set; } public int Height { get; set; } - public TextureRectangle(int Handle, SizedInternalFormat InternalFormat, int Width, int Height) => - (this.Handle, this.InternalFormat, this.Width, this.Height) = (Handle, InternalFormat, Width, Height); + public TextureRectangle(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Height = Height; + } } public sealed class TextureCubeMap : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureCubeMap; public int Size { get; set; } public int MipLevels { get; set; } - public TextureCubeMap(int Handle, SizedInternalFormat InternalFormat, int Size, int MipLevels) => - (this.Handle, this.InternalFormat, this.Size, this.MipLevels) = (Handle, InternalFormat, Size, MipLevels); + public TextureCubeMap(int Handle, string Name, SizedInternalFormat InternalFormat, int Size, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Size = Size; + this.MipLevels = MipLevels; + } } public sealed class TextureCubeMapArray : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureCubeMapArray; public int Size { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public TextureCubeMapArray(int Handle, SizedInternalFormat InternalFormat, int Size, int Layers, int MipLevels) => - (this.Handle, this.InternalFormat, this.Size, this.Layers, this.MipLevels) = (Handle, InternalFormat, Size, Layers, MipLevels); + public TextureCubeMapArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Size, int Layers, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Size = Size; + this.Layers = Layers; + this.MipLevels = MipLevels; + } } public sealed class TextureBuffer : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureBuffer; //TODO: I don't know much about this texture type - public TextureBuffer(int Handle, SizedInternalFormat InternalFormat) => - (this.Handle, this.InternalFormat) = (Handle, InternalFormat); + public TextureBuffer(int Handle, string Name, SizedInternalFormat InternalFormat) { + this.Handle = Handle; + this.InternalFormat = InternalFormat; + } } public sealed class Texture3D : ITexture { public int Handle { get; } + public string Name { get; set; } public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture3D; public int Width { get; set; } public int Height { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture3D(int Handle, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) => - (this.Handle, this.InternalFormat, this.Width, this.Height, this.Layers, this.MipLevels) = (Handle, InternalFormat, Width, Height, Layers, MipLevels); + public Texture3D(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { + this.Handle = Handle; + this.Name = Name; + this.InternalFormat = InternalFormat; + this.Width = Width; + this.Height = Height; + this.Layers = Layers; + this.MipLevels = MipLevels; + } } } \ No newline at end of file From 35c3b3cd56f00018a09cd8625bd83e25ffea05cf Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Mon, 19 Oct 2020 22:18:56 -0400 Subject: [PATCH 06/52] Adding a few things for the first example --- ObjectTK.Tools/CameraWindow.cs | 41 ++++++++++ ObjectTK.Tools/Cameras/Camera.cs | 59 ++++++++++++++ .../Cameras/CameraProjectionType.cs | 10 +++ ObjectTK.Tools/FrameTimer.cs | 81 +++++++++++++++++++ ObjectTK.Tools/Mathematics/Ray.cs | 9 +++ ObjectTK.Tools/ObjectTK.Tools.csproj | 7 ++ ObjectTK.sln | 6 ++ 7 files changed, 213 insertions(+) create mode 100644 ObjectTK.Tools/CameraWindow.cs create mode 100644 ObjectTK.Tools/Cameras/Camera.cs create mode 100644 ObjectTK.Tools/Cameras/CameraProjectionType.cs create mode 100644 ObjectTK.Tools/FrameTimer.cs create mode 100644 ObjectTK.Tools/Mathematics/Ray.cs create mode 100644 ObjectTK.Tools/ObjectTK.Tools.csproj diff --git a/ObjectTK.Tools/CameraWindow.cs b/ObjectTK.Tools/CameraWindow.cs new file mode 100644 index 0000000..6f1bd9f --- /dev/null +++ b/ObjectTK.Tools/CameraWindow.cs @@ -0,0 +1,41 @@ +using System; + +namespace ObjectTK.Tools { + using ObjectTK.Tools.Cameras; + using OpenTK.Mathematics; + using OpenTK.Windowing.Common; + using OpenTK.Windowing.Desktop; + + public abstract class CameraWindow : GameWindow { + + protected readonly FrameTimer FrameTimer; + + + private Camera _ActiveCamera = new Camera(); + protected Camera ActiveCamera { + get { + return _ActiveCamera; + } + set { + _ActiveCamera = value; + _ActiveCamera.Viewport = new Box2i(Vector2i.Zero, Size); + } + } + + protected CameraWindow(int width, int height, string title) + : base(new GameWindowSettings { }, new NativeWindowSettings { Size = new Vector2i(width, height), Title = title }) { + FrameTimer = new FrameTimer(); + } + + protected override void OnResize(ResizeEventArgs resizeEventArgs) { + base.OnResize(resizeEventArgs); + _ActiveCamera.Viewport = new Box2i(Vector2i.Zero, Size); + } + + protected override void OnUpdateFrame(FrameEventArgs frameEventArgs) { + base.OnUpdateFrame(frameEventArgs); + FrameTimer.Time(); + } + + } +} \ No newline at end of file diff --git a/ObjectTK.Tools/Cameras/Camera.cs b/ObjectTK.Tools/Cameras/Camera.cs new file mode 100644 index 0000000..e6ecd09 --- /dev/null +++ b/ObjectTK.Tools/Cameras/Camera.cs @@ -0,0 +1,59 @@ +using ObjectTK.Tools.Mathematics; +using OpenTK.Mathematics; + +namespace ObjectTK.Tools.Cameras { + public class Camera { + public Vector3 Position { get; set; } = Vector3.Zero; + public Quaternion Rotation { get; set; } = Quaternion.Identity; + public Vector3 Forward => Vector3.Transform(Vector3.UnitZ, Rotation).Normalized(); + public Vector3 Up => Vector3.Transform(Vector3.UnitY, Rotation).Normalized(); + public Vector3 Right => Vector3.Cross(Forward, Up); + public float PerspectiveFieldOfView { get; set; } = MathHelper.PiOver2; + public float AspectRatio => Viewport.Size.X / (float)Viewport.Size.Y; + public Matrix4 ViewMatrix => Matrix4.LookAt(Position, Position + Forward, Up); + + public CameraProjectionType CameraProjectionType { get; set; } = CameraProjectionType.Perspective; + public Matrix4 ProjectionMatrix => CameraProjectionType switch + { + CameraProjectionType.Perspective => Matrix4.CreatePerspectiveFieldOfView(PerspectiveFieldOfView, AspectRatio, NearClippingPlaneDistance, FarClippingPlaneDistance), + CameraProjectionType.Orthographic => Matrix4.CreateOrthographic(OrthographicVerticalSize * AspectRatio, OrthographicVerticalSize, NearClippingPlaneDistance, FarClippingPlaneDistance), + _ => Matrix4.CreatePerspectiveFieldOfView(PerspectiveFieldOfView, AspectRatio, NearClippingPlaneDistance, FarClippingPlaneDistance) + }; + + public Matrix4 ViewProjectionMatrix => ViewMatrix * ProjectionMatrix; + public Box2i Viewport { get; set; } + public float OrthographicVerticalSize { get; set; } = 5.0f; + public float NearClippingPlaneDistance { get; set; } = 0.1f; + public float FarClippingPlaneDistance { get; set; } = 1000.0f; + + public Ray GetPickingRay(Vector2 MousePosition) { + + Matrix4 UnViewProjectionMatrix = Matrix4.Invert(ViewProjectionMatrix); + + Vector3 Near = Vector3.Unproject( + new Vector3(MousePosition.X, Viewport.Size.Y - MousePosition.Y, NearClippingPlaneDistance), + Viewport.Min.X, + Viewport.Min.Y, + Viewport.Size.X, + Viewport.Size.Y, + NearClippingPlaneDistance, + FarClippingPlaneDistance, + UnViewProjectionMatrix); + + Vector3 Far = Vector3.Unproject( + new Vector3(MousePosition.X, Viewport.Size.Y - MousePosition.Y, FarClippingPlaneDistance), + Viewport.Min.X, + Viewport.Min.Y, + Viewport.Size.X, + Viewport.Size.Y, + NearClippingPlaneDistance, + FarClippingPlaneDistance, + UnViewProjectionMatrix); + + Vector3 Direction = (Far - Near).Normalized(); + + return new Ray { Origin = Position, Direction = Direction, Length = 1.0f }; + } + + } +} diff --git a/ObjectTK.Tools/Cameras/CameraProjectionType.cs b/ObjectTK.Tools/Cameras/CameraProjectionType.cs new file mode 100644 index 0000000..345b56b --- /dev/null +++ b/ObjectTK.Tools/Cameras/CameraProjectionType.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ObjectTK.Tools.Cameras { + public enum CameraProjectionType { + Perspective, + Orthographic + } +} diff --git a/ObjectTK.Tools/FrameTimer.cs b/ObjectTK.Tools/FrameTimer.cs new file mode 100644 index 0000000..a8f36b2 --- /dev/null +++ b/ObjectTK.Tools/FrameTimer.cs @@ -0,0 +1,81 @@ +using System.Diagnostics; + +namespace ObjectTK.Tools { + public class FrameTimer { + /// <summary> + /// Total number of frames rendered. + /// </summary> + public int FramesRendered { get; private set; } + + /// <summary> + /// Time spent for the last completed frame in milliseconds. + /// </summary> + public double FrameTime { get; private set; } + + /// <summary> + /// Frames per second calculated from the time spent on the last frame. + /// </summary> + public double FpsBasedOnFrameTime { get; private set; } + + /// <summary> + /// Frames per second calculated from the number of frames completed within the last second. + /// </summary> + public double FpsBasedOnFramesRendered { get; private set; } + + /// <summary> + /// Total time running in milliseconds. + /// </summary> + public double TimeRunning { get; protected set; } + + private readonly Stopwatch _stopwatch; + private double _elapsed; + private int _fpsFrameCounter; + + private double _lastIntermediateTime; + + /// <summary> + /// Initializes a new instance of the FrameTimer class. + /// </summary> + public FrameTimer() { + _stopwatch = new Stopwatch(); + //Application.Idle += (sender, args) => Time(); + _stopwatch.Start(); + } + + /// <summary> + /// Calculates timings based on the intervals between subsequent calls. Call once each frame.<br/> + /// Determines frames per seconds and other statistics. + /// </summary> + public void Time() { + // retrieve time spent since last frame + FrameTime = _stopwatch.Elapsed.TotalMilliseconds; + _stopwatch.Restart(); + // count time running + TimeRunning += FrameTime; + // calculate fps based on time spent on one frame + FpsBasedOnFrameTime = (int)(1000 / FrameTime); + // calculate fps based on frames rendered during one second + _elapsed += FrameTime; + _fpsFrameCounter++; + if (_elapsed > 1000) { + _elapsed -= 1000; + FpsBasedOnFramesRendered = _fpsFrameCounter; + _fpsFrameCounter = 0; + } + // count frames rendered + FramesRendered++; + // reset intermediate timings + _lastIntermediateTime = 0; + } + + /// <summary> + /// Calculates the interval between two subsequent calls in milliseconds. + /// </summary> + public double IntermediateTiming() { + var elapsed = _stopwatch.Elapsed.TotalMilliseconds; + var time = elapsed - _lastIntermediateTime; + _lastIntermediateTime = elapsed; + return time; + } + } +} diff --git a/ObjectTK.Tools/Mathematics/Ray.cs b/ObjectTK.Tools/Mathematics/Ray.cs new file mode 100644 index 0000000..8cdf63a --- /dev/null +++ b/ObjectTK.Tools/Mathematics/Ray.cs @@ -0,0 +1,9 @@ +using OpenTK.Mathematics; + +namespace ObjectTK.Tools.Mathematics { + public class Ray { + public Vector3 Origin { get; set; } + public Vector3 Direction { get; set; } + public float Length { get; set; } + } +} diff --git a/ObjectTK.Tools/ObjectTK.Tools.csproj b/ObjectTK.Tools/ObjectTK.Tools.csproj new file mode 100644 index 0000000..cb63190 --- /dev/null +++ b/ObjectTK.Tools/ObjectTK.Tools.csproj @@ -0,0 +1,7 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netcoreapp3.1</TargetFramework> + </PropertyGroup> + +</Project> diff --git a/ObjectTK.sln b/ObjectTK.sln index 90e8162..033df80 100644 --- a/ObjectTK.sln +++ b/ObjectTK.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "ObjectTK.Tools\ObjectTK.Tools.csproj", "{B5DCB84E-3E09-4F37-B06E-68565756624F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {163450BD-24E0-4C3E-A310-3AEBD709E065}.Debug|Any CPU.Build.0 = Debug|Any CPU {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.ActiveCfg = Release|Any CPU {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.Build.0 = Release|Any CPU + {B5DCB84E-3E09-4F37-B06E-68565756624F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5DCB84E-3E09-4F37-B06E-68565756624F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5DCB84E-3E09-4F37-B06E-68565756624F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5DCB84E-3E09-4F37-B06E-68565756624F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 84f021b3dbdac4ef200b87a1f34d20a434f2509a Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Mon, 19 Oct 2020 23:21:16 -0400 Subject: [PATCH 07/52] Add enough to get a hello triangle example working still needs a buffer data object but pretty close --- Examples/Entry.cs | 47 +++++++++ Examples/ExampleProjectAttribute.cs | 11 +++ Examples/ExampleWindow.cs | 69 +++++++++++++ Examples/Examples.csproj | 14 +++ Examples/Examples/HelloTriangle.cs | 110 +++++++++++++++++++++ ObjectTK.Data/Buffers/VertexArray.cs | 8 ++ ObjectTK.Data/ObjectTK.Data.csproj | 8 +- ObjectTK.Data/Shaders/Program.cs | 18 ++++ ObjectTK.Data/Shaders/Shaders.cs | 28 ++++++ ObjectTK.Data/Variables/ProgramVariable.cs | 11 +++ ObjectTK.Data/Variables/Uniform.cs | 6 ++ ObjectTK.Data/Variables/VertexAttrib.cs | 10 ++ ObjectTK.Tools/ObjectTK.Tools.csproj | 4 + ObjectTK.sln | 7 ++ 14 files changed, 345 insertions(+), 6 deletions(-) create mode 100644 Examples/Entry.cs create mode 100644 Examples/ExampleProjectAttribute.cs create mode 100644 Examples/ExampleWindow.cs create mode 100644 Examples/Examples.csproj create mode 100644 Examples/Examples/HelloTriangle.cs create mode 100644 ObjectTK.Data/Buffers/VertexArray.cs create mode 100644 ObjectTK.Data/Shaders/Program.cs create mode 100644 ObjectTK.Data/Shaders/Shaders.cs create mode 100644 ObjectTK.Data/Variables/ProgramVariable.cs create mode 100644 ObjectTK.Data/Variables/Uniform.cs create mode 100644 ObjectTK.Data/Variables/VertexAttrib.cs diff --git a/Examples/Entry.cs b/Examples/Entry.cs new file mode 100644 index 0000000..c203a1b --- /dev/null +++ b/Examples/Entry.cs @@ -0,0 +1,47 @@ +using OpenTK.Windowing.Desktop; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Examples { + class Entry { + static void Main(string[] args) { + + var Examples = Assembly.GetExecutingAssembly().GetTypes() + .Where(_ => _ != typeof(ExampleWindow) && typeof(ExampleWindow).IsAssignableFrom(_)) + .Select(Type => + new { + Caption = Type.GetCustomAttributes<ExampleProjectAttribute>(false).FirstOrDefault()?.Caption ?? nameof(Type), + Type = Type + }).ToArray(); + + while (PromptForExample(out Type Example)) { + using (var ExampleWindow = (GameWindow)Activator.CreateInstance(Example)) { + ExampleWindow.Run(); + } + } + + bool PromptForExample(out Type Example) { + Example = null; + int Count = 1; + Console.WriteLine("Select example: "); + + foreach (var Pair in Examples) { + Console.WriteLine($"{Count++} - {Pair.Caption}"); + } + + string input = Console.ReadLine(); + if (int.TryParse(input, out int Selection) && Selection - 1 >= 0 && Selection - 1 < Examples.Length) { + Example = Examples[Selection - 1].Type; + return true; + } + + return false; + } + + + } + + } +} diff --git a/Examples/ExampleProjectAttribute.cs b/Examples/ExampleProjectAttribute.cs new file mode 100644 index 0000000..db196d5 --- /dev/null +++ b/Examples/ExampleProjectAttribute.cs @@ -0,0 +1,11 @@ +using System; + +namespace Examples { + [AttributeUsage(AttributeTargets.Class)] + public class ExampleProjectAttribute : Attribute { + public readonly string Caption; + public ExampleProjectAttribute(string Caption) { + this.Caption = Caption; + } + } +} diff --git a/Examples/ExampleWindow.cs b/Examples/ExampleWindow.cs new file mode 100644 index 0000000..22f0c91 --- /dev/null +++ b/Examples/ExampleWindow.cs @@ -0,0 +1,69 @@ +using ObjectTK.Tools; +using OpenTK.Mathematics; +using OpenTK.Windowing.Common; +using OpenTK.Windowing.Desktop; +using OpenTK.Windowing.GraphicsLibraryFramework; +using System; + +namespace Examples { + public class ExampleWindow : CameraWindow { + private string OriginalTitle { get; set; } + + private float CameraPitch { get; set; } = 0; + private float CameraYaw { get; set; } = (float)Math.PI; + + public ExampleWindow() : base(800, 600, "ExampleWindow") { + + } + + protected override void OnLoad() { + base.OnLoad(); + // maximize window + WindowState = WindowState.Maximized; + // remember original title + OriginalTitle = Title; + + ActiveCamera.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, CameraYaw) * Quaternion.FromAxisAngle(Vector3.UnitX, CameraPitch); + + } + + protected override void OnRenderFrame(FrameEventArgs e) { + base.OnRenderFrame(e); + // display FPS in the window title + Title = string.Format("ObjectTK example: {0} - FPS {1}", OriginalTitle, FrameTimer.FpsBasedOnFramesRendered); + } + + protected override void OnUpdateFrame(FrameEventArgs e) { + base.OnUpdateFrame(e); + HandleCameraInput((float)e.Time); + } + + private void HandleCameraInput(float DeltaSeconds) { + Vector3 Direction = Vector3.Zero; + if (KeyboardState.IsKeyDown(Keys.W)) Direction += ActiveCamera.Forward; + if (KeyboardState.IsKeyDown(Keys.S)) Direction -= ActiveCamera.Forward; + if (KeyboardState.IsKeyDown(Keys.D)) Direction += ActiveCamera.Right; + if (KeyboardState.IsKeyDown(Keys.A)) Direction -= ActiveCamera.Right; + if (KeyboardState.IsKeyDown(Keys.Space)) Direction += ActiveCamera.Up; + if (KeyboardState.IsKeyDown(Keys.LeftControl)) Direction -= ActiveCamera.Up; + if (Direction.LengthSquared > 0) ActiveCamera.Position += Direction.Normalized() * DeltaSeconds; + } + + protected override void OnKeyDown(KeyboardKeyEventArgs e) { + base.OnKeyDown(e); + if (e.Key == Keys.Escape) Close(); + } + + + protected override void OnMouseMove(MouseMoveEventArgs e) { + base.OnMouseMove(e); + if (MouseState.IsButtonDown(MouseButton.Button2)) { + CameraPitch -= e.DeltaY * 0.005f; + CameraPitch = Math.Clamp(CameraPitch, -MathHelper.PiOver2, MathHelper.PiOver2); + CameraYaw += e.DeltaX * 0.005f; + ActiveCamera.Rotation = Quaternion.FromAxisAngle(-Vector3.UnitY, CameraYaw) * Quaternion.FromAxisAngle(-Vector3.UnitX, CameraPitch); + } + } + + } +} \ No newline at end of file diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj new file mode 100644 index 0000000..6154fb4 --- /dev/null +++ b/Examples/Examples.csproj @@ -0,0 +1,14 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\ObjectTK.Data\ObjectTK.Data.csproj" /> + <ProjectReference Include="..\ObjectTK.Extensions\ObjectTK.Extensions.csproj" /> + <ProjectReference Include="..\ObjectTK.Tools\ObjectTK.Tools.csproj" /> + </ItemGroup> + +</Project> diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs new file mode 100644 index 0000000..8f21433 --- /dev/null +++ b/Examples/Examples/HelloTriangle.cs @@ -0,0 +1,110 @@ + +using System; +using System.Drawing; +using ObjectTK.Data.Buffers; +using ObjectTK.Data.Shaders; +using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; +using OpenTK.Windowing.Common; + +namespace Examples.Examples { + + [ExampleProject("Hello Triangle")] + public class HelloTriangle : ExampleWindow { + + private Program ShaderProgram; + private int VBOHandle; + private VertexArray VAO; + + private readonly string VertSource = @" + #version 330 core + + uniform mat4 ModelViewProjectionMatrix; + layout(location = 0) in vec3 InPosition; + + void main(void) { + gl_Position = ModelViewProjectionMatrix * vec4(InPosition, 1.0); + } + "; + private readonly string FragSource = @" + #version 330 + + out vec4 FragColor; + + void main() + { + FragColor = vec4(1); + } + "; + + protected override void OnLoad() { + base.OnLoad(); + + VertexShader VertexShader = new VertexShader(GL.CreateShader(ShaderType.VertexShader), null); + FragmentShader FragmentShader = new FragmentShader(GL.CreateShader(ShaderType.FragmentShader), null); + + GL.ShaderSource(VertexShader.Handle, VertSource); + GL.ShaderSource(FragmentShader.Handle, FragSource); + GL.CompileShader(VertexShader.Handle); + GL.CompileShader(FragmentShader.Handle); + + ShaderProgram = new Program(GL.CreateProgram(), VertexShader, FragmentShader); + + GL.AttachShader(ShaderProgram.Handle, VertexShader.Handle); + GL.AttachShader(ShaderProgram.Handle, FragmentShader.Handle); + + GL.LinkProgram(ShaderProgram.Handle); + + GL.DetachShader(ShaderProgram.Handle, VertexShader.Handle); + GL.DetachShader(ShaderProgram.Handle, FragmentShader.Handle); + GL.DeleteShader(VertexShader.Handle); + GL.DeleteShader(FragmentShader.Handle); + + GL.UseProgram(ShaderProgram.Handle); + + GL.GetProgram(ShaderProgram.Handle, GetProgramParameterName.LinkStatus, out var code); + if (code != (int)All.True) { + throw new Exception($"Error occurred whilst linking Program({ShaderProgram.Handle})"); + } + + + var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; + + VBOHandle = GL.GenBuffer(); + GL.BindBuffer(BufferTarget.ArrayBuffer, VBOHandle); + GL.BufferData(BufferTarget.ArrayBuffer, Vertices.Length * sizeof(float) * 3, Vertices, BufferUsageHint.StaticDraw); + + + VAO = new VertexArray(GL.GenVertexArray()); + GL.BindVertexArray(VAO.Handle); + GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); + GL.EnableVertexAttribArray(0); + GL.BindBuffer(BufferTarget.ArrayBuffer, VBOHandle); + + ActiveCamera.Position = new Vector3(0, 0, 3); + + GL.ClearColor(Color.MidnightBlue); + } + + private void OnUnload(object sender, EventArgs e) { + base.OnUnload(); + + GL.DeleteProgram(ShaderProgram.Handle); + GL.DeleteVertexArray(VAO.Handle); + GL.DeleteBuffer(VBOHandle); + } + + protected override void OnRenderFrame(FrameEventArgs e) { + base.OnRenderFrame(e); + GL.Viewport(0, 0, Size.X, Size.Y); + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + + Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; + GL.UniformMatrix4(0, false, ref MVPMatrix); + + GL.DrawArrays(PrimitiveType.Triangles, 0, 3); + + SwapBuffers(); + } + } +} diff --git a/ObjectTK.Data/Buffers/VertexArray.cs b/ObjectTK.Data/Buffers/VertexArray.cs new file mode 100644 index 0000000..8a6be7b --- /dev/null +++ b/ObjectTK.Data/Buffers/VertexArray.cs @@ -0,0 +1,8 @@ +namespace ObjectTK.Data.Buffers { + public class VertexArray { + public int Handle { get; } + public VertexArray(int Handle) { + this.Handle = Handle; + } + } +} diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Data/ObjectTK.Data.csproj index 848df19..f887b41 100644 --- a/ObjectTK.Data/ObjectTK.Data.csproj +++ b/ObjectTK.Data/ObjectTK.Data.csproj @@ -1,15 +1,11 @@ -<Project Sdk="Microsoft.NET.Sdk"> +<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> - <PackageReference Include="OpenTK" Version="4.0.2" /> - </ItemGroup> - - <ItemGroup> - <Folder Include="Uniforms\" /> + <PackageReference Include="OpenTK" Version="4.0.6" /> </ItemGroup> </Project> diff --git a/ObjectTK.Data/Shaders/Program.cs b/ObjectTK.Data/Shaders/Program.cs new file mode 100644 index 0000000..0caf57a --- /dev/null +++ b/ObjectTK.Data/Shaders/Program.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ObjectTK.Data.Shaders { + public class Program { + public int Handle { get; } + public VertexShader VertexShader { get; } + public FragmentShader FragmentShader { get; } + + public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader) { + this.Handle = Handle; + this.VertexShader = VertexShader; + this.FragmentShader = FragmentShader; + } + + } +} diff --git a/ObjectTK.Data/Shaders/Shaders.cs b/ObjectTK.Data/Shaders/Shaders.cs new file mode 100644 index 0000000..3e80640 --- /dev/null +++ b/ObjectTK.Data/Shaders/Shaders.cs @@ -0,0 +1,28 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Shaders { + public abstract class Shader { + public int Handle { get; } + public string Source { get; } + public abstract ShaderType ShaderType { get; } + + public Shader(int Handle, string Source) { + this.Handle = Handle; + this.Source = Source; + } + } + public class VertexShader : Shader { + public override ShaderType ShaderType => ShaderType.VertexShader; + public VertexShader(int Handle, string Source) : base(Handle, Source) { + + } + } + + public class FragmentShader : Shader { + public override ShaderType ShaderType => ShaderType.FragmentShader; + public FragmentShader(int Handle, string Source) : base(Handle, Source) { + + } + + } +} diff --git a/ObjectTK.Data/Variables/ProgramVariable.cs b/ObjectTK.Data/Variables/ProgramVariable.cs new file mode 100644 index 0000000..02d8e72 --- /dev/null +++ b/ObjectTK.Data/Variables/ProgramVariable.cs @@ -0,0 +1,11 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Variables { + public class ProgramVariable { + + public int ProgramHandle { get; } + public string Name { get; set; } + public bool Active { get; set; } + + } +} diff --git a/ObjectTK.Data/Variables/Uniform.cs b/ObjectTK.Data/Variables/Uniform.cs new file mode 100644 index 0000000..87f8713 --- /dev/null +++ b/ObjectTK.Data/Variables/Uniform.cs @@ -0,0 +1,6 @@ + +namespace ObjectTK.Data.Variables { + public class Uniform<T> : ProgramVariable { + public int Location { get; set; } + } +} diff --git a/ObjectTK.Data/Variables/VertexAttrib.cs b/ObjectTK.Data/Variables/VertexAttrib.cs new file mode 100644 index 0000000..f332574 --- /dev/null +++ b/ObjectTK.Data/Variables/VertexAttrib.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ObjectTK.Data.Variables { + public class VertexAttrib { + + + } +} diff --git a/ObjectTK.Tools/ObjectTK.Tools.csproj b/ObjectTK.Tools/ObjectTK.Tools.csproj index cb63190..aa08c94 100644 --- a/ObjectTK.Tools/ObjectTK.Tools.csproj +++ b/ObjectTK.Tools/ObjectTK.Tools.csproj @@ -4,4 +4,8 @@ <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> + <ItemGroup> + <PackageReference Include="OpenTK" Version="4.0.6" /> + </ItemGroup> + </Project> diff --git a/ObjectTK.sln b/ObjectTK.sln index 033df80..6f4f4df 100644 --- a/ObjectTK.sln +++ b/ObjectTK.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "Examples\Examples.csproj", "{AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "ObjectTK.Tools\ObjectTK.Tools.csproj", "{B5DCB84E-3E09-4F37-B06E-68565756624F}" EndProject @@ -17,6 +20,10 @@ Global {163450BD-24E0-4C3E-A310-3AEBD709E065}.Debug|Any CPU.Build.0 = Debug|Any CPU {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.ActiveCfg = Release|Any CPU {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.Build.0 = Release|Any CPU + {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Release|Any CPU.Build.0 = Release|Any CPU {B5DCB84E-3E09-4F37-B06E-68565756624F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B5DCB84E-3E09-4F37-B06E-68565756624F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B5DCB84E-3E09-4F37-B06E-68565756624F}.Release|Any CPU.ActiveCfg = Release|Any CPU From 4ad22c6841dca2883dced79fdcb7c5acf4a6486c Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Wed, 21 Oct 2020 08:01:58 -0400 Subject: [PATCH 08/52] commit everything idk --- Examples/Data/Shaders/BasicShader.glsl | 21 +++ Examples/Examples.csproj | 6 + .../ExtensionPrograms/BasicProgram.cs | 14 ++ Examples/Examples/HelloTriangle.cs | 103 ++++++++++---- ObjectTK.Data/Buffers/Buffer.cs | 32 +++++ ObjectTK.Data/Buffers/VertexArray.cs | 1 + ObjectTK.Data/Shaders/Program.cs | 12 +- ObjectTK.Data/Variables/ProgramVariable.cs | 11 -- ObjectTK.Data/Variables/Uniform.cs | 6 - ObjectTK.Data/Variables/UniformInfo.cs | 20 +++ ObjectTK.Data/Variables/VertexAttrib.cs | 10 -- .../Variables/VertexAttributeInfo.cs | 24 ++++ .../ObjectTK.Extensions.csproj | 11 ++ .../Shaders/ProgramExtensions.cs | 15 +++ ObjectTK.Extensions/Shaders/ProgramFactory.cs | 126 ++++++++++++++++++ .../Shaders/ShaderAttributes.cs | 32 +++++ .../Shaders/ShaderExtensions.cs | 29 ++++ .../Variables/UniformInfoExtensions.cs | 17 +++ .../VertexAttributeInfoExtensions.cs | 15 +++ ObjectTK.sln | 7 +- 20 files changed, 457 insertions(+), 55 deletions(-) create mode 100644 Examples/Data/Shaders/BasicShader.glsl create mode 100644 Examples/Examples/ExtensionPrograms/BasicProgram.cs create mode 100644 ObjectTK.Data/Buffers/Buffer.cs delete mode 100644 ObjectTK.Data/Variables/ProgramVariable.cs delete mode 100644 ObjectTK.Data/Variables/Uniform.cs create mode 100644 ObjectTK.Data/Variables/UniformInfo.cs delete mode 100644 ObjectTK.Data/Variables/VertexAttrib.cs create mode 100644 ObjectTK.Data/Variables/VertexAttributeInfo.cs create mode 100644 ObjectTK.Extensions/ObjectTK.Extensions.csproj create mode 100644 ObjectTK.Extensions/Shaders/ProgramExtensions.cs create mode 100644 ObjectTK.Extensions/Shaders/ProgramFactory.cs create mode 100644 ObjectTK.Extensions/Shaders/ShaderAttributes.cs create mode 100644 ObjectTK.Extensions/Shaders/ShaderExtensions.cs create mode 100644 ObjectTK.Extensions/Variables/UniformInfoExtensions.cs create mode 100644 ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs diff --git a/Examples/Data/Shaders/BasicShader.glsl b/Examples/Data/Shaders/BasicShader.glsl new file mode 100644 index 0000000..f415ada --- /dev/null +++ b/Examples/Data/Shaders/BasicShader.glsl @@ -0,0 +1,21 @@ +-- Version +#version 140 + +-- Vertex +#include BasicShader.Version +in vec3 InPosition; +uniform mat4 ModelViewProjectionMatrix; + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(InPosition,1); +} + +-- Fragment +#include BasicShader.Version +out vec4 FragColor; + +void main() +{ + FragColor = vec4(1); +} \ No newline at end of file diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index 6154fb4..8f2985b 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -11,4 +11,10 @@ <ProjectReference Include="..\ObjectTK.Tools\ObjectTK.Tools.csproj" /> </ItemGroup> + <ItemGroup> + <None Update="Data\Shaders\BasicShader.glsl"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + </Project> diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/Examples/Examples/ExtensionPrograms/BasicProgram.cs new file mode 100644 index 0000000..6c93974 --- /dev/null +++ b/Examples/Examples/ExtensionPrograms/BasicProgram.cs @@ -0,0 +1,14 @@ +using ObjectTK.Data.Shaders; +using ObjectTK.Extensions.Shaders; +using ObjectTK.Extensions.Variables; +using OpenTK.Mathematics; + +namespace Examples.Examples.Programs { + + [VertexShaderSource("BasicShader.Vertex")] + [FragmentShaderSource("BasicShader.Fragment")] + public class BasicProgram : ProgramVariableInfoCollection { + public VertexAttributeInfo<Vector3> InPosition { get; } + public UniformInfo<Matrix4> ModelViewProjectionMatrix { get; } + } +} diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 8f21433..2b86a41 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -1,21 +1,24 @@ using System; using System.Drawing; +using Examples.Examples.Programs; using ObjectTK.Data.Buffers; using ObjectTK.Data.Shaders; +using ObjectTK.Data.Variables; +using ObjectTK.Extensions.Shaders; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; namespace Examples.Examples { - + [ExampleProject("Hello Triangle")] public class HelloTriangle : ExampleWindow { private Program ShaderProgram; - private int VBOHandle; + private Buffer<Vector3> VBO; private VertexArray VAO; - + private readonly string VertSource = @" #version 330 core @@ -27,7 +30,7 @@ void main(void) { } "; private readonly string FragSource = @" - #version 330 + #version 330 out vec4 FragColor; @@ -48,38 +51,91 @@ protected override void OnLoad() { GL.CompileShader(VertexShader.Handle); GL.CompileShader(FragmentShader.Handle); - ShaderProgram = new Program(GL.CreateProgram(), VertexShader, FragmentShader); + int ProgramHandle = GL.CreateProgram(); - GL.AttachShader(ShaderProgram.Handle, VertexShader.Handle); - GL.AttachShader(ShaderProgram.Handle, FragmentShader.Handle); + GL.AttachShader(ProgramHandle, VertexShader.Handle); + GL.AttachShader(ProgramHandle, FragmentShader.Handle); - GL.LinkProgram(ShaderProgram.Handle); + GL.LinkProgram(ProgramHandle); - GL.DetachShader(ShaderProgram.Handle, VertexShader.Handle); - GL.DetachShader(ShaderProgram.Handle, FragmentShader.Handle); + int UniformLocation = GL.GetUniformLocation(ProgramHandle, "ModelViewProjectionMatrix"); + GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); + UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); + + ShaderProgram = new Program(ProgramHandle, VertexShader, FragmentShader, new UniformInfo[] { UI_InPosition }, new VertexAttributeInfo[] { }); + + GL.DetachShader(ProgramHandle, VertexShader.Handle); + GL.DetachShader(ProgramHandle, FragmentShader.Handle); GL.DeleteShader(VertexShader.Handle); GL.DeleteShader(FragmentShader.Handle); - GL.UseProgram(ShaderProgram.Handle); + GL.UseProgram(ProgramHandle); - GL.GetProgram(ShaderProgram.Handle, GetProgramParameterName.LinkStatus, out var code); - if (code != (int)All.True) { - throw new Exception($"Error occurred whilst linking Program({ShaderProgram.Handle})"); - } + var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; + VBO = new Buffer<Vector3>(GL.GenBuffer(), Vertices); + GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); + GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, Vertices, BufferUsageHint.StaticDraw); - var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; + VAO = new VertexArray(GL.GenVertexArray()); + GL.BindVertexArray(VAO.Handle); + GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); + GL.EnableVertexAttribArray(0); + GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); + + ActiveCamera.Position = new Vector3(0, 0, 3); + + GL.ClearColor(Color.MidnightBlue); + } + + private void OnUnload(object sender, EventArgs e) { + base.OnUnload(); + + GL.DeleteProgram(ShaderProgram.Handle); + GL.DeleteVertexArray(VAO.Handle); + GL.DeleteBuffer(VBO.Handle); + } - VBOHandle = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, VBOHandle); - GL.BufferData(BufferTarget.ArrayBuffer, Vertices.Length * sizeof(float) * 3, Vertices, BufferUsageHint.StaticDraw); + protected override void OnRenderFrame(FrameEventArgs e) { + base.OnRenderFrame(e); + GL.Viewport(0, 0, Size.X, Size.Y); + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + + Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; + GL.UniformMatrix4(ShaderProgram.ProgramVariableInfoCollection.Uniforms[0].Location, false, ref MVPMatrix); + + GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); + + SwapBuffers(); + } + } + + + [ExampleProject("Hello Triangle with extensions")] + public class HelloTriangleWithExtensions : ExampleWindow { + + private Program<BasicProgram> ShaderProgram; + private Buffer<Vector3> VBO; + private VertexArray VAO; + + protected override void OnLoad() { + base.OnLoad(); + ShaderProgram = new ProgramFactory() { BaseDirectory = "./Data/Shaders/" }.CreateProgram<BasicProgram>(); + + GL.UseProgram(ShaderProgram.Handle); + + var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; + + VBO = new Buffer<Vector3>(GL.GenBuffer(), Vertices); + GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); + GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, Vertices, BufferUsageHint.StaticDraw); VAO = new VertexArray(GL.GenVertexArray()); GL.BindVertexArray(VAO.Handle); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); GL.EnableVertexAttribArray(0); - GL.BindBuffer(BufferTarget.ArrayBuffer, VBOHandle); + GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); ActiveCamera.Position = new Vector3(0, 0, 3); @@ -91,7 +147,7 @@ private void OnUnload(object sender, EventArgs e) { GL.DeleteProgram(ShaderProgram.Handle); GL.DeleteVertexArray(VAO.Handle); - GL.DeleteBuffer(VBOHandle); + GL.DeleteBuffer(VBO.Handle); } protected override void OnRenderFrame(FrameEventArgs e) { @@ -100,9 +156,10 @@ protected override void OnRenderFrame(FrameEventArgs e) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; - GL.UniformMatrix4(0, false, ref MVPMatrix); - GL.DrawArrays(PrimitiveType.Triangles, 0, 3); + GL.UniformMatrix4(ShaderProgram.ProgramVariableInfoCollection.ModelViewProjectionMatrix.Location, false, ref MVPMatrix); + + GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); SwapBuffers(); } diff --git a/ObjectTK.Data/Buffers/Buffer.cs b/ObjectTK.Data/Buffers/Buffer.cs new file mode 100644 index 0000000..3a87f69 --- /dev/null +++ b/ObjectTK.Data/Buffers/Buffer.cs @@ -0,0 +1,32 @@ +using System.Runtime.InteropServices; + +namespace ObjectTK.Data.Buffers { + + public class Buffer { + public int Handle { get; } + public int ElementSize { get; } + private int _ElementCount { get; set; } + public virtual int ElementCount { + get { + return _ElementCount; + } + set { + _ElementCount = value; + } + } + + public Buffer(int Handle, int ElementSize, int ElementCount) { + this.Handle = Handle; + this.ElementSize = ElementSize; + this.ElementCount = ElementCount; + } + } + + public class Buffer<T> : Buffer where T : struct { + public T[] Elements { get; set; } + public override int ElementCount { get => Elements.Length; set { } } + public Buffer(int Handle, T[] Elements) : base(Handle, Marshal.SizeOf(typeof(T)), 0) { + this.Elements = Elements; + } + } +} diff --git a/ObjectTK.Data/Buffers/VertexArray.cs b/ObjectTK.Data/Buffers/VertexArray.cs index 8a6be7b..4174f52 100644 --- a/ObjectTK.Data/Buffers/VertexArray.cs +++ b/ObjectTK.Data/Buffers/VertexArray.cs @@ -1,6 +1,7 @@ namespace ObjectTK.Data.Buffers { public class VertexArray { public int Handle { get; } + public VertexArray(int Handle) { this.Handle = Handle; } diff --git a/ObjectTK.Data/Shaders/Program.cs b/ObjectTK.Data/Shaders/Program.cs index 0caf57a..ce269b0 100644 --- a/ObjectTK.Data/Shaders/Program.cs +++ b/ObjectTK.Data/Shaders/Program.cs @@ -1,18 +1,22 @@ -using System; +using ObjectTK.Data.Variables; using System.Collections.Generic; -using System.Text; +using System.Collections.Immutable; namespace ObjectTK.Data.Shaders { + public class Program { public int Handle { get; } public VertexShader VertexShader { get; } public FragmentShader FragmentShader { get; } + public Dictionary<string, UniformInfo> Uniforms { get; set; } + public Dictionary<string, VertexAttributeInfo> VertexAttributes { get; set; } - public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader) { + public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) { this.Handle = Handle; this.VertexShader = VertexShader; this.FragmentShader = FragmentShader; + this.Uniforms = Uniforms; + this.VertexAttributes = VertexAttributes; } - } } diff --git a/ObjectTK.Data/Variables/ProgramVariable.cs b/ObjectTK.Data/Variables/ProgramVariable.cs deleted file mode 100644 index 02d8e72..0000000 --- a/ObjectTK.Data/Variables/ProgramVariable.cs +++ /dev/null @@ -1,11 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Variables { - public class ProgramVariable { - - public int ProgramHandle { get; } - public string Name { get; set; } - public bool Active { get; set; } - - } -} diff --git a/ObjectTK.Data/Variables/Uniform.cs b/ObjectTK.Data/Variables/Uniform.cs deleted file mode 100644 index 87f8713..0000000 --- a/ObjectTK.Data/Variables/Uniform.cs +++ /dev/null @@ -1,6 +0,0 @@ - -namespace ObjectTK.Data.Variables { - public class Uniform<T> : ProgramVariable { - public int Location { get; set; } - } -} diff --git a/ObjectTK.Data/Variables/UniformInfo.cs b/ObjectTK.Data/Variables/UniformInfo.cs new file mode 100644 index 0000000..0284008 --- /dev/null +++ b/ObjectTK.Data/Variables/UniformInfo.cs @@ -0,0 +1,20 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Variables { + public class UniformInfo { + public int ProgramHandle { get; } + public string Name { get; set; } + public bool Active { get; set; } + public int Location { get; } + public int Size { get; } + public ActiveUniformType Type { get; } + public UniformInfo(int ProgramHandle, string Name, int Location, int UniformSize, ActiveUniformType UniformType, bool Active) { + this.ProgramHandle = ProgramHandle; + this.Name = Name; + this.Active = Active; + this.Location = Location; + this.Size = UniformSize; + this.Type = UniformType; + } + } +} diff --git a/ObjectTK.Data/Variables/VertexAttrib.cs b/ObjectTK.Data/Variables/VertexAttrib.cs deleted file mode 100644 index f332574..0000000 --- a/ObjectTK.Data/Variables/VertexAttrib.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ObjectTK.Data.Variables { - public class VertexAttrib { - - - } -} diff --git a/ObjectTK.Data/Variables/VertexAttributeInfo.cs b/ObjectTK.Data/Variables/VertexAttributeInfo.cs new file mode 100644 index 0000000..0ba3313 --- /dev/null +++ b/ObjectTK.Data/Variables/VertexAttributeInfo.cs @@ -0,0 +1,24 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Variables { + public class VertexAttributeInfo { + public int ProgramHandle { get; } + public string Name { get; set; } + public bool Active { get; set; } + public int Index { get; private set; } + public int Components { get; private set; } + public VertexAttribPointerType Type { get; private set; } + public bool Normalized { get; private set; } + + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, VertexAttribPointerType Type, bool Normalized) { + this.ProgramHandle = ProgramHandle; + this.Name = Name; + this.Active = Active; + this.Index = Index; + this.Components = Components; + this.Type = Type; + this.Normalized = Normalized; + } + } + +} diff --git a/ObjectTK.Extensions/ObjectTK.Extensions.csproj b/ObjectTK.Extensions/ObjectTK.Extensions.csproj new file mode 100644 index 0000000..b215520 --- /dev/null +++ b/ObjectTK.Extensions/ObjectTK.Extensions.csproj @@ -0,0 +1,11 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netcoreapp3.1</TargetFramework> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\ObjectTK.Data\ObjectTK.Data.csproj" /> + </ItemGroup> + +</Project> diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs new file mode 100644 index 0000000..8c8b4e4 --- /dev/null +++ b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs @@ -0,0 +1,15 @@ +using ObjectTK.Data.Shaders; +using ObjectTK.Data.Variables; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Extensions.Shaders { + + public static class ProgramExtensions { + + public static void Use(this Program Program) { + GL.UseProgram(Program.Handle); + } + + } + +} diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs new file mode 100644 index 0000000..a8e2c18 --- /dev/null +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -0,0 +1,126 @@ +using ObjectTK.Data.Shaders; +using ObjectTK.Data.Variables; +using OpenTK.Graphics.OpenGL; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace ObjectTK.Extensions.Shaders { + public class Program<T> : Program where T : ProgramVariableInfoCollection, new() { + public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : + base(Handle, VertexShader, FragmentShader, Uniforms, VertexAttributes) { + + } + } + + public class ProgramFactory { + + public string BaseDirectory { get; set; } = "./"; + public string ShaderExtension { get; set; } = "glsl"; + + public Program<T> CreateProgram<T>() where T : ProgramVariableInfoCollection, new() { + + List<ShaderSourceAttribute> Attributes = typeof(T).GetCustomAttributes<ShaderSourceAttribute>(true).ToList(); + List<Shader> Shaders = new List<Shader>(); + + int ProgramHandle = GL.CreateProgram(); + + foreach (ShaderSourceAttribute Attribute in Attributes) { + string Source = GetEffectSource(Attribute.EffectKey); + + int ShaderHandle = GL.CreateShader(ShaderType.VertexShader); + GL.ShaderSource(ShaderHandle, Source); + GL.CompileShader(ShaderHandle); + GL.AttachShader(ProgramHandle, ShaderHandle); + + switch (Attribute.Type) { + case ShaderType.FragmentShader: + Shaders.Add(new FragmentShader(ShaderHandle, Source)); + break; + case ShaderType.VertexShader: + Shaders.Add(new VertexShader(ShaderHandle, Source)); + break; + default: + break; + } + } + + GL.LinkProgram(ProgramHandle); + + foreach(Shader Shader in Shaders) { + GL.DetachShader(ProgramHandle, Shader.Handle); + GL.DeleteShader(Shader.Handle); + } + + int UniformLocation = GL.GetUniformLocation(ProgramHandle, "ModelViewProjectionMatrix"); + GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); + UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); + + Program<T> ShaderProgram = new Program<T>(ProgramHandle, null, null, new UniformInfo[] { UI_InPosition }, new VertexAttributeInfo[] { }); + InitializeProgramVariables(ShaderProgram); + + return ShaderProgram; + } + + private string GetEffectSource(string EffectKey, Dictionary<string, string> Effects = null) { + + Effects ??= new Dictionary<string, string>(); + + string EffectFile = Path.ChangeExtension(EffectKey, null); + string FilePath = Path.Join(BaseDirectory, Path.ChangeExtension(EffectKey, "glsl")); + string FullSource = File.ReadAllText(FilePath); + + ExtractEffects(EffectFile, FullSource, Effects); + + Effects.TryGetValue(EffectKey, out string EffectSource); + return EffectSource ?? throw new Exception($"Error loading effect with key: {EffectKey}"); + } + private void ExtractEffects(string EffectFile, string FullSource, Dictionary<string, string> Effects) { + + const string EffectToken = "--"; + const string EffectFileSeparator = "."; + const string IncludeToken = "#include"; + + string[] Lines = FullSource.Split('\n'); + + StringBuilder Effect = new StringBuilder(); + string EffectKey = null; + + foreach(string Line in Lines) { + if (Line.StartsWith(EffectToken) && Line.Length > EffectToken.Length) { + if(EffectKey != null) { + Effects.Add(EffectKey, Effect.ToString()); + Effect.Clear(); + EffectKey = null; + } + EffectKey = $"{EffectFile}{EffectFileSeparator}{Line.Substring(EffectToken.Length).Trim()}"; + continue; + } + + if(EffectKey != null) { + if(Line.StartsWith(IncludeToken) && Line.Length > IncludeToken.Length) { + string IncludedEffect = Line.Substring(IncludeToken.Length).Trim(); + if(!Effects.TryGetValue(IncludedEffect, out string EffectSource)) { + EffectSource = GetEffectSource(IncludedEffect, Effects); + } + Effect.AppendLine(EffectSource); + } else { + Effect.AppendLine(Line); + } + } + } + if (EffectKey != null) { + Effects.Add(EffectKey, Effect.ToString()); + Effect.Clear(); + } + } + + private void InitializeProgramVariables<T>(Program<T> Program) where T : ProgramVariableInfoCollection, new() { + + } + } + +} diff --git a/ObjectTK.Extensions/Shaders/ShaderAttributes.cs b/ObjectTK.Extensions/Shaders/ShaderAttributes.cs new file mode 100644 index 0000000..252581a --- /dev/null +++ b/ObjectTK.Extensions/Shaders/ShaderAttributes.cs @@ -0,0 +1,32 @@ +using OpenTK.Graphics.OpenGL; +using System; + +namespace ObjectTK.Extensions.Shaders { + + [AttributeUsage(AttributeTargets.Class)] + public class ShaderSourceAttribute : Attribute { + + public ShaderType Type { get; private set; } + + public string EffectKey { get; private set; } + + public ShaderSourceAttribute(ShaderType Type, string EffectKey) { + this.Type = Type; + this.EffectKey = EffectKey; + } + + } + + public class VertexShaderSourceAttribute : ShaderSourceAttribute { + public VertexShaderSourceAttribute(string EffectKey) : base(ShaderType.VertexShader, EffectKey) { + + } + } + + public class FragmentShaderSourceAttribute : ShaderSourceAttribute { + public FragmentShaderSourceAttribute(string EffectKey) : base(ShaderType.FragmentShader, EffectKey) { + + } + } + +} diff --git a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs new file mode 100644 index 0000000..5e340e3 --- /dev/null +++ b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs @@ -0,0 +1,29 @@ +using ObjectTK.Data.Shaders; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Extensions.Shaders { + + public static class ShaderFactory { + public static VertexShader CreateVertexShader(string Source) { + int Handle = GL.CreateShader(ShaderType.VertexShader); + GL.ShaderSource(Handle, Source); + GL.CompileShader(Handle); + return new VertexShader(Handle, Source); + } + public static FragmentShader CreateFragmentShader(string Source) { + int Handle = GL.CreateShader(ShaderType.FragmentShader); + GL.ShaderSource(Handle, Source); + GL.CompileShader(Handle); + return new FragmentShader(Handle, Source); + } + } + + public static class ShaderExtensions { + public static void Compile(this Shader Shader) { + GL.CompileShader(Shader.Handle); + } + public static void ShaderSource(this Shader Shader) { + GL.ShaderSource(Shader.Handle, Shader.Source); + } + } +} diff --git a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs new file mode 100644 index 0000000..911b640 --- /dev/null +++ b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs @@ -0,0 +1,17 @@ +using ObjectTK.Data.Variables; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Extensions.Variables { + public static class UniformInfoExtensions { + + //public static void Set<T>(this Uniform<T> Uniform , T Value) { + + //} + + } + public class UniformInfo<T> : UniformInfo { + public UniformInfo(int ProgramHandle, string Name, int Location, int UniformSize, ActiveUniformType UniformType, bool Active) : + base(ProgramHandle, Name, Location, UniformSize, UniformType, Active) { + } + } +} diff --git a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs new file mode 100644 index 0000000..024f240 --- /dev/null +++ b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs @@ -0,0 +1,15 @@ +using ObjectTK.Data.Variables; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Extensions.Variables { + public static class VertexAttributeInfoExtensions { + + + } + + public class VertexAttributeInfo<T> : VertexAttributeInfo { + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, VertexAttribPointerType Type, bool Normalized) : + base(ProgramHandle, Name, Active, Index, Components, Type, Normalized) { + } + } +} diff --git a/ObjectTK.sln b/ObjectTK.sln index 6f4f4df..17403b1 100644 --- a/ObjectTK.sln +++ b/ObjectTK.sln @@ -3,9 +3,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Extensions", "ObjectTK.Extensions\ObjectTK.Extensions.csproj", "{DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "Examples\Examples.csproj", "{AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "ObjectTK.Tools\ObjectTK.Tools.csproj", "{B5DCB84E-3E09-4F37-B06E-68565756624F}" @@ -20,6 +21,10 @@ Global {163450BD-24E0-4C3E-A310-3AEBD709E065}.Debug|Any CPU.Build.0 = Debug|Any CPU {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.ActiveCfg = Release|Any CPU {163450BD-24E0-4C3E-A310-3AEBD709E065}.Release|Any CPU.Build.0 = Release|Any CPU + {DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}.Release|Any CPU.Build.0 = Release|Any CPU {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Debug|Any CPU.Build.0 = Debug|Any CPU {AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}.Release|Any CPU.ActiveCfg = Release|Any CPU From c2e34e94100834d381f8d6535431ac07b2d43a9d Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Wed, 21 Oct 2020 08:53:25 -0400 Subject: [PATCH 09/52] working extensions example still needs some way to get VertexAttribPointerType --- .../ExtensionPrograms/BasicProgram.cs | 6 +-- Examples/Examples/HelloTriangle.cs | 12 +++--- .../Variables/VertexAttributeInfo.cs | 4 +- ObjectTK.Extensions/Shaders/ProgramFactory.cs | 39 ++++++++++++++----- .../VertexAttributeInfoExtensions.cs | 2 +- 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/Examples/Examples/ExtensionPrograms/BasicProgram.cs index 6c93974..6acc720 100644 --- a/Examples/Examples/ExtensionPrograms/BasicProgram.cs +++ b/Examples/Examples/ExtensionPrograms/BasicProgram.cs @@ -7,8 +7,8 @@ namespace Examples.Examples.Programs { [VertexShaderSource("BasicShader.Vertex")] [FragmentShaderSource("BasicShader.Fragment")] - public class BasicProgram : ProgramVariableInfoCollection { - public VertexAttributeInfo<Vector3> InPosition { get; } - public UniformInfo<Matrix4> ModelViewProjectionMatrix { get; } + public class BasicProgram { + public VertexAttributeInfo<Vector3> InPosition { get; set; } + public UniformInfo<Matrix4> ModelViewProjectionMatrix { get; set; } } } diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 2b86a41..169b4df 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -1,5 +1,6 @@ using System; +using System.Collections.Generic; using System.Drawing; using Examples.Examples.Programs; using ObjectTK.Data.Buffers; @@ -62,7 +63,7 @@ protected override void OnLoad() { GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); - ShaderProgram = new Program(ProgramHandle, VertexShader, FragmentShader, new UniformInfo[] { UI_InPosition }, new VertexAttributeInfo[] { }); + ShaderProgram = new Program(ProgramHandle, VertexShader, FragmentShader, new Dictionary<string, UniformInfo> { { "ModelViewProjectionMatrix", UI_InPosition } }, new Dictionary<string, VertexAttributeInfo> { }); GL.DetachShader(ProgramHandle, VertexShader.Handle); GL.DetachShader(ProgramHandle, FragmentShader.Handle); @@ -102,7 +103,7 @@ protected override void OnRenderFrame(FrameEventArgs e) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; - GL.UniformMatrix4(ShaderProgram.ProgramVariableInfoCollection.Uniforms[0].Location, false, ref MVPMatrix); + GL.UniformMatrix4(ShaderProgram.Uniforms["ModelViewProjectionMatrix"].Location, false, ref MVPMatrix); GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); @@ -133,8 +134,8 @@ protected override void OnLoad() { VAO = new VertexArray(GL.GenVertexArray()); GL.BindVertexArray(VAO.Handle); - GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); - GL.EnableVertexAttribArray(0); + GL.VertexAttribPointer(ShaderProgram.Variables.InPosition.Index, VBO.ElementCount, VertexAttribPointerType.Float, false, VBO.ElementSize, 0); + GL.EnableVertexAttribArray(ShaderProgram.Variables.InPosition.Index); GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); ActiveCamera.Position = new Vector3(0, 0, 3); @@ -156,8 +157,7 @@ protected override void OnRenderFrame(FrameEventArgs e) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; - - GL.UniformMatrix4(ShaderProgram.ProgramVariableInfoCollection.ModelViewProjectionMatrix.Location, false, ref MVPMatrix); + GL.UniformMatrix4(ShaderProgram.Variables.ModelViewProjectionMatrix.Location, false, ref MVPMatrix); GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); diff --git a/ObjectTK.Data/Variables/VertexAttributeInfo.cs b/ObjectTK.Data/Variables/VertexAttributeInfo.cs index 0ba3313..0f0b1a0 100644 --- a/ObjectTK.Data/Variables/VertexAttributeInfo.cs +++ b/ObjectTK.Data/Variables/VertexAttributeInfo.cs @@ -7,10 +7,10 @@ public class VertexAttributeInfo { public bool Active { get; set; } public int Index { get; private set; } public int Components { get; private set; } - public VertexAttribPointerType Type { get; private set; } + public ActiveAttribType Type { get; private set; } public bool Normalized { get; private set; } - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, VertexAttribPointerType Type, bool Normalized) { + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType Type, bool Normalized) { this.ProgramHandle = ProgramHandle; this.Name = Name; this.Active = Active; diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs index a8e2c18..6d26111 100644 --- a/ObjectTK.Extensions/Shaders/ProgramFactory.cs +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -9,7 +9,8 @@ using System.Text; namespace ObjectTK.Extensions.Shaders { - public class Program<T> : Program where T : ProgramVariableInfoCollection, new() { + public class Program<T> : Program where T : class, new() { + public T Variables { get; set; } public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : base(Handle, VertexShader, FragmentShader, Uniforms, VertexAttributes) { @@ -21,7 +22,7 @@ public class ProgramFactory { public string BaseDirectory { get; set; } = "./"; public string ShaderExtension { get; set; } = "glsl"; - public Program<T> CreateProgram<T>() where T : ProgramVariableInfoCollection, new() { + public Program<T> CreateProgram<T>() where T : class, new() { List<ShaderSourceAttribute> Attributes = typeof(T).GetCustomAttributes<ShaderSourceAttribute>(true).ToList(); List<Shader> Shaders = new List<Shader>(); @@ -31,7 +32,7 @@ public class ProgramFactory { foreach (ShaderSourceAttribute Attribute in Attributes) { string Source = GetEffectSource(Attribute.EffectKey); - int ShaderHandle = GL.CreateShader(ShaderType.VertexShader); + int ShaderHandle = GL.CreateShader(Attribute.Type); GL.ShaderSource(ShaderHandle, Source); GL.CompileShader(ShaderHandle); GL.AttachShader(ProgramHandle, ShaderHandle); @@ -50,16 +51,12 @@ public class ProgramFactory { GL.LinkProgram(ProgramHandle); - foreach(Shader Shader in Shaders) { + foreach (Shader Shader in Shaders) { GL.DetachShader(ProgramHandle, Shader.Handle); GL.DeleteShader(Shader.Handle); } - int UniformLocation = GL.GetUniformLocation(ProgramHandle, "ModelViewProjectionMatrix"); - GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); - UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); - - Program<T> ShaderProgram = new Program<T>(ProgramHandle, null, null, new UniformInfo[] { UI_InPosition }, new VertexAttributeInfo[] { }); + Program<T> ShaderProgram = new Program<T>(ProgramHandle, null, null, new Dictionary<string, UniformInfo>(), new Dictionary<string, VertexAttributeInfo>()); InitializeProgramVariables(ShaderProgram); return ShaderProgram; @@ -118,7 +115,29 @@ private void ExtractEffects(string EffectFile, string FullSource, Dictionary<str } } - private void InitializeProgramVariables<T>(Program<T> Program) where T : ProgramVariableInfoCollection, new() { + private void InitializeProgramVariables<T>(Program<T> Program) where T : class, new() { + + Program.Variables = new T(); + + PropertyInfo[] Properties = typeof(T).GetProperties(); + PropertyInfo[] UniformProperties = Properties.Where(Prop => typeof(UniformInfo).IsAssignableFrom(Prop.PropertyType)).ToArray(); + PropertyInfo[] VertexAttribProperties = Properties.Where(Prop => typeof(VertexAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToArray(); + + foreach (PropertyInfo Prop in UniformProperties) { + int UniformLocation = GL.GetUniformLocation(Program.Handle, Prop.Name); + GL.GetActiveUniform(Program.Handle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); + UniformInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, UniformLocation, UniformSize, UniformType, UniformLocation > -1) as UniformInfo; + Prop.SetValue(Program.Variables, Value); + Program.Uniforms.Add(Prop.Name, Value); + } + + foreach (PropertyInfo Prop in VertexAttribProperties) { + int AttribIndex = GL.GetAttribLocation(Program.Handle, Prop.Name); + GL.GetActiveAttrib(Program.Handle, AttribIndex, out int Size, out ActiveAttribType AttribType); + VertexAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, false) as VertexAttributeInfo; + Prop.SetValue(Program.Variables, Value); + Program.VertexAttributes.Add(Prop.Name, Value); + } } } diff --git a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs index 024f240..c58e8aa 100644 --- a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs @@ -8,7 +8,7 @@ public static class VertexAttributeInfoExtensions { } public class VertexAttributeInfo<T> : VertexAttributeInfo { - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, VertexAttribPointerType Type, bool Normalized) : + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType Type, bool Normalized) : base(ProgramHandle, Name, Active, Index, Components, Type, Normalized) { } } From 3bb6f5623407f35f43039a2b62f2f4a52441de0a Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Wed, 21 Oct 2020 08:56:15 -0400 Subject: [PATCH 10/52] how were these spaces --- .../Variables/VertexAttributeInfo.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ObjectTK.Data/Variables/VertexAttributeInfo.cs b/ObjectTK.Data/Variables/VertexAttributeInfo.cs index 0f0b1a0..70338a7 100644 --- a/ObjectTK.Data/Variables/VertexAttributeInfo.cs +++ b/ObjectTK.Data/Variables/VertexAttributeInfo.cs @@ -2,23 +2,23 @@ namespace ObjectTK.Data.Variables { public class VertexAttributeInfo { - public int ProgramHandle { get; } - public string Name { get; set; } - public bool Active { get; set; } - public int Index { get; private set; } - public int Components { get; private set; } - public ActiveAttribType Type { get; private set; } - public bool Normalized { get; private set; } + public int ProgramHandle { get; } + public string Name { get; set; } + public bool Active { get; set; } + public int Index { get; private set; } + public int Components { get; private set; } + public ActiveAttribType Type { get; private set; } + public bool Normalized { get; private set; } - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType Type, bool Normalized) { - this.ProgramHandle = ProgramHandle; - this.Name = Name; - this.Active = Active; - this.Index = Index; - this.Components = Components; - this.Type = Type; - this.Normalized = Normalized; + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType Type, bool Normalized) { + this.ProgramHandle = ProgramHandle; + this.Name = Name; + this.Active = Active; + this.Index = Index; + this.Components = Components; + this.Type = Type; + this.Normalized = Normalized; } - } + } } From bdecada8ba6eeed004fc3ffe8f14691d4d5c817c Mon Sep 17 00:00:00 2001 From: burnss9 <burnss9@nku.edu> Date: Thu, 22 Oct 2020 20:50:07 -0400 Subject: [PATCH 11/52] might as well commit --- .../ExtensionPrograms/BasicProgram.cs | 5 +- Examples/Examples/HelloTriangle.cs | 34 +++++----- ObjectTK.Data/Buffers/Buffer.cs | 6 +- ObjectTK.Data/Shaders/Material.cs | 9 +++ .../Variables/VertexAttributeInfo.cs | 14 ++-- .../Buffers/BufferExtensions.cs | 15 +++++ .../Buffers/VertexArrayExtensions.cs | 21 ++++++ .../Shaders/ProgramExtensions.cs | 32 +++++++++ ObjectTK.Extensions/Shaders/ProgramFactory.cs | 24 ++++--- .../Variables/UniformInfoExtensions.cs | 65 +++++++++++++++++-- .../VertexAttributeInfoExtensions.cs | 26 ++++++-- ObjectTK.Tools/ObjectTK.Tools.csproj | 4 ++ 12 files changed, 206 insertions(+), 49 deletions(-) create mode 100644 ObjectTK.Data/Shaders/Material.cs create mode 100644 ObjectTK.Extensions/Buffers/BufferExtensions.cs create mode 100644 ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/Examples/Examples/ExtensionPrograms/BasicProgram.cs index 6acc720..57ea324 100644 --- a/Examples/Examples/ExtensionPrograms/BasicProgram.cs +++ b/Examples/Examples/ExtensionPrograms/BasicProgram.cs @@ -1,6 +1,6 @@ -using ObjectTK.Data.Shaders; -using ObjectTK.Extensions.Shaders; +using ObjectTK.Extensions.Shaders; using ObjectTK.Extensions.Variables; +using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; namespace Examples.Examples.Programs { @@ -8,6 +8,7 @@ namespace Examples.Examples.Programs { [VertexShaderSource("BasicShader.Vertex")] [FragmentShaderSource("BasicShader.Fragment")] public class BasicProgram { + [VertexAttrib(VertexAttribPointerType.Float)] public VertexAttributeInfo<Vector3> InPosition { get; set; } public UniformInfo<Matrix4> ModelViewProjectionMatrix { get; set; } } diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 169b4df..bbe3eee 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -6,7 +6,9 @@ using ObjectTK.Data.Buffers; using ObjectTK.Data.Shaders; using ObjectTK.Data.Variables; +using ObjectTK.Extensions.Buffers; using ObjectTK.Extensions.Shaders; +using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; @@ -74,7 +76,8 @@ protected override void OnLoad() { var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - VBO = new Buffer<Vector3>(GL.GenBuffer(), Vertices); + VBO = new Buffer<Vector3>(GL.GenBuffer()); + VBO.ElementCount = 3; GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, Vertices, BufferUsageHint.StaticDraw); @@ -111,10 +114,9 @@ protected override void OnRenderFrame(FrameEventArgs e) { } } - [ExampleProject("Hello Triangle with extensions")] public class HelloTriangleWithExtensions : ExampleWindow { - + private Program<BasicProgram> ShaderProgram; private Buffer<Vector3> VBO; private VertexArray VAO; @@ -123,20 +125,15 @@ protected override void OnLoad() { base.OnLoad(); ShaderProgram = new ProgramFactory() { BaseDirectory = "./Data/Shaders/" }.CreateProgram<BasicProgram>(); - - GL.UseProgram(ShaderProgram.Handle); + ShaderProgram.Use(); var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - VBO = new Buffer<Vector3>(GL.GenBuffer(), Vertices); - GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); - GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, Vertices, BufferUsageHint.StaticDraw); + VBO = new Buffer<Vector3>(GL.GenBuffer()); + VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); VAO = new VertexArray(GL.GenVertexArray()); - GL.BindVertexArray(VAO.Handle); - GL.VertexAttribPointer(ShaderProgram.Variables.InPosition.Index, VBO.ElementCount, VertexAttribPointerType.Float, false, VBO.ElementSize, 0); - GL.EnableVertexAttribArray(ShaderProgram.Variables.InPosition.Index); - GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); + VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); ActiveCamera.Position = new Vector3(0, 0, 3); @@ -156,10 +153,17 @@ protected override void OnRenderFrame(FrameEventArgs e) { GL.Viewport(0, 0, Size.X, Size.Y); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; - GL.UniformMatrix4(ShaderProgram.Variables.ModelViewProjectionMatrix.Location, false, ref MVPMatrix); + for (int X = 0; X < 20; X++) { + for (int Y = 0; Y < 20; Y++) { + for (int Z = 0; Z < 20; Z++) { - GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); + Matrix4 MVP = Matrix4.CreateTranslation(new Vector3(X * 2, Y * 2, Z * 2)) * ActiveCamera.ViewProjectionMatrix; + ShaderProgram.Variables.ModelViewProjectionMatrix.Set(MVP); + GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); + + } + } + } SwapBuffers(); } diff --git a/ObjectTK.Data/Buffers/Buffer.cs b/ObjectTK.Data/Buffers/Buffer.cs index 3a87f69..42a19ce 100644 --- a/ObjectTK.Data/Buffers/Buffer.cs +++ b/ObjectTK.Data/Buffers/Buffer.cs @@ -23,10 +23,8 @@ public Buffer(int Handle, int ElementSize, int ElementCount) { } public class Buffer<T> : Buffer where T : struct { - public T[] Elements { get; set; } - public override int ElementCount { get => Elements.Length; set { } } - public Buffer(int Handle, T[] Elements) : base(Handle, Marshal.SizeOf(typeof(T)), 0) { - this.Elements = Elements; + public Buffer(int Handle) : base(Handle, Marshal.SizeOf(typeof(T)), 0) { + } } } diff --git a/ObjectTK.Data/Shaders/Material.cs b/ObjectTK.Data/Shaders/Material.cs new file mode 100644 index 0000000..9aed016 --- /dev/null +++ b/ObjectTK.Data/Shaders/Material.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ObjectTK.Data.Shaders { + public class Material { + } + +} diff --git a/ObjectTK.Data/Variables/VertexAttributeInfo.cs b/ObjectTK.Data/Variables/VertexAttributeInfo.cs index 70338a7..e0d5bcb 100644 --- a/ObjectTK.Data/Variables/VertexAttributeInfo.cs +++ b/ObjectTK.Data/Variables/VertexAttributeInfo.cs @@ -5,18 +5,20 @@ public class VertexAttributeInfo { public int ProgramHandle { get; } public string Name { get; set; } public bool Active { get; set; } - public int Index { get; private set; } - public int Components { get; private set; } - public ActiveAttribType Type { get; private set; } - public bool Normalized { get; private set; } + public int Index { get; set; } + public int Components { get; set; } + public ActiveAttribType ActiveAttribType { get; set; } + public VertexAttribPointerType VertexAttribPointerType { get; set; } + public bool Normalized { get; set; } - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType Type, bool Normalized) { + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType ActiveAttribType, VertexAttribPointerType VertexAttribPointerType, bool Normalized) { this.ProgramHandle = ProgramHandle; this.Name = Name; this.Active = Active; this.Index = Index; this.Components = Components; - this.Type = Type; + this.ActiveAttribType = ActiveAttribType; + this.VertexAttribPointerType = VertexAttribPointerType; this.Normalized = Normalized; } } diff --git a/ObjectTK.Extensions/Buffers/BufferExtensions.cs b/ObjectTK.Extensions/Buffers/BufferExtensions.cs new file mode 100644 index 0000000..1ac4386 --- /dev/null +++ b/ObjectTK.Extensions/Buffers/BufferExtensions.cs @@ -0,0 +1,15 @@ +using Buffer = ObjectTK.Data.Buffers.Buffer; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Extensions.Buffers { + public static class BufferExtensions { + + public static void BufferData<T>(this Buffer Buffer, BufferTarget BufferTarget, T[] Data, BufferUsageHint BufferUsageHint = BufferUsageHint.StaticDraw) where T : struct { + Buffer.ElementCount = Data.Length; + GL.BindBuffer(BufferTarget, Buffer.Handle); + GL.BufferData(BufferTarget, Buffer.ElementSize * Buffer.ElementCount, Data, BufferUsageHint); + } + + + } +} diff --git a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs new file mode 100644 index 0000000..78821b2 --- /dev/null +++ b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs @@ -0,0 +1,21 @@ +using Buffer = ObjectTK.Data.Buffers.Buffer; +using ObjectTK.Data.Buffers; +using OpenTK.Graphics.OpenGL; +using ObjectTK.Data.Variables; + +namespace ObjectTK.Extensions.Buffers { + public static class VertexArrayExtensions { + + public static void Bind(this VertexArray VertexArray) { + GL.BindVertexArray(VertexArray.Handle); + } + + public static void BindVertexAttribute(this VertexArray VertexArray, VertexAttributeInfo VertexAttributeInfo, Buffer Buffer) { + VertexArray.Bind(); + GL.VertexAttribPointer(VertexAttributeInfo.Index, Buffer.ElementCount, VertexAttribPointerType.Float, false, Buffer.ElementSize, 0); + GL.EnableVertexAttribArray(VertexAttributeInfo.Index); + GL.BindBuffer(BufferTarget.ArrayBuffer, Buffer.Handle); + } + + } +} diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs index 8c8b4e4..768c544 100644 --- a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs @@ -1,6 +1,10 @@ using ObjectTK.Data.Shaders; using ObjectTK.Data.Variables; +using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; +using System; +using System.Collections.Generic; +using System.Reflection; namespace ObjectTK.Extensions.Shaders { @@ -11,5 +15,33 @@ public static void Use(this Program Program) { } } + public class Program<T> : Program where T : class, new() { + public T Variables { get; set; } + internal List<PropertyInfo> UniformInfoProperties { get; set; } + internal List<PropertyInfo> VertexAttributeInfoProperties { get; set; } + + public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : + base(Handle, VertexShader, FragmentShader, Uniforms, VertexAttributes) { + } + } + + public class Material<T> where T : class, new() { + public Program<T> Program { get; set; } + public T Variables { get; set; } + + public Material() { + + foreach (PropertyInfo Prop in Program.UniformInfoProperties) { + Type UniformType = Prop.PropertyType.GetGenericArguments()[0]; + object DefaultValue = Activator.CreateInstance(UniformType); + UniformInfo PropValue = Prop.GetValue(Program.Variables) as UniformInfo; + } + } + + public void Use() { + Program.Use(); + } + + } } diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs index 6d26111..4da03d5 100644 --- a/ObjectTK.Extensions/Shaders/ProgramFactory.cs +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -1,5 +1,6 @@ using ObjectTK.Data.Shaders; using ObjectTK.Data.Variables; +using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; using System; using System.Collections.Generic; @@ -9,14 +10,6 @@ using System.Text; namespace ObjectTK.Extensions.Shaders { - public class Program<T> : Program where T : class, new() { - public T Variables { get; set; } - public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : - base(Handle, VertexShader, FragmentShader, Uniforms, VertexAttributes) { - - } - } - public class ProgramFactory { public string BaseDirectory { get; set; } = "./"; @@ -120,10 +113,10 @@ private void ExtractEffects(string EffectFile, string FullSource, Dictionary<str Program.Variables = new T(); PropertyInfo[] Properties = typeof(T).GetProperties(); - PropertyInfo[] UniformProperties = Properties.Where(Prop => typeof(UniformInfo).IsAssignableFrom(Prop.PropertyType)).ToArray(); - PropertyInfo[] VertexAttribProperties = Properties.Where(Prop => typeof(VertexAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToArray(); + Program.UniformInfoProperties = Properties.Where(Prop => typeof(UniformInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); + Program.VertexAttributeInfoProperties = Properties.Where(Prop => typeof(VertexAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); - foreach (PropertyInfo Prop in UniformProperties) { + foreach (PropertyInfo Prop in Program.UniformInfoProperties) { int UniformLocation = GL.GetUniformLocation(Program.Handle, Prop.Name); GL.GetActiveUniform(Program.Handle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); UniformInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, UniformLocation, UniformSize, UniformType, UniformLocation > -1) as UniformInfo; @@ -131,10 +124,15 @@ private void ExtractEffects(string EffectFile, string FullSource, Dictionary<str Program.Uniforms.Add(Prop.Name, Value); } - foreach (PropertyInfo Prop in VertexAttribProperties) { + foreach (PropertyInfo Prop in Program.VertexAttributeInfoProperties) { int AttribIndex = GL.GetAttribLocation(Program.Handle, Prop.Name); GL.GetActiveAttrib(Program.Handle, AttribIndex, out int Size, out ActiveAttribType AttribType); - VertexAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, false) as VertexAttributeInfo; + VertexAttribAttribute Attribute = Prop.GetCustomAttribute<VertexAttribAttribute>(); + if(Attribute == null) { + throw new Exception($"VertexAttributeInfo {typeof(T).FullName}.{Prop.Name} is not decorated with the 'VertexAttrib' Attribute, which is necessary for some metadata as it cannot be determined by the shader itself."); + } + VertexAttribPointerType VertexAttribPointerType = Attribute.VertexAttribPointerType; + VertexAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, VertexAttribPointerType, false) as VertexAttributeInfo; Prop.SetValue(Program.Variables, Value); Program.VertexAttributes.Add(Prop.Name, Value); } diff --git a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs index 911b640..1415caa 100644 --- a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs @@ -1,17 +1,74 @@ using ObjectTK.Data.Variables; using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; +using System; +using System.Collections.Generic; +using System.Drawing; namespace ObjectTK.Extensions.Variables { public static class UniformInfoExtensions { - //public static void Set<T>(this Uniform<T> Uniform , T Value) { - - //} - + public static void Set<T>(this UniformInfo<T> Uniform, T Value) { + Uniform.SetAction?.Invoke(Uniform.Location, Value); + } } + public class UniformInfo<T> : UniformInfo { + + internal Action<int, T> SetAction; + public UniformInfo(int ProgramHandle, string Name, int Location, int UniformSize, ActiveUniformType UniformType, bool Active) : base(ProgramHandle, Name, Location, UniformSize, UniformType, Active) { + SetAction = UniformSetAction.FindAction<T>(); + } + + public class UniformSetAction { + + public static Action<int, V> FindAction<V>() { + if (SetActions.TryGetValue(typeof(V), out UniformSetAction SetAction)) { + return (SetAction as GenericUniformSetAction<V>).Action; + } + throw new Exception($"Uniform type not supported: {typeof(T).FullName}"); + } + + private static Dictionary<Type, UniformSetAction> SetActions; + static UniformSetAction() { + SetActions = new Dictionary<Type, UniformSetAction>() + { + { typeof(bool), new GenericUniformSetAction<bool> ((Location, Value) => GL.Uniform1(Location, Value ? 1 : 0)) }, + { typeof(int), new GenericUniformSetAction<int> (GL.Uniform1) }, + { typeof(uint), new GenericUniformSetAction<uint> (GL.Uniform1) }, + { typeof(float), new GenericUniformSetAction<float> (GL.Uniform1) }, + { typeof(double), new GenericUniformSetAction<double> (GL.Uniform1) }, + { typeof(Half), new GenericUniformSetAction<Half> ((Location, Half) => GL.Uniform1(Location, Half)) }, + { typeof(Color), new GenericUniformSetAction<Color> ((Location, Color) => GL.Uniform4(Location, Color)) }, + { typeof(Vector2), new GenericUniformSetAction<Vector2> (GL.Uniform2) }, + { typeof(Vector3), new GenericUniformSetAction<Vector3> (GL.Uniform3) }, + { typeof(Vector4), new GenericUniformSetAction<Vector4> (GL.Uniform4) }, + { typeof(Vector2d), new GenericUniformSetAction<Vector2d> ((Location, Vector) => GL.Uniform2(Location, Vector.X, Vector.Y)) }, + { typeof(Vector2h), new GenericUniformSetAction<Vector2h> ((Location, Vector) => GL.Uniform2(Location, Vector.X, Vector.Y)) }, + { typeof(Vector3d), new GenericUniformSetAction<Vector3d> ((Location, Vector) => GL.Uniform3(Location, Vector.X, Vector.Y, Vector.Z)) }, + { typeof(Vector3h), new GenericUniformSetAction<Vector3h> ((Location, Vector) => GL.Uniform3(Location, Vector.X, Vector.Y, Vector.Z)) }, + { typeof(Vector4d), new GenericUniformSetAction<Vector4d> ((Location, Vector) => GL.Uniform4(Location, Vector.X, Vector.Y, Vector.Z, Vector.W)) }, + { typeof(Vector4h), new GenericUniformSetAction<Vector4h> ((Location, Vector) => GL.Uniform4(Location, Vector.X, Vector.Y, Vector.Z, Vector.W)) }, + { typeof(Matrix2), new GenericUniformSetAction<Matrix2> ((Location, Matrix) => GL.UniformMatrix2(Location, false, ref Matrix)) }, + { typeof(Matrix3), new GenericUniformSetAction<Matrix3> ((Location, Matrix) => GL.UniformMatrix3(Location, false, ref Matrix)) }, + { typeof(Matrix4), new GenericUniformSetAction<Matrix4> ((Location, Matrix) => GL.UniformMatrix4(Location, false, ref Matrix)) }, + { typeof(Matrix2x3), new GenericUniformSetAction<Matrix2x3> ((Location, Matrix) => GL.UniformMatrix2x3(Location, false, ref Matrix)) }, + { typeof(Matrix2x4), new GenericUniformSetAction<Matrix2x4> ((Location, Matrix) => GL.UniformMatrix2x4(Location, false, ref Matrix)) }, + { typeof(Matrix3x2), new GenericUniformSetAction<Matrix3x2> ((Location, Matrix) => GL.UniformMatrix3x2(Location, false, ref Matrix)) }, + { typeof(Matrix3x4), new GenericUniformSetAction<Matrix3x4> ((Location, Matrix) => GL.UniformMatrix3x4(Location, false, ref Matrix)) }, + { typeof(Matrix4x2), new GenericUniformSetAction<Matrix4x2> ((Location, Matrix) => GL.UniformMatrix4x2(Location, false, ref Matrix)) }, + { typeof(Matrix4x3), new GenericUniformSetAction<Matrix4x3> ((Location, Matrix) => GL.UniformMatrix4x3(Location, false, ref Matrix)) } + }; + } + + public class GenericUniformSetAction<U> : UniformSetAction { + public Action<int, U> Action { get; set; } + public GenericUniformSetAction(Action<int, U> Action) { + this.Action = Action; + } + } } } } diff --git a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs index c58e8aa..ee15434 100644 --- a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs @@ -1,5 +1,6 @@ using ObjectTK.Data.Variables; using OpenTK.Graphics.OpenGL; +using System; namespace ObjectTK.Extensions.Variables { public static class VertexAttributeInfoExtensions { @@ -7,9 +8,24 @@ public static class VertexAttributeInfoExtensions { } - public class VertexAttributeInfo<T> : VertexAttributeInfo { - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType Type, bool Normalized) : - base(ProgramHandle, Name, Active, Index, Components, Type, Normalized) { - } - } + public class VertexAttributeInfo<T> : VertexAttributeInfo { + public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType ActiveAttribType, VertexAttribPointerType VertexAttribPointerType, bool Normalized) : + base(ProgramHandle, Name, Active, Index, Components, ActiveAttribType, VertexAttribPointerType, Normalized) { + } + } + + [AttributeUsage(AttributeTargets.Property)] + public class VertexAttribAttribute : Attribute { + public VertexAttribPointerType VertexAttribPointerType { get; protected set; } + public bool Normalized { get; protected set; } + + /// <summary> + /// Defines some metadata for VertexAttributeInfo objects that cannot be gathered from OpenGL. + /// </summary> + public VertexAttribAttribute(VertexAttribPointerType VertexAttribPointerType = VertexAttribPointerType.Float, bool Normalized = false) { + this.VertexAttribPointerType = VertexAttribPointerType; + this.Normalized = Normalized; + } + } + } diff --git a/ObjectTK.Tools/ObjectTK.Tools.csproj b/ObjectTK.Tools/ObjectTK.Tools.csproj index aa08c94..82bc7cb 100644 --- a/ObjectTK.Tools/ObjectTK.Tools.csproj +++ b/ObjectTK.Tools/ObjectTK.Tools.csproj @@ -8,4 +8,8 @@ <PackageReference Include="OpenTK" Version="4.0.6" /> </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\ObjectTK.Data\ObjectTK.Data.csproj" /> + </ItemGroup> + </Project> From c21c02799e1077763e1edd6429e43b5fba6611e7 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sun, 8 Nov 2020 23:06:14 +0200 Subject: [PATCH 12/52] Add idea to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1ee5385..259653e 100644 --- a/.gitignore +++ b/.gitignore @@ -360,3 +360,4 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd +.idea From e3179f85c2827783aeda0474da88f3e141b007c2 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sun, 8 Nov 2020 23:06:33 +0200 Subject: [PATCH 13/52] Buffer and VAO tweaks --- Examples/Examples/HelloTriangle.cs | 8 ++--- ObjectTK.Data/Buffers/Buffer.cs | 36 +++++++------------ ObjectTK.Data/Buffers/VertexArray.cs | 9 ----- ObjectTK.Data/Buffers/VertexArrayObject.cs | 12 +++++++ ObjectTK.Data/ObjectTK.Data.csproj | 1 + .../Buffers/VertexArrayExtensions.cs | 8 ++--- 6 files changed, 34 insertions(+), 40 deletions(-) delete mode 100644 ObjectTK.Data/Buffers/VertexArray.cs create mode 100644 ObjectTK.Data/Buffers/VertexArrayObject.cs diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index bbe3eee..934316c 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -20,7 +20,7 @@ public class HelloTriangle : ExampleWindow { private Program ShaderProgram; private Buffer<Vector3> VBO; - private VertexArray VAO; + private VertexArrayObject VAO; private readonly string VertSource = @" #version 330 core @@ -81,7 +81,7 @@ protected override void OnLoad() { GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, Vertices, BufferUsageHint.StaticDraw); - VAO = new VertexArray(GL.GenVertexArray()); + VAO = new VertexArrayObject(GL.GenVertexArray()); GL.BindVertexArray(VAO.Handle); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); GL.EnableVertexAttribArray(0); @@ -119,7 +119,7 @@ public class HelloTriangleWithExtensions : ExampleWindow { private Program<BasicProgram> ShaderProgram; private Buffer<Vector3> VBO; - private VertexArray VAO; + private VertexArrayObject VAO; protected override void OnLoad() { base.OnLoad(); @@ -132,7 +132,7 @@ protected override void OnLoad() { VBO = new Buffer<Vector3>(GL.GenBuffer()); VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); - VAO = new VertexArray(GL.GenVertexArray()); + VAO = new VertexArrayObject(GL.GenVertexArray()); VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); ActiveCamera.Position = new Vector3(0, 0, 3); diff --git a/ObjectTK.Data/Buffers/Buffer.cs b/ObjectTK.Data/Buffers/Buffer.cs index 42a19ce..ed46a0a 100644 --- a/ObjectTK.Data/Buffers/Buffer.cs +++ b/ObjectTK.Data/Buffers/Buffer.cs @@ -1,30 +1,20 @@ -using System.Runtime.InteropServices; +namespace ObjectTK.Data.Buffers { -namespace ObjectTK.Data.Buffers { - - public class Buffer { + /// Corresponds to an OpenGL Buffer. + /// Typically this is a vertex/index/whatever buffer. + public class Buffer<T> where T : unmanaged { + + /// The OpenGL Handle for this. public int Handle { get; } + /// Size in bytes of each element in the buffer. public int ElementSize { get; } - private int _ElementCount { get; set; } - public virtual int ElementCount { - get { - return _ElementCount; - } - set { - _ElementCount = value; - } - } - - public Buffer(int Handle, int ElementSize, int ElementCount) { - this.Handle = Handle; - this.ElementSize = ElementSize; - this.ElementCount = ElementCount; - } - } - - public class Buffer<T> : Buffer where T : struct { - public Buffer(int Handle) : base(Handle, Marshal.SizeOf(typeof(T)), 0) { + /// The number of elements in this buffer. + public int ElementCount { get; set; } + public unsafe Buffer(int handle, int elementCount) { + Handle = handle; + ElementSize = sizeof(T); + ElementCount = elementCount; } } } diff --git a/ObjectTK.Data/Buffers/VertexArray.cs b/ObjectTK.Data/Buffers/VertexArray.cs deleted file mode 100644 index 4174f52..0000000 --- a/ObjectTK.Data/Buffers/VertexArray.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ObjectTK.Data.Buffers { - public class VertexArray { - public int Handle { get; } - - public VertexArray(int Handle) { - this.Handle = Handle; - } - } -} diff --git a/ObjectTK.Data/Buffers/VertexArrayObject.cs b/ObjectTK.Data/Buffers/VertexArrayObject.cs new file mode 100644 index 0000000..301cbe1 --- /dev/null +++ b/ObjectTK.Data/Buffers/VertexArrayObject.cs @@ -0,0 +1,12 @@ +namespace ObjectTK.Data.Buffers { + + /// An OpenGL Vertex array object. + public class VertexArrayObject { + + public int Handle { get; } + + public VertexArrayObject(int handle) { + Handle = handle; + } + } +} diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Data/ObjectTK.Data.csproj index f887b41..58aa62e 100644 --- a/ObjectTK.Data/ObjectTK.Data.csproj +++ b/ObjectTK.Data/ObjectTK.Data.csproj @@ -2,6 +2,7 @@ <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <ItemGroup> diff --git a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs index 78821b2..10aa630 100644 --- a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs +++ b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs @@ -6,12 +6,12 @@ namespace ObjectTK.Extensions.Buffers { public static class VertexArrayExtensions { - public static void Bind(this VertexArray VertexArray) { - GL.BindVertexArray(VertexArray.Handle); + public static void Bind(this VertexArrayObject vertexArrayObject) { + GL.BindVertexArray(vertexArrayObject.Handle); } - public static void BindVertexAttribute(this VertexArray VertexArray, VertexAttributeInfo VertexAttributeInfo, Buffer Buffer) { - VertexArray.Bind(); + public static void BindVertexAttribute(this VertexArrayObject vertexArrayObject, VertexAttributeInfo VertexAttributeInfo, Buffer Buffer) { + vertexArrayObject.Bind(); GL.VertexAttribPointer(VertexAttributeInfo.Index, Buffer.ElementCount, VertexAttribPointerType.Float, false, Buffer.ElementSize, 0); GL.EnableVertexAttribArray(VertexAttributeInfo.Index); GL.BindBuffer(BufferTarget.ArrayBuffer, Buffer.Handle); From 02a4fcc1a8420e7bb9c7e92f13a53bcbcb2008ce Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sun, 8 Nov 2020 23:09:38 +0200 Subject: [PATCH 14/52] Shader program clarification --- Examples/Examples/HelloTriangle.cs | 6 +-- .../Shaders/{Program.cs => ShaderProgram.cs} | 4 +- .../Shaders/ProgramExtensions.cs | 16 ++++---- ObjectTK.Extensions/Shaders/ProgramFactory.cs | 38 +++++++++---------- 4 files changed, 32 insertions(+), 32 deletions(-) rename ObjectTK.Data/Shaders/{Program.cs => ShaderProgram.cs} (72%) diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 934316c..35b1221 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -18,7 +18,7 @@ namespace Examples.Examples { [ExampleProject("Hello Triangle")] public class HelloTriangle : ExampleWindow { - private Program ShaderProgram; + private ShaderProgram ShaderProgram; private Buffer<Vector3> VBO; private VertexArrayObject VAO; @@ -65,7 +65,7 @@ protected override void OnLoad() { GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); - ShaderProgram = new Program(ProgramHandle, VertexShader, FragmentShader, new Dictionary<string, UniformInfo> { { "ModelViewProjectionMatrix", UI_InPosition } }, new Dictionary<string, VertexAttributeInfo> { }); + ShaderProgram = new ShaderProgram(ProgramHandle, VertexShader, FragmentShader, new Dictionary<string, UniformInfo> { { "ModelViewProjectionMatrix", UI_InPosition } }, new Dictionary<string, VertexAttributeInfo> { }); GL.DetachShader(ProgramHandle, VertexShader.Handle); GL.DetachShader(ProgramHandle, FragmentShader.Handle); @@ -117,7 +117,7 @@ protected override void OnRenderFrame(FrameEventArgs e) { [ExampleProject("Hello Triangle with extensions")] public class HelloTriangleWithExtensions : ExampleWindow { - private Program<BasicProgram> ShaderProgram; + private ShaderProgram<BasicProgram> ShaderProgram; private Buffer<Vector3> VBO; private VertexArrayObject VAO; diff --git a/ObjectTK.Data/Shaders/Program.cs b/ObjectTK.Data/Shaders/ShaderProgram.cs similarity index 72% rename from ObjectTK.Data/Shaders/Program.cs rename to ObjectTK.Data/Shaders/ShaderProgram.cs index ce269b0..d657726 100644 --- a/ObjectTK.Data/Shaders/Program.cs +++ b/ObjectTK.Data/Shaders/ShaderProgram.cs @@ -4,14 +4,14 @@ namespace ObjectTK.Data.Shaders { - public class Program { + public class ShaderProgram { public int Handle { get; } public VertexShader VertexShader { get; } public FragmentShader FragmentShader { get; } public Dictionary<string, UniformInfo> Uniforms { get; set; } public Dictionary<string, VertexAttributeInfo> VertexAttributes { get; set; } - public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) { + public ShaderProgram(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) { this.Handle = Handle; this.VertexShader = VertexShader; this.FragmentShader = FragmentShader; diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs index 768c544..fdf62bf 100644 --- a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs @@ -10,36 +10,36 @@ namespace ObjectTK.Extensions.Shaders { public static class ProgramExtensions { - public static void Use(this Program Program) { - GL.UseProgram(Program.Handle); + public static void Use(this ShaderProgram shaderProgram) { + GL.UseProgram(shaderProgram.Handle); } } - public class Program<T> : Program where T : class, new() { + public class ShaderProgram<T> : ShaderProgram where T : class, new() { public T Variables { get; set; } internal List<PropertyInfo> UniformInfoProperties { get; set; } internal List<PropertyInfo> VertexAttributeInfoProperties { get; set; } - public Program(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : + public ShaderProgram(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : base(Handle, VertexShader, FragmentShader, Uniforms, VertexAttributes) { } } public class Material<T> where T : class, new() { - public Program<T> Program { get; set; } + public ShaderProgram<T> ShaderProgram { get; set; } public T Variables { get; set; } public Material() { - foreach (PropertyInfo Prop in Program.UniformInfoProperties) { + foreach (PropertyInfo Prop in ShaderProgram.UniformInfoProperties) { Type UniformType = Prop.PropertyType.GetGenericArguments()[0]; object DefaultValue = Activator.CreateInstance(UniformType); - UniformInfo PropValue = Prop.GetValue(Program.Variables) as UniformInfo; + UniformInfo PropValue = Prop.GetValue(ShaderProgram.Variables) as UniformInfo; } } public void Use() { - Program.Use(); + ShaderProgram.Use(); } } diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs index 4da03d5..2820bbe 100644 --- a/ObjectTK.Extensions/Shaders/ProgramFactory.cs +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -15,7 +15,7 @@ public class ProgramFactory { public string BaseDirectory { get; set; } = "./"; public string ShaderExtension { get; set; } = "glsl"; - public Program<T> CreateProgram<T>() where T : class, new() { + public ShaderProgram<T> CreateProgram<T>() where T : class, new() { List<ShaderSourceAttribute> Attributes = typeof(T).GetCustomAttributes<ShaderSourceAttribute>(true).ToList(); List<Shader> Shaders = new List<Shader>(); @@ -49,7 +49,7 @@ public class ProgramFactory { GL.DeleteShader(Shader.Handle); } - Program<T> ShaderProgram = new Program<T>(ProgramHandle, null, null, new Dictionary<string, UniformInfo>(), new Dictionary<string, VertexAttributeInfo>()); + ShaderProgram<T> ShaderProgram = new ShaderProgram<T>(ProgramHandle, null, null, new Dictionary<string, UniformInfo>(), new Dictionary<string, VertexAttributeInfo>()); InitializeProgramVariables(ShaderProgram); return ShaderProgram; @@ -108,33 +108,33 @@ private void ExtractEffects(string EffectFile, string FullSource, Dictionary<str } } - private void InitializeProgramVariables<T>(Program<T> Program) where T : class, new() { + private void InitializeProgramVariables<T>(ShaderProgram<T> shaderProgram) where T : class, new() { - Program.Variables = new T(); + shaderProgram.Variables = new T(); PropertyInfo[] Properties = typeof(T).GetProperties(); - Program.UniformInfoProperties = Properties.Where(Prop => typeof(UniformInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); - Program.VertexAttributeInfoProperties = Properties.Where(Prop => typeof(VertexAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); - - foreach (PropertyInfo Prop in Program.UniformInfoProperties) { - int UniformLocation = GL.GetUniformLocation(Program.Handle, Prop.Name); - GL.GetActiveUniform(Program.Handle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); - UniformInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, UniformLocation, UniformSize, UniformType, UniformLocation > -1) as UniformInfo; - Prop.SetValue(Program.Variables, Value); - Program.Uniforms.Add(Prop.Name, Value); + shaderProgram.UniformInfoProperties = Properties.Where(Prop => typeof(UniformInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); + shaderProgram.VertexAttributeInfoProperties = Properties.Where(Prop => typeof(VertexAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); + + foreach (PropertyInfo Prop in shaderProgram.UniformInfoProperties) { + int UniformLocation = GL.GetUniformLocation(shaderProgram.Handle, Prop.Name); + GL.GetActiveUniform(shaderProgram.Handle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); + UniformInfo Value = Activator.CreateInstance(Prop.PropertyType, shaderProgram.Handle, Prop.Name, UniformLocation, UniformSize, UniformType, UniformLocation > -1) as UniformInfo; + Prop.SetValue(shaderProgram.Variables, Value); + shaderProgram.Uniforms.Add(Prop.Name, Value); } - foreach (PropertyInfo Prop in Program.VertexAttributeInfoProperties) { - int AttribIndex = GL.GetAttribLocation(Program.Handle, Prop.Name); - GL.GetActiveAttrib(Program.Handle, AttribIndex, out int Size, out ActiveAttribType AttribType); + foreach (PropertyInfo Prop in shaderProgram.VertexAttributeInfoProperties) { + int AttribIndex = GL.GetAttribLocation(shaderProgram.Handle, Prop.Name); + GL.GetActiveAttrib(shaderProgram.Handle, AttribIndex, out int Size, out ActiveAttribType AttribType); VertexAttribAttribute Attribute = Prop.GetCustomAttribute<VertexAttribAttribute>(); if(Attribute == null) { throw new Exception($"VertexAttributeInfo {typeof(T).FullName}.{Prop.Name} is not decorated with the 'VertexAttrib' Attribute, which is necessary for some metadata as it cannot be determined by the shader itself."); } VertexAttribPointerType VertexAttribPointerType = Attribute.VertexAttribPointerType; - VertexAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, Program.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, VertexAttribPointerType, false) as VertexAttributeInfo; - Prop.SetValue(Program.Variables, Value); - Program.VertexAttributes.Add(Prop.Name, Value); + VertexAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, shaderProgram.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, VertexAttribPointerType, false) as VertexAttributeInfo; + Prop.SetValue(shaderProgram.Variables, Value); + shaderProgram.VertexAttributes.Add(Prop.Name, Value); } } From 6c36dff457dfcfc510ed3b2d27d04a554e7e9ad3 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sun, 8 Nov 2020 23:10:52 +0200 Subject: [PATCH 15/52] Rename to shaderstage --- Examples/Examples/HelloTriangle.cs | 26 +++++++++---------- ObjectTK.Data/Shaders/ShaderProgram.cs | 10 +++---- ObjectTK.Data/Shaders/Shaders.cs | 12 ++++----- .../Shaders/ProgramExtensions.cs | 4 +-- ObjectTK.Extensions/Shaders/ProgramFactory.cs | 8 +++--- .../Shaders/ShaderExtensions.cs | 16 ++++++------ 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 35b1221..21dbcdd 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -46,18 +46,18 @@ void main() protected override void OnLoad() { base.OnLoad(); - VertexShader VertexShader = new VertexShader(GL.CreateShader(ShaderType.VertexShader), null); - FragmentShader FragmentShader = new FragmentShader(GL.CreateShader(ShaderType.FragmentShader), null); + VertexShaderStage vertexShaderStage = new VertexShaderStage(GL.CreateShader(ShaderType.VertexShader), null); + FragmentShaderStage fragmentShaderStage = new FragmentShaderStage(GL.CreateShader(ShaderType.FragmentShader), null); - GL.ShaderSource(VertexShader.Handle, VertSource); - GL.ShaderSource(FragmentShader.Handle, FragSource); - GL.CompileShader(VertexShader.Handle); - GL.CompileShader(FragmentShader.Handle); + GL.ShaderSource(vertexShaderStage.Handle, VertSource); + GL.ShaderSource(fragmentShaderStage.Handle, FragSource); + GL.CompileShader(vertexShaderStage.Handle); + GL.CompileShader(fragmentShaderStage.Handle); int ProgramHandle = GL.CreateProgram(); - GL.AttachShader(ProgramHandle, VertexShader.Handle); - GL.AttachShader(ProgramHandle, FragmentShader.Handle); + GL.AttachShader(ProgramHandle, vertexShaderStage.Handle); + GL.AttachShader(ProgramHandle, fragmentShaderStage.Handle); GL.LinkProgram(ProgramHandle); @@ -65,12 +65,12 @@ protected override void OnLoad() { GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); - ShaderProgram = new ShaderProgram(ProgramHandle, VertexShader, FragmentShader, new Dictionary<string, UniformInfo> { { "ModelViewProjectionMatrix", UI_InPosition } }, new Dictionary<string, VertexAttributeInfo> { }); + ShaderProgram = new ShaderProgram(ProgramHandle, vertexShaderStage, fragmentShaderStage, new Dictionary<string, UniformInfo> { { "ModelViewProjectionMatrix", UI_InPosition } }, new Dictionary<string, VertexAttributeInfo> { }); - GL.DetachShader(ProgramHandle, VertexShader.Handle); - GL.DetachShader(ProgramHandle, FragmentShader.Handle); - GL.DeleteShader(VertexShader.Handle); - GL.DeleteShader(FragmentShader.Handle); + GL.DetachShader(ProgramHandle, vertexShaderStage.Handle); + GL.DetachShader(ProgramHandle, fragmentShaderStage.Handle); + GL.DeleteShader(vertexShaderStage.Handle); + GL.DeleteShader(fragmentShaderStage.Handle); GL.UseProgram(ProgramHandle); diff --git a/ObjectTK.Data/Shaders/ShaderProgram.cs b/ObjectTK.Data/Shaders/ShaderProgram.cs index d657726..0c6ecc8 100644 --- a/ObjectTK.Data/Shaders/ShaderProgram.cs +++ b/ObjectTK.Data/Shaders/ShaderProgram.cs @@ -6,15 +6,15 @@ namespace ObjectTK.Data.Shaders { public class ShaderProgram { public int Handle { get; } - public VertexShader VertexShader { get; } - public FragmentShader FragmentShader { get; } + public VertexShaderStage VertexShaderStage { get; } + public FragmentShaderStage FragmentShaderStage { get; } public Dictionary<string, UniformInfo> Uniforms { get; set; } public Dictionary<string, VertexAttributeInfo> VertexAttributes { get; set; } - public ShaderProgram(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) { + public ShaderProgram(int Handle, VertexShaderStage vertexShaderStage, FragmentShaderStage fragmentShaderStage, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) { this.Handle = Handle; - this.VertexShader = VertexShader; - this.FragmentShader = FragmentShader; + this.VertexShaderStage = vertexShaderStage; + this.FragmentShaderStage = fragmentShaderStage; this.Uniforms = Uniforms; this.VertexAttributes = VertexAttributes; } diff --git a/ObjectTK.Data/Shaders/Shaders.cs b/ObjectTK.Data/Shaders/Shaders.cs index 3e80640..d272646 100644 --- a/ObjectTK.Data/Shaders/Shaders.cs +++ b/ObjectTK.Data/Shaders/Shaders.cs @@ -1,26 +1,26 @@ using OpenTK.Graphics.OpenGL; namespace ObjectTK.Data.Shaders { - public abstract class Shader { + public abstract class ShaderStage { public int Handle { get; } public string Source { get; } public abstract ShaderType ShaderType { get; } - public Shader(int Handle, string Source) { + public ShaderStage(int Handle, string Source) { this.Handle = Handle; this.Source = Source; } } - public class VertexShader : Shader { + public class VertexShaderStage : ShaderStage { public override ShaderType ShaderType => ShaderType.VertexShader; - public VertexShader(int Handle, string Source) : base(Handle, Source) { + public VertexShaderStage(int Handle, string Source) : base(Handle, Source) { } } - public class FragmentShader : Shader { + public class FragmentShaderStage : ShaderStage { public override ShaderType ShaderType => ShaderType.FragmentShader; - public FragmentShader(int Handle, string Source) : base(Handle, Source) { + public FragmentShaderStage(int Handle, string Source) : base(Handle, Source) { } diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs index fdf62bf..b8f43d3 100644 --- a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs @@ -20,8 +20,8 @@ public static void Use(this ShaderProgram shaderProgram) { internal List<PropertyInfo> UniformInfoProperties { get; set; } internal List<PropertyInfo> VertexAttributeInfoProperties { get; set; } - public ShaderProgram(int Handle, VertexShader VertexShader, FragmentShader FragmentShader, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : - base(Handle, VertexShader, FragmentShader, Uniforms, VertexAttributes) { + public ShaderProgram(int Handle, VertexShaderStage vertexShaderStage, FragmentShaderStage fragmentShaderStage, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : + base(Handle, vertexShaderStage, fragmentShaderStage, Uniforms, VertexAttributes) { } } diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs index 2820bbe..1c697cb 100644 --- a/ObjectTK.Extensions/Shaders/ProgramFactory.cs +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -18,7 +18,7 @@ public class ProgramFactory { public ShaderProgram<T> CreateProgram<T>() where T : class, new() { List<ShaderSourceAttribute> Attributes = typeof(T).GetCustomAttributes<ShaderSourceAttribute>(true).ToList(); - List<Shader> Shaders = new List<Shader>(); + List<ShaderStage> Shaders = new List<ShaderStage>(); int ProgramHandle = GL.CreateProgram(); @@ -32,10 +32,10 @@ public class ProgramFactory { switch (Attribute.Type) { case ShaderType.FragmentShader: - Shaders.Add(new FragmentShader(ShaderHandle, Source)); + Shaders.Add(new FragmentShaderStage(ShaderHandle, Source)); break; case ShaderType.VertexShader: - Shaders.Add(new VertexShader(ShaderHandle, Source)); + Shaders.Add(new VertexShaderStage(ShaderHandle, Source)); break; default: break; @@ -44,7 +44,7 @@ public class ProgramFactory { GL.LinkProgram(ProgramHandle); - foreach (Shader Shader in Shaders) { + foreach (ShaderStage Shader in Shaders) { GL.DetachShader(ProgramHandle, Shader.Handle); GL.DeleteShader(Shader.Handle); } diff --git a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs index 5e340e3..7a3f1d6 100644 --- a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs @@ -4,26 +4,26 @@ namespace ObjectTK.Extensions.Shaders { public static class ShaderFactory { - public static VertexShader CreateVertexShader(string Source) { + public static VertexShaderStage CreateVertexShader(string Source) { int Handle = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(Handle, Source); GL.CompileShader(Handle); - return new VertexShader(Handle, Source); + return new VertexShaderStage(Handle, Source); } - public static FragmentShader CreateFragmentShader(string Source) { + public static FragmentShaderStage CreateFragmentShader(string Source) { int Handle = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(Handle, Source); GL.CompileShader(Handle); - return new FragmentShader(Handle, Source); + return new FragmentShaderStage(Handle, Source); } } public static class ShaderExtensions { - public static void Compile(this Shader Shader) { - GL.CompileShader(Shader.Handle); + public static void Compile(this ShaderStage shaderStage) { + GL.CompileShader(shaderStage.Handle); } - public static void ShaderSource(this Shader Shader) { - GL.ShaderSource(Shader.Handle, Shader.Source); + public static void ShaderSource(this ShaderStage shaderStage) { + GL.ShaderSource(shaderStage.Handle, shaderStage.Source); } } } From d4a8400538f843f09315ec2dc8cf0e41967da563 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Mon, 9 Nov 2020 01:02:35 +0200 Subject: [PATCH 16/52] Huge rework after meeting --- .../ExtensionPrograms/BasicProgram.cs | 7 +- Examples/Examples/HelloTriangle.cs | 95 ++---------------- .../Examples/HelloTriangleWithExtensions.cs | 67 +++++++++++++ ObjectTK.Data/AttributeExtensions.cs | 62 ++++++++++++ ObjectTK.Data/Buffers/Buffer.cs | 6 +- ObjectTK.Data/ObjectTK.Data.csproj | 1 + ObjectTK.Data/Shaders/ShaderCompiler.cs | 97 +++++++++++++++++++ ObjectTK.Data/Shaders/ShaderProgram.cs | 27 +++--- ObjectTK.Data/Shaders/ShaderStage.cs | 18 ++++ ObjectTK.Data/Shaders/Shaders.cs | 28 ------ .../Variables/ShaderAttributeInfo.cs | 25 +++++ ObjectTK.Data/Variables/ShaderUniformInfo.cs | 23 +++++ ObjectTK.Data/Variables/UniformInfo.cs | 20 ---- .../Variables/VertexAttributeInfo.cs | 26 ----- .../Buffers/BufferExtensions.cs | 4 +- .../Buffers/VertexArrayExtensions.cs | 9 +- ObjectTK.Extensions/Shaders/Material.cs | 44 +++++++++ .../Shaders/ProgramExtensions.cs | 27 +----- ObjectTK.Extensions/Shaders/ProgramFactory.cs | 16 +-- .../Shaders/ShaderExtensions.cs | 20 ++-- .../Variables/UniformInfoExtensions.cs | 10 +- .../VertexAttributeInfoExtensions.cs | 12 +-- 22 files changed, 407 insertions(+), 237 deletions(-) create mode 100644 Examples/Examples/HelloTriangleWithExtensions.cs create mode 100644 ObjectTK.Data/AttributeExtensions.cs create mode 100644 ObjectTK.Data/Shaders/ShaderCompiler.cs create mode 100644 ObjectTK.Data/Shaders/ShaderStage.cs delete mode 100644 ObjectTK.Data/Shaders/Shaders.cs create mode 100644 ObjectTK.Data/Variables/ShaderAttributeInfo.cs create mode 100644 ObjectTK.Data/Variables/ShaderUniformInfo.cs delete mode 100644 ObjectTK.Data/Variables/UniformInfo.cs delete mode 100644 ObjectTK.Data/Variables/VertexAttributeInfo.cs create mode 100644 ObjectTK.Extensions/Shaders/Material.cs diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/Examples/Examples/ExtensionPrograms/BasicProgram.cs index 57ea324..344a269 100644 --- a/Examples/Examples/ExtensionPrograms/BasicProgram.cs +++ b/Examples/Examples/ExtensionPrograms/BasicProgram.cs @@ -1,4 +1,5 @@ -using ObjectTK.Extensions.Shaders; +using ObjectTK.Data.Variables; +using ObjectTK.Extensions.Shaders; using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; @@ -9,7 +10,7 @@ namespace Examples.Examples.Programs { [FragmentShaderSource("BasicShader.Fragment")] public class BasicProgram { [VertexAttrib(VertexAttribPointerType.Float)] - public VertexAttributeInfo<Vector3> InPosition { get; set; } - public UniformInfo<Matrix4> ModelViewProjectionMatrix { get; set; } + public ShaderAttributeInfo InPosition { get; set; } + public ShaderUniformInfo<Matrix4> ModelViewProjectionMatrix { get; set; } } } diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 21dbcdd..f018c91 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -2,13 +2,9 @@ using System; using System.Collections.Generic; using System.Drawing; -using Examples.Examples.Programs; using ObjectTK.Data.Buffers; using ObjectTK.Data.Shaders; using ObjectTK.Data.Variables; -using ObjectTK.Extensions.Buffers; -using ObjectTK.Extensions.Shaders; -using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; @@ -46,40 +42,16 @@ void main() protected override void OnLoad() { base.OnLoad(); - VertexShaderStage vertexShaderStage = new VertexShaderStage(GL.CreateShader(ShaderType.VertexShader), null); - FragmentShaderStage fragmentShaderStage = new FragmentShaderStage(GL.CreateShader(ShaderType.FragmentShader), null); + var shaderProgram = ShaderCompiler.VertexFrag("Solid Color", VertSource, FragSource); + GL.UseProgram(shaderProgram.Handle); + ShaderProgram = shaderProgram; - GL.ShaderSource(vertexShaderStage.Handle, VertSource); - GL.ShaderSource(fragmentShaderStage.Handle, FragSource); - GL.CompileShader(vertexShaderStage.Handle); - GL.CompileShader(fragmentShaderStage.Handle); + var vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - int ProgramHandle = GL.CreateProgram(); - - GL.AttachShader(ProgramHandle, vertexShaderStage.Handle); - GL.AttachShader(ProgramHandle, fragmentShaderStage.Handle); - - GL.LinkProgram(ProgramHandle); - - int UniformLocation = GL.GetUniformLocation(ProgramHandle, "ModelViewProjectionMatrix"); - GL.GetActiveUniform(ProgramHandle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); - UniformInfo UI_InPosition = new UniformInfo(ProgramHandle, "ModelViewProjectionMatrix", UniformLocation, UniformSize, UniformType, UniformLocation > -1); - - ShaderProgram = new ShaderProgram(ProgramHandle, vertexShaderStage, fragmentShaderStage, new Dictionary<string, UniformInfo> { { "ModelViewProjectionMatrix", UI_InPosition } }, new Dictionary<string, VertexAttributeInfo> { }); - - GL.DetachShader(ProgramHandle, vertexShaderStage.Handle); - GL.DetachShader(ProgramHandle, fragmentShaderStage.Handle); - GL.DeleteShader(vertexShaderStage.Handle); - GL.DeleteShader(fragmentShaderStage.Handle); - - GL.UseProgram(ProgramHandle); - - var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - - VBO = new Buffer<Vector3>(GL.GenBuffer()); + VBO = new Buffer<Vector3>(GL.GenBuffer(), 0); VBO.ElementCount = 3; GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); - GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, Vertices, BufferUsageHint.StaticDraw); + GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, vertices, BufferUsageHint.StaticDraw); VAO = new VertexArrayObject(GL.GenVertexArray()); GL.BindVertexArray(VAO.Handle); @@ -113,59 +85,4 @@ protected override void OnRenderFrame(FrameEventArgs e) { SwapBuffers(); } } - - [ExampleProject("Hello Triangle with extensions")] - public class HelloTriangleWithExtensions : ExampleWindow { - - private ShaderProgram<BasicProgram> ShaderProgram; - private Buffer<Vector3> VBO; - private VertexArrayObject VAO; - - protected override void OnLoad() { - base.OnLoad(); - - ShaderProgram = new ProgramFactory() { BaseDirectory = "./Data/Shaders/" }.CreateProgram<BasicProgram>(); - ShaderProgram.Use(); - - var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - - VBO = new Buffer<Vector3>(GL.GenBuffer()); - VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); - - VAO = new VertexArrayObject(GL.GenVertexArray()); - VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); - - ActiveCamera.Position = new Vector3(0, 0, 3); - - GL.ClearColor(Color.MidnightBlue); - } - - private void OnUnload(object sender, EventArgs e) { - base.OnUnload(); - - GL.DeleteProgram(ShaderProgram.Handle); - GL.DeleteVertexArray(VAO.Handle); - GL.DeleteBuffer(VBO.Handle); - } - - protected override void OnRenderFrame(FrameEventArgs e) { - base.OnRenderFrame(e); - GL.Viewport(0, 0, Size.X, Size.Y); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - for (int X = 0; X < 20; X++) { - for (int Y = 0; Y < 20; Y++) { - for (int Z = 0; Z < 20; Z++) { - - Matrix4 MVP = Matrix4.CreateTranslation(new Vector3(X * 2, Y * 2, Z * 2)) * ActiveCamera.ViewProjectionMatrix; - ShaderProgram.Variables.ModelViewProjectionMatrix.Set(MVP); - GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); - - } - } - } - - SwapBuffers(); - } - } } diff --git a/Examples/Examples/HelloTriangleWithExtensions.cs b/Examples/Examples/HelloTriangleWithExtensions.cs new file mode 100644 index 0000000..20d2ab7 --- /dev/null +++ b/Examples/Examples/HelloTriangleWithExtensions.cs @@ -0,0 +1,67 @@ +using System; +using System.Drawing; +using Examples.Examples.Programs; +using ObjectTK.Data.Buffers; +using ObjectTK.Extensions.Buffers; +using ObjectTK.Extensions.Shaders; +using ObjectTK.Extensions.Variables; +using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; +using OpenTK.Windowing.Common; + +namespace Examples.Examples { + [ExampleProject("Hello Triangle with extensions")] + public class HelloTriangleWithExtensions : ExampleWindow { + + private ShaderProgram<BasicProgram> ShaderProgram; + private Buffer<Vector3> VBO; + private VertexArrayObject VAO; + + protected override void OnLoad() { + base.OnLoad(); + + ShaderProgram = new ProgramFactory() { BaseDirectory = "./Data/Shaders/" }.CreateProgram<BasicProgram>(); + ShaderProgram.Use(); + + var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; + + VBO = new Buffer<Vector3>(GL.GenBuffer(), 0); + VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); + + VAO = new VertexArrayObject(GL.GenVertexArray()); + VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); + + ActiveCamera.Position = new Vector3(0, 0, 3); + + GL.ClearColor(Color.MidnightBlue); + } + + private void OnUnload(object sender, EventArgs e) { + base.OnUnload(); + + GL.DeleteProgram(ShaderProgram.Handle); + GL.DeleteVertexArray(VAO.Handle); + GL.DeleteBuffer(VBO.Handle); + } + + protected override void OnRenderFrame(FrameEventArgs e) { + base.OnRenderFrame(e); + GL.Viewport(0, 0, Size.X, Size.Y); + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + + for (int X = 0; X < 20; X++) { + for (int Y = 0; Y < 20; Y++) { + for (int Z = 0; Z < 20; Z++) { + + Matrix4 MVP = Matrix4.CreateTranslation(new Vector3(X * 2, Y * 2, Z * 2)) * ActiveCamera.ViewProjectionMatrix; + ShaderProgram.Variables.ModelViewProjectionMatrix.Set(MVP); + GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); + + } + } + } + + SwapBuffers(); + } + } +} diff --git a/ObjectTK.Data/AttributeExtensions.cs b/ObjectTK.Data/AttributeExtensions.cs new file mode 100644 index 0000000..91a2381 --- /dev/null +++ b/ObjectTK.Data/AttributeExtensions.cs @@ -0,0 +1,62 @@ +using System; +using OpenTK.Graphics.OpenGL; +using AAT = OpenTK.Graphics.OpenGL.ActiveAttribType; +using VAPT = OpenTK.Graphics.OpenGL.VertexAttribPointerType; + + +namespace ObjectTK.Data { + public static class AttributeExtensions { + + public static VAPT ToVertexAttribPointerType(this AAT attrib) { + switch (attrib) { + // + case AAT.Int: + case AAT.IntVec2: + case AAT.IntVec3: + case AAT.IntVec4: + return VAPT.Int; + // + case AAT.UnsignedInt: + case AAT.UnsignedIntVec2: + case AAT.UnsignedIntVec3: + case AAT.UnsignedIntVec4: + return VAPT.UnsignedInt; + // + case AAT.Float: + case AAT.FloatVec2: + case AAT.FloatVec3: + case AAT.FloatVec4: + case AAT.FloatMat2: + case AAT.FloatMat3: + case AAT.FloatMat4: + case AAT.FloatMat2x3: + case AAT.FloatMat2x4: + case AAT.FloatMat3x2: + case AAT.FloatMat3x4: + case AAT.FloatMat4x2: + case AAT.FloatMat4x3: + return VAPT.Float; + // + case AAT.Double: + case AAT.DoubleMat2: + case AAT.DoubleMat3: + case AAT.DoubleMat4: + case AAT.DoubleMat2x3: + case AAT.DoubleMat2x4: + case AAT.DoubleMat3x2: + case AAT.DoubleMat3x4: + case AAT.DoubleMat4x2: + case AAT.DoubleMat4x3: + case AAT.DoubleVec2: + case AAT.DoubleVec3: + case AAT.DoubleVec4: + return VAPT.Double; + case AAT.None: + throw new ArgumentOutOfRangeException(nameof(attrib), attrib, $"{nameof(ActiveAttribType.None)} does not have a valid conversion."); + default: + throw new ArgumentOutOfRangeException(nameof(attrib), attrib, null); + } + } + + } +} diff --git a/ObjectTK.Data/Buffers/Buffer.cs b/ObjectTK.Data/Buffers/Buffer.cs index ed46a0a..305a834 100644 --- a/ObjectTK.Data/Buffers/Buffer.cs +++ b/ObjectTK.Data/Buffers/Buffer.cs @@ -1,5 +1,9 @@ -namespace ObjectTK.Data.Buffers { +using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; +using GL = OpenTK.Graphics.ES11.GL; +namespace ObjectTK.Data.Buffers { + /// Corresponds to an OpenGL Buffer. /// Typically this is a vertex/index/whatever buffer. public class Buffer<T> where T : unmanaged { diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Data/ObjectTK.Data.csproj index 58aa62e..dcadcac 100644 --- a/ObjectTK.Data/ObjectTK.Data.csproj +++ b/ObjectTK.Data/ObjectTK.Data.csproj @@ -6,6 +6,7 @@ </PropertyGroup> <ItemGroup> + <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> <PackageReference Include="OpenTK" Version="4.0.6" /> </ItemGroup> diff --git a/ObjectTK.Data/Shaders/ShaderCompiler.cs b/ObjectTK.Data/Shaders/ShaderCompiler.cs new file mode 100644 index 0000000..049be0b --- /dev/null +++ b/ObjectTK.Data/Shaders/ShaderCompiler.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using ObjectTK.Data.Variables; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Shaders { + + public static class ShaderCompiler { + + + /// Helper method that compiles a shader stage (part of a ShaderProgram) or throws an exception if failure occurs. + [MustUseReturnValue] + [NotNull] + public static ShaderStage CompileShaderStage(ShaderType shaderType, string name, string source) + { + var handle = GL.CreateShader(shaderType); + var objLabel = $"ShaderStage: {name}-{shaderType}"; + GL.ObjectLabel(ObjectLabelIdentifier.Shader, handle, objLabel.Length, objLabel); + GL.ShaderSource(handle, source); + GL.CompileShader(handle); + GL.GetShader(handle, ShaderParameter.CompileStatus, out var compileStatus); + if (compileStatus == 0) + { + var vertLog = GL.GetShaderInfoLog(handle); + //TODO: needs a proper exception type. + var msg = $"Failed to compile shader '{name}' of type {shaderType}. Error:\n{vertLog}"; + throw new Exception(msg); + } + return new ShaderStage(shaderType, handle, source); + } + + + /// Shader Handle (int) -> ShaderProgram class. + [NotNull] + [MustUseReturnValue] + public static ShaderProgram Introspect(int prog, ShaderStage[] stages) { + // inspect the attributes: + var attributes = new Dictionary<string, ShaderAttributeInfo>(StringComparer.Ordinal); + + GL.GetProgram(prog, GetProgramParameterName.ActiveAttributes, out var attribCount); + for (var i = 0; i < attribCount; i++) + { + var attrName = GL.GetActiveAttrib(prog, i, out var count, out var attrType); + var attrLoc = GL.GetAttribLocation(prog, attrName); + attributes[attrName] = new ShaderAttributeInfo() { + Name = attrName, + Location = attrLoc, + Size = count, + ActiveAttribType = attrType, + }; + GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); + } + + // inspect the uniforms + var uniforms = new Dictionary<string, ShaderUniformInfo>(StringComparer.Ordinal); + + GL.GetProgram(prog, GetProgramParameterName.ActiveUniforms, out var uniformCount); + for (var i = 0; i < uniformCount; i++) + { + var uniName = GL.GetActiveUniform(prog, i, out var uniSize, out var uniType); + var uniLoc = GL.GetUniformLocation(prog, uniName); + uniforms[uniName] = new ShaderUniformInfo(uniName, uniLoc, uniSize, uniType); + } + + return new ShaderProgram(prog, stages, uniforms, attributes); + } + + [MustUseReturnValue] + [NotNull] + public static ShaderProgram VertexFrag(string name, string vertSource, string fragSource) { + + var vert = CompileShaderStage(ShaderType.VertexShader, name, vertSource); + var frag = CompileShaderStage(ShaderType.FragmentShader, name, fragSource); + var stages = new[] {vert, frag}; + + int handle = GL.CreateProgram(); + var label = $"ShaderProgram: {name}"; + GL.ObjectLabel(ObjectLabelIdentifier.Program, handle, label.Length, label); + + GL.AttachShader(handle, vert.Handle); + GL.AttachShader(handle, frag.Handle); + GL.LinkProgram(handle); + + GL.GetProgram(handle, GetProgramParameterName.LinkStatus, out int linkStatus); + if (linkStatus == 0) + { + var linkLog = GL.GetProgramInfoLog(handle); + //TODO: needs a proper exception type. + var msg = $"Failed to link shader '{name}'. Error:\n{linkLog}"; + throw new Exception(msg); + } + + return Introspect(handle, stages); + } + } +} diff --git a/ObjectTK.Data/Shaders/ShaderProgram.cs b/ObjectTK.Data/Shaders/ShaderProgram.cs index 0c6ecc8..0bd3583 100644 --- a/ObjectTK.Data/Shaders/ShaderProgram.cs +++ b/ObjectTK.Data/Shaders/ShaderProgram.cs @@ -1,22 +1,27 @@ using ObjectTK.Data.Variables; using System.Collections.Generic; -using System.Collections.Immutable; namespace ObjectTK.Data.Shaders { + /// See: https://www.khronos.org/opengl/wiki/Shader public class ShaderProgram { + /// The OpenGL Handle public int Handle { get; } - public VertexShaderStage VertexShaderStage { get; } - public FragmentShaderStage FragmentShaderStage { get; } - public Dictionary<string, UniformInfo> Uniforms { get; set; } - public Dictionary<string, VertexAttributeInfo> VertexAttributes { get; set; } + /// The individual stages making up this program in the order they are used. + public ShaderStage[] Stages { get; set; } + /// The uniforms on this shader. + public Dictionary<string, ShaderUniformInfo> Uniforms { get; set; } + /// The vertex attributes on this shader. + public Dictionary<string, ShaderAttributeInfo> Attributes { get; set; } - public ShaderProgram(int Handle, VertexShaderStage vertexShaderStage, FragmentShaderStage fragmentShaderStage, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) { - this.Handle = Handle; - this.VertexShaderStage = vertexShaderStage; - this.FragmentShaderStage = fragmentShaderStage; - this.Uniforms = Uniforms; - this.VertexAttributes = VertexAttributes; + public ShaderProgram(int handle, + ShaderStage[] stages, + Dictionary<string, ShaderUniformInfo> uniforms, + Dictionary<string, ShaderAttributeInfo> attributes) { + Handle = handle; + Stages = stages; + Uniforms = uniforms; + Attributes = attributes; } } } diff --git a/ObjectTK.Data/Shaders/ShaderStage.cs b/ObjectTK.Data/Shaders/ShaderStage.cs new file mode 100644 index 0000000..0ec84f6 --- /dev/null +++ b/ObjectTK.Data/Shaders/ShaderStage.cs @@ -0,0 +1,18 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Shaders { + /// https://www.khronos.org/opengl/wiki/Shader#Stages + public class ShaderStage { + + public string Name { get; } + public ShaderType Type { get; } + public int Handle { get; } + public string Source { get; } + + public ShaderStage(ShaderType type, int handle, string source) { + Type = type; + Handle = handle; + Source = source; + } + } +} diff --git a/ObjectTK.Data/Shaders/Shaders.cs b/ObjectTK.Data/Shaders/Shaders.cs deleted file mode 100644 index d272646..0000000 --- a/ObjectTK.Data/Shaders/Shaders.cs +++ /dev/null @@ -1,28 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Shaders { - public abstract class ShaderStage { - public int Handle { get; } - public string Source { get; } - public abstract ShaderType ShaderType { get; } - - public ShaderStage(int Handle, string Source) { - this.Handle = Handle; - this.Source = Source; - } - } - public class VertexShaderStage : ShaderStage { - public override ShaderType ShaderType => ShaderType.VertexShader; - public VertexShaderStage(int Handle, string Source) : base(Handle, Source) { - - } - } - - public class FragmentShaderStage : ShaderStage { - public override ShaderType ShaderType => ShaderType.FragmentShader; - public FragmentShaderStage(int Handle, string Source) : base(Handle, Source) { - - } - - } -} diff --git a/ObjectTK.Data/Variables/ShaderAttributeInfo.cs b/ObjectTK.Data/Variables/ShaderAttributeInfo.cs new file mode 100644 index 0000000..579f148 --- /dev/null +++ b/ObjectTK.Data/Variables/ShaderAttributeInfo.cs @@ -0,0 +1,25 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Variables { + public class ShaderAttributeInfo { + public string Name { get; set; } + public int Location { get; set; } + /// The size of the attribute, in units of the attribute type. + public int Size { get; set; } + /// + public ActiveAttribType ActiveAttribType { get; set; } + + public VertexAttribPointerType VertexAttribPointerType => ActiveAttribType.ToVertexAttribPointerType(); + + // + // public ShaderAttributeInfo(string name, int index, int components, ActiveAttribType activeAttribType, VertexAttribPointerType vertexAttribPointerType, bool normalized) { + // this.Name = name; + // this.Index = index; + // this.Components = components; + // this.ActiveAttribType = activeAttribType; + // this.VertexAttribPointerType = vertexAttribPointerType; + // this.Normalized = normalized; + // } + } + +} diff --git a/ObjectTK.Data/Variables/ShaderUniformInfo.cs b/ObjectTK.Data/Variables/ShaderUniformInfo.cs new file mode 100644 index 0000000..cb05b47 --- /dev/null +++ b/ObjectTK.Data/Variables/ShaderUniformInfo.cs @@ -0,0 +1,23 @@ +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK.Data.Variables { + public class ShaderUniformInfo { + //TODO FIXME: Name[] for array uniform variables can be challenging. + /// The name of this uniform in the array + public string Name { get; set; } + /// The uniform location. used with GL.SetUniform() + public int Location { get; } + /// If this uniform is an array, then this is the number of items in the array. + public int Size { get; } + /// The data type in the shader for this uniform. + public ActiveUniformType Type { get; } + + public ShaderUniformInfo(string name, int location, + int uniformSize, ActiveUniformType uniformType) { + Name = name; + Location = location; + Size = uniformSize; + Type = uniformType; + } + } +} diff --git a/ObjectTK.Data/Variables/UniformInfo.cs b/ObjectTK.Data/Variables/UniformInfo.cs deleted file mode 100644 index 0284008..0000000 --- a/ObjectTK.Data/Variables/UniformInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Variables { - public class UniformInfo { - public int ProgramHandle { get; } - public string Name { get; set; } - public bool Active { get; set; } - public int Location { get; } - public int Size { get; } - public ActiveUniformType Type { get; } - public UniformInfo(int ProgramHandle, string Name, int Location, int UniformSize, ActiveUniformType UniformType, bool Active) { - this.ProgramHandle = ProgramHandle; - this.Name = Name; - this.Active = Active; - this.Location = Location; - this.Size = UniformSize; - this.Type = UniformType; - } - } -} diff --git a/ObjectTK.Data/Variables/VertexAttributeInfo.cs b/ObjectTK.Data/Variables/VertexAttributeInfo.cs deleted file mode 100644 index e0d5bcb..0000000 --- a/ObjectTK.Data/Variables/VertexAttributeInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using OpenTK.Graphics.OpenGL; - -namespace ObjectTK.Data.Variables { - public class VertexAttributeInfo { - public int ProgramHandle { get; } - public string Name { get; set; } - public bool Active { get; set; } - public int Index { get; set; } - public int Components { get; set; } - public ActiveAttribType ActiveAttribType { get; set; } - public VertexAttribPointerType VertexAttribPointerType { get; set; } - public bool Normalized { get; set; } - - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType ActiveAttribType, VertexAttribPointerType VertexAttribPointerType, bool Normalized) { - this.ProgramHandle = ProgramHandle; - this.Name = Name; - this.Active = Active; - this.Index = Index; - this.Components = Components; - this.ActiveAttribType = ActiveAttribType; - this.VertexAttribPointerType = VertexAttribPointerType; - this.Normalized = Normalized; - } - } - -} diff --git a/ObjectTK.Extensions/Buffers/BufferExtensions.cs b/ObjectTK.Extensions/Buffers/BufferExtensions.cs index 1ac4386..b085ec5 100644 --- a/ObjectTK.Extensions/Buffers/BufferExtensions.cs +++ b/ObjectTK.Extensions/Buffers/BufferExtensions.cs @@ -1,10 +1,10 @@ -using Buffer = ObjectTK.Data.Buffers.Buffer; +using ObjectTK.Data.Buffers; using OpenTK.Graphics.OpenGL; namespace ObjectTK.Extensions.Buffers { public static class BufferExtensions { - public static void BufferData<T>(this Buffer Buffer, BufferTarget BufferTarget, T[] Data, BufferUsageHint BufferUsageHint = BufferUsageHint.StaticDraw) where T : struct { + public static void BufferData<T>(this Buffer<T> Buffer, BufferTarget BufferTarget, T[] Data, BufferUsageHint BufferUsageHint = BufferUsageHint.StaticDraw) where T : unmanaged { Buffer.ElementCount = Data.Length; GL.BindBuffer(BufferTarget, Buffer.Handle); GL.BufferData(BufferTarget, Buffer.ElementSize * Buffer.ElementCount, Data, BufferUsageHint); diff --git a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs index 10aa630..43c7c17 100644 --- a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs +++ b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs @@ -1,5 +1,4 @@ -using Buffer = ObjectTK.Data.Buffers.Buffer; -using ObjectTK.Data.Buffers; +using ObjectTK.Data.Buffers; using OpenTK.Graphics.OpenGL; using ObjectTK.Data.Variables; @@ -10,10 +9,10 @@ public static void Bind(this VertexArrayObject vertexArrayObject) { GL.BindVertexArray(vertexArrayObject.Handle); } - public static void BindVertexAttribute(this VertexArrayObject vertexArrayObject, VertexAttributeInfo VertexAttributeInfo, Buffer Buffer) { + public static void BindVertexAttribute<T>(this VertexArrayObject vertexArrayObject, ShaderAttributeInfo shaderAttributeInfo, Buffer<T> Buffer) where T : unmanaged { vertexArrayObject.Bind(); - GL.VertexAttribPointer(VertexAttributeInfo.Index, Buffer.ElementCount, VertexAttribPointerType.Float, false, Buffer.ElementSize, 0); - GL.EnableVertexAttribArray(VertexAttributeInfo.Index); + GL.VertexAttribPointer(shaderAttributeInfo.Location, Buffer.ElementCount, VertexAttribPointerType.Float, false, Buffer.ElementSize, 0); + GL.EnableVertexAttribArray(shaderAttributeInfo.Location); GL.BindBuffer(BufferTarget.ArrayBuffer, Buffer.Handle); } diff --git a/ObjectTK.Extensions/Shaders/Material.cs b/ObjectTK.Extensions/Shaders/Material.cs new file mode 100644 index 0000000..a61e0cf --- /dev/null +++ b/ObjectTK.Extensions/Shaders/Material.cs @@ -0,0 +1,44 @@ +#region License + +// ObjectTK License +// Copyright (C) 2013-2015 J.C.Bernack +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +#endregion + +using System; +using System.Reflection; +using ObjectTK.Data.Variables; + +namespace ObjectTK.Extensions.Shaders { + public class Material<T> where T : class, new() { + public ShaderProgram<T> ShaderProgram { get; set; } + public T Variables { get; set; } + + public Material() { + + foreach (PropertyInfo Prop in ShaderProgram.UniformInfoProperties) { + Type UniformType = Prop.PropertyType.GetGenericArguments()[0]; + object DefaultValue = Activator.CreateInstance(UniformType); + ShaderUniformInfo PropValue = Prop.GetValue(ShaderProgram.Variables) as ShaderUniformInfo; + } + } + + public void Use() { + ShaderProgram.Use(); + } + + } +} \ No newline at end of file diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs index b8f43d3..3d76803 100644 --- a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs @@ -2,7 +2,6 @@ using ObjectTK.Data.Variables; using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; -using System; using System.Collections.Generic; using System.Reflection; @@ -20,28 +19,10 @@ public static void Use(this ShaderProgram shaderProgram) { internal List<PropertyInfo> UniformInfoProperties { get; set; } internal List<PropertyInfo> VertexAttributeInfoProperties { get; set; } - public ShaderProgram(int Handle, VertexShaderStage vertexShaderStage, FragmentShaderStage fragmentShaderStage, Dictionary<string, UniformInfo> Uniforms, Dictionary<string, VertexAttributeInfo> VertexAttributes) : - base(Handle, vertexShaderStage, fragmentShaderStage, Uniforms, VertexAttributes) { + public ShaderProgram(int handle, ShaderStage[] stages, + Dictionary<string, ShaderUniformInfo> uniforms, + Dictionary<string, ShaderAttributeInfo> attributes) : + base(handle, stages, uniforms, attributes) { } } - - public class Material<T> where T : class, new() { - public ShaderProgram<T> ShaderProgram { get; set; } - public T Variables { get; set; } - - public Material() { - - foreach (PropertyInfo Prop in ShaderProgram.UniformInfoProperties) { - Type UniformType = Prop.PropertyType.GetGenericArguments()[0]; - object DefaultValue = Activator.CreateInstance(UniformType); - UniformInfo PropValue = Prop.GetValue(ShaderProgram.Variables) as UniformInfo; - } - } - - public void Use() { - ShaderProgram.Use(); - } - - } - } diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs index 1c697cb..0a7536a 100644 --- a/ObjectTK.Extensions/Shaders/ProgramFactory.cs +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -32,10 +32,10 @@ public class ProgramFactory { switch (Attribute.Type) { case ShaderType.FragmentShader: - Shaders.Add(new FragmentShaderStage(ShaderHandle, Source)); + Shaders.Add(new ShaderStage(ShaderType.FragmentShader, ShaderHandle, Source)); break; case ShaderType.VertexShader: - Shaders.Add(new VertexShaderStage(ShaderHandle, Source)); + Shaders.Add(new ShaderStage(ShaderType.VertexShader, ShaderHandle, Source)); break; default: break; @@ -49,7 +49,7 @@ public class ProgramFactory { GL.DeleteShader(Shader.Handle); } - ShaderProgram<T> ShaderProgram = new ShaderProgram<T>(ProgramHandle, null, null, new Dictionary<string, UniformInfo>(), new Dictionary<string, VertexAttributeInfo>()); + ShaderProgram<T> ShaderProgram = new ShaderProgram<T>(ProgramHandle, null, new Dictionary<string, ShaderUniformInfo>(), new Dictionary<string, ShaderAttributeInfo>()); InitializeProgramVariables(ShaderProgram); return ShaderProgram; @@ -113,13 +113,13 @@ private void ExtractEffects(string EffectFile, string FullSource, Dictionary<str shaderProgram.Variables = new T(); PropertyInfo[] Properties = typeof(T).GetProperties(); - shaderProgram.UniformInfoProperties = Properties.Where(Prop => typeof(UniformInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); - shaderProgram.VertexAttributeInfoProperties = Properties.Where(Prop => typeof(VertexAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); + shaderProgram.UniformInfoProperties = Properties.Where(Prop => typeof(ShaderUniformInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); + shaderProgram.VertexAttributeInfoProperties = Properties.Where(Prop => typeof(ShaderAttributeInfo).IsAssignableFrom(Prop.PropertyType)).ToList(); foreach (PropertyInfo Prop in shaderProgram.UniformInfoProperties) { int UniformLocation = GL.GetUniformLocation(shaderProgram.Handle, Prop.Name); GL.GetActiveUniform(shaderProgram.Handle, UniformLocation, out int UniformSize, out ActiveUniformType UniformType); - UniformInfo Value = Activator.CreateInstance(Prop.PropertyType, shaderProgram.Handle, Prop.Name, UniformLocation, UniformSize, UniformType, UniformLocation > -1) as UniformInfo; + ShaderUniformInfo Value = Activator.CreateInstance(Prop.PropertyType, shaderProgram.Handle, Prop.Name, UniformLocation, UniformSize, UniformType, UniformLocation > -1) as ShaderUniformInfo; Prop.SetValue(shaderProgram.Variables, Value); shaderProgram.Uniforms.Add(Prop.Name, Value); } @@ -132,9 +132,9 @@ private void ExtractEffects(string EffectFile, string FullSource, Dictionary<str throw new Exception($"VertexAttributeInfo {typeof(T).FullName}.{Prop.Name} is not decorated with the 'VertexAttrib' Attribute, which is necessary for some metadata as it cannot be determined by the shader itself."); } VertexAttribPointerType VertexAttribPointerType = Attribute.VertexAttribPointerType; - VertexAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, shaderProgram.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, VertexAttribPointerType, false) as VertexAttributeInfo; + ShaderAttributeInfo Value = Activator.CreateInstance(Prop.PropertyType, shaderProgram.Handle, Prop.Name, AttribIndex > -1, AttribIndex, Size, AttribType, VertexAttribPointerType, false) as ShaderAttributeInfo; Prop.SetValue(shaderProgram.Variables, Value); - shaderProgram.VertexAttributes.Add(Prop.Name, Value); + shaderProgram.Attributes.Add(Prop.Name, Value); } } diff --git a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs index 7a3f1d6..c490109 100644 --- a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs @@ -4,17 +4,17 @@ namespace ObjectTK.Extensions.Shaders { public static class ShaderFactory { - public static VertexShaderStage CreateVertexShader(string Source) { - int Handle = GL.CreateShader(ShaderType.VertexShader); - GL.ShaderSource(Handle, Source); - GL.CompileShader(Handle); - return new VertexShaderStage(Handle, Source); + public static ShaderStage CreateVertexShader(string Source) { + int handle = GL.CreateShader(ShaderType.VertexShader); + GL.ShaderSource(handle, Source); + GL.CompileShader(handle); + return new ShaderStage(ShaderType.VertexShader, handle, Source); } - public static FragmentShaderStage CreateFragmentShader(string Source) { - int Handle = GL.CreateShader(ShaderType.FragmentShader); - GL.ShaderSource(Handle, Source); - GL.CompileShader(Handle); - return new FragmentShaderStage(Handle, Source); + public static ShaderStage CreateFragmentShader(string Source) { + int handle = GL.CreateShader(ShaderType.FragmentShader); + GL.ShaderSource(handle, Source); + GL.CompileShader(handle); + return new ShaderStage(ShaderType.FragmentShader, handle, Source); } } diff --git a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs index 1415caa..8e128ef 100644 --- a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs @@ -8,17 +8,17 @@ namespace ObjectTK.Extensions.Variables { public static class UniformInfoExtensions { - public static void Set<T>(this UniformInfo<T> Uniform, T Value) { - Uniform.SetAction?.Invoke(Uniform.Location, Value); + public static void Set<T>(this ShaderUniformInfo<T> shaderUniform, T Value) { + shaderUniform.SetAction?.Invoke(shaderUniform.Location, Value); } } - public class UniformInfo<T> : UniformInfo { + public class ShaderUniformInfo<T> : ShaderUniformInfo { internal Action<int, T> SetAction; - public UniformInfo(int ProgramHandle, string Name, int Location, int UniformSize, ActiveUniformType UniformType, bool Active) : - base(ProgramHandle, Name, Location, UniformSize, UniformType, Active) { + public ShaderUniformInfo(int ProgramHandle, string Name, int Location, int UniformSize, ActiveUniformType UniformType, bool Active) : + base(Name, Location, UniformSize, UniformType) { SetAction = UniformSetAction.FindAction<T>(); } diff --git a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs index ee15434..acfd3ae 100644 --- a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs @@ -7,12 +7,12 @@ public static class VertexAttributeInfoExtensions { } - - public class VertexAttributeInfo<T> : VertexAttributeInfo { - public VertexAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType ActiveAttribType, VertexAttribPointerType VertexAttribPointerType, bool Normalized) : - base(ProgramHandle, Name, Active, Index, Components, ActiveAttribType, VertexAttribPointerType, Normalized) { - } - } + // + // public class ShaderAttributeInfo<T> : ShaderAttributeInfo { + // public ShaderAttributeInfo(int ProgramHandle, string Name, bool Active, int Index, int Components, ActiveAttribType ActiveAttribType, VertexAttribPointerType VertexAttribPointerType, bool Normalized) : + // base(Name, Active, Index, Components, ActiveAttribType, VertexAttribPointerType, Normalized) { + // } + // } [AttributeUsage(AttributeTargets.Property)] public class VertexAttribAttribute : Attribute { From 5b1c907b6c349c00f49aff92b52c54bbe22b578a Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 12:03:13 +0200 Subject: [PATCH 17/52] Basic drawing --- Examples/Examples/HelloTriangle.cs | 61 +++--- .../Examples/HelloTriangleWithExtensions.cs | 4 +- ObjectTK.Data/Buffers/Buffer.cs | 106 +++++++++- ObjectTK.Data/Buffers/VertexArrayObject.cs | 9 +- ObjectTK.Data/GLFactory.cs | 199 ++++++++++++++++++ ObjectTK.Data/Shaders/ShaderCompiler.cs | 3 - 6 files changed, 334 insertions(+), 48 deletions(-) create mode 100644 ObjectTK.Data/GLFactory.cs diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index f018c91..57b51a0 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using ObjectTK.Data; using ObjectTK.Data.Buffers; using ObjectTK.Data.Shaders; using ObjectTK.Data.Variables; @@ -12,13 +13,13 @@ namespace Examples.Examples { [ExampleProject("Hello Triangle")] - public class HelloTriangle : ExampleWindow { + public sealed class HelloTriangle : ExampleWindow { - private ShaderProgram ShaderProgram; - private Buffer<Vector3> VBO; - private VertexArrayObject VAO; + private ShaderProgram _shaderProgram; + private Buffer<Vector3> _vbo; + private VertexArrayObject _vao; - private readonly string VertSource = @" + private const string VertSource = @" #version 330 core uniform mat4 ModelViewProjectionMatrix; @@ -28,7 +29,8 @@ void main(void) { gl_Position = ModelViewProjectionMatrix * vec4(InPosition, 1.0); } "; - private readonly string FragSource = @" + + private const string FragSource = @" #version 330 out vec4 FragColor; @@ -42,47 +44,40 @@ void main() protected override void OnLoad() { base.OnLoad(); - var shaderProgram = ShaderCompiler.VertexFrag("Solid Color", VertSource, FragSource); + var shaderProgram = GLFactory.Shader.VertexFrag("Solid Color", VertSource, FragSource); + _shaderProgram = shaderProgram; GL.UseProgram(shaderProgram.Handle); - ShaderProgram = shaderProgram; - + + var vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - - VBO = new Buffer<Vector3>(GL.GenBuffer(), 0); - VBO.ElementCount = 3; - GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); - GL.BufferData(BufferTarget.ArrayBuffer, VBO.ElementSize * VBO.ElementCount, vertices, BufferUsageHint.StaticDraw); - - VAO = new VertexArrayObject(GL.GenVertexArray()); - GL.BindVertexArray(VAO.Handle); - GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); - GL.EnableVertexAttribArray(0); - GL.BindBuffer(BufferTarget.ArrayBuffer, VBO.Handle); - + _vbo = GLFactory.Buffer.ArrayBuffer("Positions", vertices); + _vao = GLFactory.VAO.FromBuffers("Triangle", _vbo); + ActiveCamera.Position = new Vector3(0, 0, 3); GL.ClearColor(Color.MidnightBlue); } - private void OnUnload(object sender, EventArgs e) { - base.OnUnload(); - - GL.DeleteProgram(ShaderProgram.Handle); - GL.DeleteVertexArray(VAO.Handle); - GL.DeleteBuffer(VBO.Handle); - } - protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); GL.Viewport(0, 0, Size.X, Size.Y); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - Matrix4 MVPMatrix = ActiveCamera.ViewProjectionMatrix; - GL.UniformMatrix4(ShaderProgram.Uniforms["ModelViewProjectionMatrix"].Location, false, ref MVPMatrix); - - GL.DrawArrays(PrimitiveType.Triangles, 0, VBO.ElementCount); + var mvpMatrix = ActiveCamera.ViewProjectionMatrix; + GL.UniformMatrix4(_shaderProgram.Uniforms["ModelViewProjectionMatrix"].Location, false, ref mvpMatrix); + GL.BindVertexArray(_vao.Handle); + GL.DrawArrays(PrimitiveType.Triangles, 0, _vao.ElementCount); + GL.BindVertexArray(0); SwapBuffers(); } + + protected override void OnUnload() { + base.OnUnload(); + + GL.DeleteProgram(_shaderProgram.Handle); + GL.DeleteVertexArray(_vao.Handle); + GL.DeleteBuffer(_vbo.Handle); + } } } diff --git a/Examples/Examples/HelloTriangleWithExtensions.cs b/Examples/Examples/HelloTriangleWithExtensions.cs index 20d2ab7..79d1ccc 100644 --- a/Examples/Examples/HelloTriangleWithExtensions.cs +++ b/Examples/Examples/HelloTriangleWithExtensions.cs @@ -25,10 +25,10 @@ protected override void OnLoad() { var Vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - VBO = new Buffer<Vector3>(GL.GenBuffer(), 0); + VBO = new Buffer<Vector3>("Positions", GL.GenBuffer(), 0); VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); - VAO = new VertexArrayObject(GL.GenVertexArray()); + VAO = new VertexArrayObject("Triangle", GL.GenVertexArray(), Vertices.Length); VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); ActiveCamera.Position = new Vector3(0, 0, 3); diff --git a/ObjectTK.Data/Buffers/Buffer.cs b/ObjectTK.Data/Buffers/Buffer.cs index 305a834..42549e6 100644 --- a/ObjectTK.Data/Buffers/Buffer.cs +++ b/ObjectTK.Data/Buffers/Buffer.cs @@ -1,24 +1,112 @@ -using OpenTK.Graphics.OpenGL; +using System; +using System.Collections.Generic; +using System.Drawing; +using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; -using GL = OpenTK.Graphics.ES11.GL; namespace ObjectTK.Data.Buffers { - + /// Corresponds to an OpenGL Buffer. /// Typically this is a vertex/index/whatever buffer. - public class Buffer<T> where T : unmanaged { - + public class Buffer { + /// The name of this buffer + public string Name { get; set; } /// The OpenGL Handle for this. public int Handle { get; } - /// Size in bytes of each element in the buffer. + /// The GL data type (float, int, etc). (Vector2 -> float) + public VertexAttribPointerType AttribType { get; } + /// The number of components in each element. (Vector2 -> 2) + public int ComponentCount { get; } + /// Size in bytes of each element in the buffer (Vector2 -> 8 bytes) public int ElementSize { get; } - /// The number of elements in this buffer. + /// The number of elements in this buffer. (based on the data set in this buffer) public int ElementCount { get; set; } - public unsafe Buffer(int handle, int elementCount) { + public Buffer(string name, int handle, VertexAttribPointerType attribType, int componentCount, int elementSize, int elementCount) { + Name = name; Handle = handle; - ElementSize = sizeof(T); + AttribType = attribType; + ComponentCount = componentCount; + ElementSize = elementSize; ElementCount = elementCount; } } + + internal static class BufferHelper { + internal struct TypeToGLInfoCache { + public VertexAttribPointerType AttribPointerType; + public int ComponentCount; + + public TypeToGLInfoCache(VertexAttribPointerType attribPointerType, int componentCount) { + AttribPointerType = attribPointerType; + ComponentCount = componentCount; + } + } + + private static readonly Dictionary<Type, TypeToGLInfoCache> InfoCache = new Dictionary<Type, TypeToGLInfoCache>(); + + private static void Add<T2>(VertexAttribPointerType vapt, int componentCount) { + InfoCache[typeof(T2)] = new TypeToGLInfoCache(VertexAttribPointerType.Float, 3); + } + + + static BufferHelper() { + Add<byte>(VertexAttribPointerType.Byte, 1); + Add<sbyte>(VertexAttribPointerType.UnsignedByte, 1); + + Add<Color>(VertexAttribPointerType.UnsignedByte, 4); + + Add<short>(VertexAttribPointerType.Short, 1); + Add<ushort>(VertexAttribPointerType.UnsignedShort, 1); + + Add<uint>(VertexAttribPointerType.UnsignedInt, 1); + + Add<int>(VertexAttribPointerType.Int, 1); + Add<Vector2i>(VertexAttribPointerType.Int, 2); + Add<Vector3i>(VertexAttribPointerType.Int, 3); + Add<Vector4i>(VertexAttribPointerType.Int, 4); + + Add<Half>(VertexAttribPointerType.HalfFloat, 1); + Add<Vector2h>(VertexAttribPointerType.HalfFloat, 2); + Add<Vector3h>(VertexAttribPointerType.HalfFloat, 3); + Add<Vector4h>(VertexAttribPointerType.HalfFloat, 4); + + Add<float>(VertexAttribPointerType.Float, 1); + Add<Vector2>(VertexAttribPointerType.Float, 2); + Add<Vector3>(VertexAttribPointerType.Float, 3); + Add<Vector4>(VertexAttribPointerType.Float, 4); + Add<Color4>(VertexAttribPointerType.Float, 4); + + Add<double>(VertexAttribPointerType.Double, 1); + Add<Vector2d>(VertexAttribPointerType.Double, 2); + Add<Vector3d>(VertexAttribPointerType.Double, 3); + Add<Vector4d>(VertexAttribPointerType.Double, 4); + + Add<Quaternion>(VertexAttribPointerType.Float, 4); + Add<Quaterniond>(VertexAttribPointerType.Double, 4); + + // numerics + + Add<System.Numerics.Vector2>(VertexAttribPointerType.Float, 2); + Add<System.Numerics.Vector3>(VertexAttribPointerType.Float, 3); + Add<System.Numerics.Vector4>(VertexAttribPointerType.Float, 4); + + } + + internal static TypeToGLInfoCache GetData<T>() { + return InfoCache[typeof(T)]; + } + } + + /// Corresponds to an OpenGL Buffer. + /// Typically this is a vertex/index/whatever buffer. + /// Strongly typed buffer. This can be upcast to a normal buffer if generic usage is required. + public class Buffer<T> : Buffer where T : unmanaged { + + + public unsafe Buffer(string name, int handle, int elementCount) : base(name, handle, BufferHelper.GetData<T>().AttribPointerType, + BufferHelper.GetData<T>().ComponentCount, sizeof(T), elementCount) { + + } + } } diff --git a/ObjectTK.Data/Buffers/VertexArrayObject.cs b/ObjectTK.Data/Buffers/VertexArrayObject.cs index 301cbe1..268094f 100644 --- a/ObjectTK.Data/Buffers/VertexArrayObject.cs +++ b/ObjectTK.Data/Buffers/VertexArrayObject.cs @@ -3,10 +3,17 @@ /// An OpenGL Vertex array object. public class VertexArrayObject { + /// The name of this object. + public string Name { get; } + /// The OpenGL handle. Use this to interact with OpenGL. public int Handle { get; } + /// The number of elements in this VAO. + public int ElementCount { get; } - public VertexArrayObject(int handle) { + public VertexArrayObject(string name, int handle, int elementCount) { + Name = name; Handle = handle; + ElementCount = elementCount; } } } diff --git a/ObjectTK.Data/GLFactory.cs b/ObjectTK.Data/GLFactory.cs new file mode 100644 index 0000000..f2bba1b --- /dev/null +++ b/ObjectTK.Data/GLFactory.cs @@ -0,0 +1,199 @@ +using System; +using System.ComponentModel; +using JetBrains.Annotations; +using ObjectTK.Data.Buffers; +using ObjectTK.Data.Internal; +using ObjectTK.Data.Shaders; +using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; +using Buffer = ObjectTK.Data.Buffers.Buffer; + +namespace ObjectTK.Data { + + namespace Internal { + + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLShaderFactory { + public static GLShaderFactory Instance { get; } = new GLShaderFactory(); + private GLShaderFactory() { } + + [MustUseReturnValue] + [NotNull] + public ShaderProgram VertexFrag(string name, string vertexSource, string fragSource) { + return ShaderCompiler.VertexFrag(name, vertexSource, fragSource); + } + + // Hide the default members of this object for a cleaner API. + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + public new Type GetType() { + return base.GetType(); + } + + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLBufferFactory { + public static GLBufferFactory Instance { get; } = new GLBufferFactory(); + private GLBufferFactory() { } + + // Hide the default members of this object for a cleaner API. + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + // ReSharper disable once UnusedMember.Global + public new Type GetType() { + return base.GetType(); + } + + + [NotNull] + [MustUseReturnValue] + public Buffer<Vector3> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T: unmanaged { + var vbo = GL.GenBuffer(); + var label = $"Buffer: {name}"; + GL.ObjectLabel(ObjectLabelIdentifier.Buffer, vbo,label.Length, label); + GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); + int elemSize; + unsafe { + elemSize = sizeof(T); + } + GL.BufferData(BufferTarget.ArrayBuffer, elemSize * vertices.Length, vertices, usageHint); + GL.BindBuffer(BufferTarget.ArrayBuffer, 0); + return new Buffer<Vector3>(name, vbo, vertices.Length); + } + } + + + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLVertexArrayObjectFactory { + public static GLVertexArrayObjectFactory Instance { get; } = new GLVertexArrayObjectFactory(); + private GLVertexArrayObjectFactory() { } + + // Hide the default members of this object for a cleaner API. + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + // ReSharper disable once UnusedMember.Global + public new Type GetType() { + return base.GetType(); + } + + [NotNull] + [MustUseReturnValue] + public VertexArrayObject FromBuffers([NotNull] string name, [NotNull] params Buffer[] buffers) { + var length = buffers[0].ElementCount; + #if DEBUG + for (int i = 0; i < buffers.Length; i++) { + var b = buffers[i]; + if (b.ElementCount != length) { + throw new ArgumentException($"The provided buffers must have the same number of elements.\n" + + $"The buffer {b.Name} with length {b.ElementCount} did not match the expected length of {length}"); + } + } + #endif + + + + var vao = GL.GenVertexArray(); + var label = $"VertexArray: {name}"; + GL.ObjectLabel(ObjectLabelIdentifier.VertexArray,vao, name.Length, label); + GL.BindVertexArray(vao); + for (int i = 0; i < buffers.Length; i++) { + var buffer = buffers[i]; + GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Handle); + GL.EnableVertexAttribArray(i); + GL.VertexAttribPointer(i, buffer.ComponentCount, buffer.AttribType, false, buffer.ElementSize,0); + } + // clean up: + GL.BindBuffer(BufferTarget.ArrayBuffer, 0); + GL.BindVertexArray(0); + + return new VertexArrayObject(name, vao, length); + } + + + } + + } + + /// Top-level class responsible for creating all OpenGL objects. + /// ------ + /// Usage: GLFactory.Shader.VertexFrag() + public static class GLFactory { + + public static readonly GLShaderFactory Shader = GLShaderFactory.Instance; + public static readonly GLBufferFactory Buffer = GLBufferFactory.Instance; + public static readonly GLVertexArrayObjectFactory VertexArrayObject = GLVertexArrayObjectFactory.Instance; + /// Alias for VertexArrayObject + // ReSharper disable once InconsistentNaming + public static readonly GLVertexArrayObjectFactory VAO = VertexArrayObject; + + } + + +} diff --git a/ObjectTK.Data/Shaders/ShaderCompiler.cs b/ObjectTK.Data/Shaders/ShaderCompiler.cs index 049be0b..8c310f7 100644 --- a/ObjectTK.Data/Shaders/ShaderCompiler.cs +++ b/ObjectTK.Data/Shaders/ShaderCompiler.cs @@ -8,7 +8,6 @@ namespace ObjectTK.Data.Shaders { public static class ShaderCompiler { - /// Helper method that compiles a shader stage (part of a ShaderProgram) or throws an exception if failure occurs. [MustUseReturnValue] [NotNull] @@ -30,8 +29,6 @@ public static ShaderStage CompileShaderStage(ShaderType shaderType, string name, return new ShaderStage(shaderType, handle, source); } - - /// Shader Handle (int) -> ShaderProgram class. [NotNull] [MustUseReturnValue] public static ShaderProgram Introspect(int prog, ShaderStage[] stages) { From d7b869280c59be07f60980701fa5696e4bcfdcd2 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 13:06:34 +0200 Subject: [PATCH 18/52] Add 2D camera abstraction --- Examples/Entry.cs | 82 ++++++----- .../ExtensionPrograms/BasicProgram.cs | 17 ++- Examples/Examples/HelloTriangle.cs | 134 ++++++++++-------- ObjectTK.Data/Camera2D.cs | 41 ++++++ ObjectTK.Data/GLFactory.cs | 5 +- ObjectTK.Data/Transform2D.cs | 14 ++ ObjectTK.Tools/Cameras/Camera.cs | 7 +- 7 files changed, 185 insertions(+), 115 deletions(-) create mode 100644 ObjectTK.Data/Camera2D.cs create mode 100644 ObjectTK.Data/Transform2D.cs diff --git a/Examples/Entry.cs b/Examples/Entry.cs index c203a1b..6cd3b01 100644 --- a/Examples/Entry.cs +++ b/Examples/Entry.cs @@ -1,47 +1,45 @@ -using OpenTK.Windowing.Desktop; -using System; -using System.Collections.Generic; +using System; using System.Linq; using System.Reflection; +using Examples.Examples; +using OpenTK.Windowing.Desktop; namespace Examples { - class Entry { - static void Main(string[] args) { - - var Examples = Assembly.GetExecutingAssembly().GetTypes() - .Where(_ => _ != typeof(ExampleWindow) && typeof(ExampleWindow).IsAssignableFrom(_)) - .Select(Type => - new { - Caption = Type.GetCustomAttributes<ExampleProjectAttribute>(false).FirstOrDefault()?.Caption ?? nameof(Type), - Type = Type - }).ToArray(); - - while (PromptForExample(out Type Example)) { - using (var ExampleWindow = (GameWindow)Activator.CreateInstance(Example)) { - ExampleWindow.Run(); - } - } - - bool PromptForExample(out Type Example) { - Example = null; - int Count = 1; - Console.WriteLine("Select example: "); - - foreach (var Pair in Examples) { - Console.WriteLine($"{Count++} - {Pair.Caption}"); - } - - string input = Console.ReadLine(); - if (int.TryParse(input, out int Selection) && Selection - 1 >= 0 && Selection - 1 < Examples.Length) { - Example = Examples[Selection - 1].Type; - return true; - } - - return false; - } - - - } - - } + internal class Entry { + private static void Main(string[] args) { + using var gw = new HelloTriangle(); + gw.Run(); + // + // var Examples = Assembly.GetExecutingAssembly().GetTypes() + // .Where(_ => _ != typeof(ExampleWindow) && typeof(ExampleWindow).IsAssignableFrom(_)) + // .Select(Type => + // new { + // Caption = Type.GetCustomAttributes<ExampleProjectAttribute>(false).FirstOrDefault()?.Caption ?? nameof(Type), Type + // }).ToArray(); + // + // while (PromptForExample(out var Example)) { + // using (var ExampleWindow = (GameWindow) Activator.CreateInstance(Example)) { + // ExampleWindow.Run(); + // } + // } + // + // bool PromptForExample(out Type Example) { + // Example = null; + // var Count = 1; + // Console.WriteLine("Select example: "); + // + // foreach (var Pair in Examples) { + // Console.WriteLine($"{Count++} - {Pair.Caption}"); + // } + // + // var input = Console.ReadLine(); + // if (int.TryParse(input, out var Selection) && Selection - 1 >= 0 && Selection - 1 < Examples.Length) { + // Example = Examples[Selection - 1].Type; + // return true; + // } + // + // return false; + // } + } + } } diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/Examples/Examples/ExtensionPrograms/BasicProgram.cs index 344a269..334bffb 100644 --- a/Examples/Examples/ExtensionPrograms/BasicProgram.cs +++ b/Examples/Examples/ExtensionPrograms/BasicProgram.cs @@ -1,16 +1,15 @@ using ObjectTK.Data.Variables; using ObjectTK.Extensions.Shaders; using ObjectTK.Extensions.Variables; -using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; namespace Examples.Examples.Programs { + [VertexShaderSource("BasicShader.Vertex")] + [FragmentShaderSource("BasicShader.Fragment")] + public class BasicProgram { + [VertexAttrib()] + public ShaderAttributeInfo InPosition { get; set; } - [VertexShaderSource("BasicShader.Vertex")] - [FragmentShaderSource("BasicShader.Fragment")] - public class BasicProgram { - [VertexAttrib(VertexAttribPointerType.Float)] - public ShaderAttributeInfo InPosition { get; set; } - public ShaderUniformInfo<Matrix4> ModelViewProjectionMatrix { get; set; } - } -} + public ShaderUniformInfo<Matrix4> ModelViewProjectionMatrix { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index 57b51a0..a9ef2a0 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -1,83 +1,103 @@ - -using System; -using System.Collections.Generic; -using System.Drawing; +using System.Drawing; using ObjectTK.Data; using ObjectTK.Data.Buffers; using ObjectTK.Data.Shaders; -using ObjectTK.Data.Variables; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; +using OpenTK.Windowing.Desktop; namespace Examples.Examples { - - [ExampleProject("Hello Triangle")] - public sealed class HelloTriangle : ExampleWindow { - - private ShaderProgram _shaderProgram; - private Buffer<Vector3> _vbo; - private VertexArrayObject _vao; - - private const string VertSource = @" + internal static class ShaderSource { + public const string Vertex = @" #version 330 core uniform mat4 ModelViewProjectionMatrix; + layout(location = 0) in vec3 InPosition; + layout(location = 1) in vec4 InColor; + + + out vec4 VColor; void main(void) { gl_Position = ModelViewProjectionMatrix * vec4(InPosition, 1.0); + VColor = InColor; } "; - private const string FragSource = @" - #version 330 + public const string Fragment = @" + #version 330 + + in vec4 VColor; out vec4 FragColor; void main() { - FragColor = vec4(1); + FragColor = VColor; } "; - - protected override void OnLoad() { - base.OnLoad(); - - var shaderProgram = GLFactory.Shader.VertexFrag("Solid Color", VertSource, FragSource); - _shaderProgram = shaderProgram; - GL.UseProgram(shaderProgram.Handle); - - - var vertices = new[] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0) }; - _vbo = GLFactory.Buffer.ArrayBuffer("Positions", vertices); - _vao = GLFactory.VAO.FromBuffers("Triangle", _vbo); - - ActiveCamera.Position = new Vector3(0, 0, 3); - - GL.ClearColor(Color.MidnightBlue); - } - - protected override void OnRenderFrame(FrameEventArgs e) { - base.OnRenderFrame(e); - GL.Viewport(0, 0, Size.X, Size.Y); - GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); - - var mvpMatrix = ActiveCamera.ViewProjectionMatrix; - GL.UniformMatrix4(_shaderProgram.Uniforms["ModelViewProjectionMatrix"].Location, false, ref mvpMatrix); - - GL.BindVertexArray(_vao.Handle); - GL.DrawArrays(PrimitiveType.Triangles, 0, _vao.ElementCount); - GL.BindVertexArray(0); - SwapBuffers(); - } - - protected override void OnUnload() { - base.OnUnload(); - - GL.DeleteProgram(_shaderProgram.Handle); - GL.DeleteVertexArray(_vao.Handle); - GL.DeleteBuffer(_vbo.Handle); - } - } + } + + [ExampleProject("Hello Triangle")] + public sealed class HelloTriangle : GameWindow { + + private ShaderProgram _shaderProgram; + private VertexArrayObject _vao; + private Buffer<Vector3> _positionsVbo; + private Buffer<Color4> _colorsVbo; + private readonly Camera2D _camera = new Camera2D(); + + public HelloTriangle() + : base(new GameWindowSettings(), new NativeWindowSettings {Size = new Vector2i(800, 600), Title = "Hello Triangle (Basic)"}) { } + + protected override void OnLoad() { + base.OnLoad(); + + // create the shader program + _shaderProgram = GLFactory.Shader.VertexFrag("Vertex Color", ShaderSource.Vertex, ShaderSource.Fragment); + + // create the triangle to draw + var positions = new[] {new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0)}; + var colors = new[] {Color4.Cornsilk, Color4.OrangeRed, Color4.DarkOliveGreen}; + _positionsVbo = GLFactory.Buffer.ArrayBuffer("Positions", positions); + _colorsVbo = GLFactory.Buffer.ArrayBuffer("Colors", colors); + _vao = GLFactory.VAO.FromBuffers("Triangle", _positionsVbo, _colorsVbo); + } + + protected override void OnRenderFrame(FrameEventArgs e) { + base.OnRenderFrame(e); + // set up the viewport and camera (if the screen size has changed). + GL.Viewport(0, 0, Size.X, Size.Y); + _camera.AspectRatio = (float) Size.X / Size.Y; + + // clear the screen + GL.ClearColor(Color.MidnightBlue); + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + + + // set up the shader and the uniforms + GL.UseProgram(_shaderProgram.Handle); + var mvpMatrix = _camera.ViewProjection; + GL.UniformMatrix4(_shaderProgram.Uniforms["ModelViewProjectionMatrix"].Location, false, ref mvpMatrix); + + // draw the triangle + GL.BindVertexArray(_vao.Handle); + GL.DrawArrays(PrimitiveType.Triangles, 0, _vao.ElementCount); + GL.BindVertexArray(0); + + // swap to display on the screen + SwapBuffers(); + } + + protected override void OnUnload() { + base.OnUnload(); + + GL.DeleteProgram(_shaderProgram.Handle); + GL.DeleteVertexArray(_vao.Handle); + GL.DeleteBuffer(_positionsVbo.Handle); + } + } } + diff --git a/ObjectTK.Data/Camera2D.cs b/ObjectTK.Data/Camera2D.cs new file mode 100644 index 0000000..0187b03 --- /dev/null +++ b/ObjectTK.Data/Camera2D.cs @@ -0,0 +1,41 @@ +using OpenTK.Mathematics; + +namespace ObjectTK.Data { + public class Camera2D { + public Transform2D Transform { get; } = new Transform2D(); + + /// The near clipping plane for this camera. + public int NearClip { get; set; } = 1; + + /// The far clipping plane for this camera. + public int FarClip { get; set; } = 100; + + + /// The number of units covered in the vertical of this camera. + public float VerticalSize { get; set; } = 10; + + /// Given by viewport/screen width/height<br/> + /// The aspect ratio of the viewport. This should match the window or viewport's aspect ratio. + /// This is used to derive the horizontal size from the vertical height. + /// <see cref="VerticalSize" /> + public float AspectRatio { get; set; } = 1; + + public Vector2 Position { + get => Transform.Position; + set => Transform.Position = value; + } + + public float Rotation { + get => Transform.Rotation; + set => Transform.Rotation = value; + } + + public float HorizontalSize => VerticalSize * AspectRatio; + + public Matrix4 Projection => Matrix4.CreateOrthographic(HorizontalSize, VerticalSize, NearClip, FarClip); + + public Matrix4 View => Matrix4.CreateRotationZ(Rotation) * Matrix4.CreateTranslation(Position.X, Position.Y, -10); + + public Matrix4 ViewProjection => View * Projection; + } +} diff --git a/ObjectTK.Data/GLFactory.cs b/ObjectTK.Data/GLFactory.cs index f2bba1b..39376b7 100644 --- a/ObjectTK.Data/GLFactory.cs +++ b/ObjectTK.Data/GLFactory.cs @@ -92,7 +92,7 @@ public override string ToString() [NotNull] [MustUseReturnValue] - public Buffer<Vector3> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T: unmanaged { + public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T: unmanaged { var vbo = GL.GenBuffer(); var label = $"Buffer: {name}"; GL.ObjectLabel(ObjectLabelIdentifier.Buffer, vbo,label.Length, label); @@ -103,7 +103,7 @@ public Buffer<Vector3> ArrayBuffer<T>(string name, [NotNull] T[] vertices, Buffe } GL.BufferData(BufferTarget.ArrayBuffer, elemSize * vertices.Length, vertices, usageHint); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - return new Buffer<Vector3>(name, vbo, vertices.Length); + return new Buffer<T>(name, vbo, vertices.Length); } } @@ -176,7 +176,6 @@ public VertexArrayObject FromBuffers([NotNull] string name, [NotNull] params Buf return new VertexArrayObject(name, vao, length); } - } } diff --git a/ObjectTK.Data/Transform2D.cs b/ObjectTK.Data/Transform2D.cs new file mode 100644 index 0000000..54878c6 --- /dev/null +++ b/ObjectTK.Data/Transform2D.cs @@ -0,0 +1,14 @@ +using OpenTK.Mathematics; + +namespace ObjectTK.Data { + public class Transform2D { + + /// The position of this object on the X/Y plane. + public Vector2 Position { get; set; } + /// [DEGREES]. The orientation of this object, clockwise about the Z Axis (through the screen).<br/> + /// 0 degrees = pointing up to the top of the screen.<br/> + /// 90 degrees = pointing to the right of the screen.<br/> + /// etc. + public float Rotation { get; set; } + } +} diff --git a/ObjectTK.Tools/Cameras/Camera.cs b/ObjectTK.Tools/Cameras/Camera.cs index e6ecd09..e1a1e2b 100644 --- a/ObjectTK.Tools/Cameras/Camera.cs +++ b/ObjectTK.Tools/Cameras/Camera.cs @@ -27,8 +27,7 @@ public class Camera { public float FarClippingPlaneDistance { get; set; } = 1000.0f; public Ray GetPickingRay(Vector2 MousePosition) { - - Matrix4 UnViewProjectionMatrix = Matrix4.Invert(ViewProjectionMatrix); + Matrix4 unViewProjectionMatrix = Matrix4.Invert(ViewProjectionMatrix); Vector3 Near = Vector3.Unproject( new Vector3(MousePosition.X, Viewport.Size.Y - MousePosition.Y, NearClippingPlaneDistance), @@ -38,7 +37,7 @@ public Ray GetPickingRay(Vector2 MousePosition) { Viewport.Size.Y, NearClippingPlaneDistance, FarClippingPlaneDistance, - UnViewProjectionMatrix); + unViewProjectionMatrix); Vector3 Far = Vector3.Unproject( new Vector3(MousePosition.X, Viewport.Size.Y - MousePosition.Y, FarClippingPlaneDistance), @@ -48,7 +47,7 @@ public Ray GetPickingRay(Vector2 MousePosition) { Viewport.Size.Y, NearClippingPlaneDistance, FarClippingPlaneDistance, - UnViewProjectionMatrix); + unViewProjectionMatrix); Vector3 Direction = (Far - Near).Normalized(); From b970c4d7319e78623f0deb24c20bd7bf02c5a667 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 13:10:19 +0200 Subject: [PATCH 19/52] Adjust root namespace for data package --- ObjectTK.Data/ObjectTK.Data.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Data/ObjectTK.Data.csproj index dcadcac..5834461 100644 --- a/ObjectTK.Data/ObjectTK.Data.csproj +++ b/ObjectTK.Data/ObjectTK.Data.csproj @@ -3,6 +3,7 @@ <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + <RootNamespace>ObjectTK</RootNamespace> </PropertyGroup> <ItemGroup> From 54330afa4cbff9af24a1de6c12a7fc5bdc143393 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 13:19:24 +0200 Subject: [PATCH 20/52] Reoriganize and simplify packages --- Examples/Examples.csproj | 3 ++- .../Examples/ExtensionPrograms/BasicProgram.cs | 4 ++-- Examples/Examples/HelloTriangle.cs | 8 ++++---- Examples/Examples/HelloTriangleWithExtensions.cs | 7 ++++--- {ObjectTK.Data => ObjectTK.2D}/Camera2D.cs | 2 +- ObjectTK.2D/ObjectTK.2D.csproj | 16 ++++++++++++++++ {ObjectTK.Data => ObjectTK.2D}/Transform2D.cs | 2 +- .../AttributeExtensions.cs | 2 +- {ObjectTK.Data => ObjectTK.Core}/GLFactory.cs | 15 +++++++-------- .../GLObjects}/Buffer.cs | 2 +- .../GLObjects}/ShaderAttributeInfo.cs | 2 +- .../GLObjects}/ShaderProgram.cs | 6 +++--- .../GLObjects}/ShaderStage.cs | 2 +- .../GLObjects}/ShaderUniformInfo.cs | 2 +- .../GLObjects}/Textures.cs | 4 ++-- .../GLObjects/VertexArray.cs | 6 +++--- .../ObjectTK.Core.csproj | 0 ObjectTK.Core/Shaders/Material.cs | 5 +++++ .../Shaders/ShaderCompiler.cs | 4 ++-- ObjectTK.Data/Shaders/Material.cs | 9 --------- ObjectTK.Extensions/Buffers/BufferExtensions.cs | 2 +- .../Buffers/VertexArrayExtensions.cs | 11 +++++------ ObjectTK.Extensions/ObjectTK.Extensions.csproj | 2 +- ObjectTK.Extensions/Shaders/Material.cs | 2 +- ObjectTK.Extensions/Shaders/ProgramExtensions.cs | 6 +++--- ObjectTK.Extensions/Shaders/ProgramFactory.cs | 6 +++--- ObjectTK.Extensions/Shaders/ShaderExtensions.cs | 3 ++- .../Variables/UniformInfoExtensions.cs | 4 ++-- .../Variables/VertexAttributeInfoExtensions.cs | 3 +-- ObjectTK.Tools/ObjectTK.Tools.csproj | 2 +- ObjectTK.sln | 8 +++++++- 31 files changed, 84 insertions(+), 66 deletions(-) rename {ObjectTK.Data => ObjectTK.2D}/Camera2D.cs (98%) create mode 100644 ObjectTK.2D/ObjectTK.2D.csproj rename {ObjectTK.Data => ObjectTK.2D}/Transform2D.cs (94%) rename {ObjectTK.Data => ObjectTK.Core}/AttributeExtensions.cs (98%) rename {ObjectTK.Data => ObjectTK.Core}/GLFactory.cs (95%) rename {ObjectTK.Data/Buffers => ObjectTK.Core/GLObjects}/Buffer.cs (99%) rename {ObjectTK.Data/Variables => ObjectTK.Core/GLObjects}/ShaderAttributeInfo.cs (95%) rename {ObjectTK.Data/Shaders => ObjectTK.Core/GLObjects}/ShaderProgram.cs (88%) rename {ObjectTK.Data/Shaders => ObjectTK.Core/GLObjects}/ShaderStage.cs (91%) rename {ObjectTK.Data/Variables => ObjectTK.Core/GLObjects}/ShaderUniformInfo.cs (95%) rename {ObjectTK.Data/Textures => ObjectTK.Core/GLObjects}/Textures.cs (99%) rename ObjectTK.Data/Buffers/VertexArrayObject.cs => ObjectTK.Core/GLObjects/VertexArray.cs (70%) rename ObjectTK.Data/ObjectTK.Data.csproj => ObjectTK.Core/ObjectTK.Core.csproj (100%) create mode 100644 ObjectTK.Core/Shaders/Material.cs rename {ObjectTK.Data => ObjectTK.Core}/Shaders/ShaderCompiler.cs (98%) delete mode 100644 ObjectTK.Data/Shaders/Material.cs diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index 8f2985b..79f5b38 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -6,7 +6,8 @@ </PropertyGroup> <ItemGroup> - <ProjectReference Include="..\ObjectTK.Data\ObjectTK.Data.csproj" /> + <ProjectReference Include="..\ObjectTK.2D\ObjectTK.2D.csproj" /> + <ProjectReference Include="..\ObjectTK.Core\ObjectTK.Core.csproj" /> <ProjectReference Include="..\ObjectTK.Extensions\ObjectTK.Extensions.csproj" /> <ProjectReference Include="..\ObjectTK.Tools\ObjectTK.Tools.csproj" /> </ItemGroup> diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/Examples/Examples/ExtensionPrograms/BasicProgram.cs index 334bffb..ef2aee9 100644 --- a/Examples/Examples/ExtensionPrograms/BasicProgram.cs +++ b/Examples/Examples/ExtensionPrograms/BasicProgram.cs @@ -1,6 +1,6 @@ -using ObjectTK.Data.Variables; -using ObjectTK.Extensions.Shaders; +using ObjectTK.Extensions.Shaders; using ObjectTK.Extensions.Variables; +using ObjectTK.GLObjects; using OpenTK.Mathematics; namespace Examples.Examples.Programs { diff --git a/Examples/Examples/HelloTriangle.cs b/Examples/Examples/HelloTriangle.cs index a9ef2a0..18d1634 100644 --- a/Examples/Examples/HelloTriangle.cs +++ b/Examples/Examples/HelloTriangle.cs @@ -1,7 +1,7 @@ using System.Drawing; -using ObjectTK.Data; -using ObjectTK.Data.Buffers; -using ObjectTK.Data.Shaders; +using ObjectTK; +using ObjectTK.GLObjects; +using ObjectTK.Shaders; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; @@ -44,7 +44,7 @@ void main() public sealed class HelloTriangle : GameWindow { private ShaderProgram _shaderProgram; - private VertexArrayObject _vao; + private VertexArray _vao; private Buffer<Vector3> _positionsVbo; private Buffer<Color4> _colorsVbo; private readonly Camera2D _camera = new Camera2D(); diff --git a/Examples/Examples/HelloTriangleWithExtensions.cs b/Examples/Examples/HelloTriangleWithExtensions.cs index 79d1ccc..6c49b48 100644 --- a/Examples/Examples/HelloTriangleWithExtensions.cs +++ b/Examples/Examples/HelloTriangleWithExtensions.cs @@ -1,10 +1,11 @@ using System; using System.Drawing; using Examples.Examples.Programs; -using ObjectTK.Data.Buffers; +using ObjectTK; using ObjectTK.Extensions.Buffers; using ObjectTK.Extensions.Shaders; using ObjectTK.Extensions.Variables; +using ObjectTK.GLObjects; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; @@ -15,7 +16,7 @@ public class HelloTriangleWithExtensions : ExampleWindow { private ShaderProgram<BasicProgram> ShaderProgram; private Buffer<Vector3> VBO; - private VertexArrayObject VAO; + private VertexArray VAO; protected override void OnLoad() { base.OnLoad(); @@ -28,7 +29,7 @@ protected override void OnLoad() { VBO = new Buffer<Vector3>("Positions", GL.GenBuffer(), 0); VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); - VAO = new VertexArrayObject("Triangle", GL.GenVertexArray(), Vertices.Length); + VAO = new VertexArray("Triangle", GL.GenVertexArray(), Vertices.Length); VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); ActiveCamera.Position = new Vector3(0, 0, 3); diff --git a/ObjectTK.Data/Camera2D.cs b/ObjectTK.2D/Camera2D.cs similarity index 98% rename from ObjectTK.Data/Camera2D.cs rename to ObjectTK.2D/Camera2D.cs index 0187b03..5eaa40a 100644 --- a/ObjectTK.Data/Camera2D.cs +++ b/ObjectTK.2D/Camera2D.cs @@ -1,6 +1,6 @@ using OpenTK.Mathematics; -namespace ObjectTK.Data { +namespace ObjectTK._2D { public class Camera2D { public Transform2D Transform { get; } = new Transform2D(); diff --git a/ObjectTK.2D/ObjectTK.2D.csproj b/ObjectTK.2D/ObjectTK.2D.csproj new file mode 100644 index 0000000..40b390e --- /dev/null +++ b/ObjectTK.2D/ObjectTK.2D.csproj @@ -0,0 +1,16 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>ObjectTK._2D</RootNamespace> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> + <PackageReference Include="OpenTK" Version="4.0.6" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\ObjectTK.Core\ObjectTK.Core.csproj" /> + </ItemGroup> +</Project> diff --git a/ObjectTK.Data/Transform2D.cs b/ObjectTK.2D/Transform2D.cs similarity index 94% rename from ObjectTK.Data/Transform2D.cs rename to ObjectTK.2D/Transform2D.cs index 54878c6..48cf524 100644 --- a/ObjectTK.Data/Transform2D.cs +++ b/ObjectTK.2D/Transform2D.cs @@ -1,6 +1,6 @@ using OpenTK.Mathematics; -namespace ObjectTK.Data { +namespace ObjectTK._2D { public class Transform2D { /// The position of this object on the X/Y plane. diff --git a/ObjectTK.Data/AttributeExtensions.cs b/ObjectTK.Core/AttributeExtensions.cs similarity index 98% rename from ObjectTK.Data/AttributeExtensions.cs rename to ObjectTK.Core/AttributeExtensions.cs index 91a2381..f2dea01 100644 --- a/ObjectTK.Data/AttributeExtensions.cs +++ b/ObjectTK.Core/AttributeExtensions.cs @@ -4,7 +4,7 @@ using VAPT = OpenTK.Graphics.OpenGL.VertexAttribPointerType; -namespace ObjectTK.Data { +namespace ObjectTK { public static class AttributeExtensions { public static VAPT ToVertexAttribPointerType(this AAT attrib) { diff --git a/ObjectTK.Data/GLFactory.cs b/ObjectTK.Core/GLFactory.cs similarity index 95% rename from ObjectTK.Data/GLFactory.cs rename to ObjectTK.Core/GLFactory.cs index 39376b7..ff0f5ff 100644 --- a/ObjectTK.Data/GLFactory.cs +++ b/ObjectTK.Core/GLFactory.cs @@ -1,14 +1,13 @@ using System; using System.ComponentModel; using JetBrains.Annotations; -using ObjectTK.Data.Buffers; -using ObjectTK.Data.Internal; -using ObjectTK.Data.Shaders; +using ObjectTK.GLObjects; +using ObjectTK.Internal; +using ObjectTK.Shaders; using OpenTK.Graphics.OpenGL; -using OpenTK.Mathematics; -using Buffer = ObjectTK.Data.Buffers.Buffer; +using Buffer = ObjectTK.GLObjects.Buffer; -namespace ObjectTK.Data { +namespace ObjectTK { namespace Internal { @@ -145,7 +144,7 @@ public override string ToString() [NotNull] [MustUseReturnValue] - public VertexArrayObject FromBuffers([NotNull] string name, [NotNull] params Buffer[] buffers) { + public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] buffers) { var length = buffers[0].ElementCount; #if DEBUG for (int i = 0; i < buffers.Length; i++) { @@ -173,7 +172,7 @@ public VertexArrayObject FromBuffers([NotNull] string name, [NotNull] params Buf GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindVertexArray(0); - return new VertexArrayObject(name, vao, length); + return new VertexArray(name, vao, length); } } diff --git a/ObjectTK.Data/Buffers/Buffer.cs b/ObjectTK.Core/GLObjects/Buffer.cs similarity index 99% rename from ObjectTK.Data/Buffers/Buffer.cs rename to ObjectTK.Core/GLObjects/Buffer.cs index 42549e6..28ebfcd 100644 --- a/ObjectTK.Data/Buffers/Buffer.cs +++ b/ObjectTK.Core/GLObjects/Buffer.cs @@ -4,7 +4,7 @@ using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; -namespace ObjectTK.Data.Buffers { +namespace ObjectTK.GLObjects { /// Corresponds to an OpenGL Buffer. /// Typically this is a vertex/index/whatever buffer. diff --git a/ObjectTK.Data/Variables/ShaderAttributeInfo.cs b/ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs similarity index 95% rename from ObjectTK.Data/Variables/ShaderAttributeInfo.cs rename to ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs index 579f148..ee08c5f 100644 --- a/ObjectTK.Data/Variables/ShaderAttributeInfo.cs +++ b/ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs @@ -1,6 +1,6 @@ using OpenTK.Graphics.OpenGL; -namespace ObjectTK.Data.Variables { +namespace ObjectTK.GLObjects { public class ShaderAttributeInfo { public string Name { get; set; } public int Location { get; set; } diff --git a/ObjectTK.Data/Shaders/ShaderProgram.cs b/ObjectTK.Core/GLObjects/ShaderProgram.cs similarity index 88% rename from ObjectTK.Data/Shaders/ShaderProgram.cs rename to ObjectTK.Core/GLObjects/ShaderProgram.cs index 0bd3583..00485ef 100644 --- a/ObjectTK.Data/Shaders/ShaderProgram.cs +++ b/ObjectTK.Core/GLObjects/ShaderProgram.cs @@ -1,7 +1,7 @@ -using ObjectTK.Data.Variables; -using System.Collections.Generic; +using System.Collections.Generic; +using ObjectTK.Shaders; -namespace ObjectTK.Data.Shaders { +namespace ObjectTK.GLObjects { /// See: https://www.khronos.org/opengl/wiki/Shader public class ShaderProgram { diff --git a/ObjectTK.Data/Shaders/ShaderStage.cs b/ObjectTK.Core/GLObjects/ShaderStage.cs similarity index 91% rename from ObjectTK.Data/Shaders/ShaderStage.cs rename to ObjectTK.Core/GLObjects/ShaderStage.cs index 0ec84f6..4236785 100644 --- a/ObjectTK.Data/Shaders/ShaderStage.cs +++ b/ObjectTK.Core/GLObjects/ShaderStage.cs @@ -1,6 +1,6 @@ using OpenTK.Graphics.OpenGL; -namespace ObjectTK.Data.Shaders { +namespace ObjectTK.GLObjects { /// https://www.khronos.org/opengl/wiki/Shader#Stages public class ShaderStage { diff --git a/ObjectTK.Data/Variables/ShaderUniformInfo.cs b/ObjectTK.Core/GLObjects/ShaderUniformInfo.cs similarity index 95% rename from ObjectTK.Data/Variables/ShaderUniformInfo.cs rename to ObjectTK.Core/GLObjects/ShaderUniformInfo.cs index cb05b47..e8691d1 100644 --- a/ObjectTK.Data/Variables/ShaderUniformInfo.cs +++ b/ObjectTK.Core/GLObjects/ShaderUniformInfo.cs @@ -1,6 +1,6 @@ using OpenTK.Graphics.OpenGL; -namespace ObjectTK.Data.Variables { +namespace ObjectTK.GLObjects { public class ShaderUniformInfo { //TODO FIXME: Name[] for array uniform variables can be challenging. /// The name of this uniform in the array diff --git a/ObjectTK.Data/Textures/Textures.cs b/ObjectTK.Core/GLObjects/Textures.cs similarity index 99% rename from ObjectTK.Data/Textures/Textures.cs rename to ObjectTK.Core/GLObjects/Textures.cs index a5e2528..e743368 100644 --- a/ObjectTK.Data/Textures/Textures.cs +++ b/ObjectTK.Core/GLObjects/Textures.cs @@ -1,6 +1,6 @@ using OpenTK.Graphics.OpenGL; -namespace ObjectTK.Data.Textures { +namespace ObjectTK.GLObjects { public interface ITexture { int Handle { get; } string Name { get; set; } @@ -204,4 +204,4 @@ public Texture3D(int Handle, string Name, SizedInternalFormat InternalFormat, in this.MipLevels = MipLevels; } } -} \ No newline at end of file +} diff --git a/ObjectTK.Data/Buffers/VertexArrayObject.cs b/ObjectTK.Core/GLObjects/VertexArray.cs similarity index 70% rename from ObjectTK.Data/Buffers/VertexArrayObject.cs rename to ObjectTK.Core/GLObjects/VertexArray.cs index 268094f..749c55e 100644 --- a/ObjectTK.Data/Buffers/VertexArrayObject.cs +++ b/ObjectTK.Core/GLObjects/VertexArray.cs @@ -1,7 +1,7 @@ -namespace ObjectTK.Data.Buffers { +namespace ObjectTK.GLObjects { /// An OpenGL Vertex array object. - public class VertexArrayObject { + public class VertexArray { /// The name of this object. public string Name { get; } @@ -10,7 +10,7 @@ public class VertexArrayObject { /// The number of elements in this VAO. public int ElementCount { get; } - public VertexArrayObject(string name, int handle, int elementCount) { + public VertexArray(string name, int handle, int elementCount) { Name = name; Handle = handle; ElementCount = elementCount; diff --git a/ObjectTK.Data/ObjectTK.Data.csproj b/ObjectTK.Core/ObjectTK.Core.csproj similarity index 100% rename from ObjectTK.Data/ObjectTK.Data.csproj rename to ObjectTK.Core/ObjectTK.Core.csproj diff --git a/ObjectTK.Core/Shaders/Material.cs b/ObjectTK.Core/Shaders/Material.cs new file mode 100644 index 0000000..f9301da --- /dev/null +++ b/ObjectTK.Core/Shaders/Material.cs @@ -0,0 +1,5 @@ +namespace ObjectTK.Shaders { + public class Material { + } + +} diff --git a/ObjectTK.Data/Shaders/ShaderCompiler.cs b/ObjectTK.Core/Shaders/ShaderCompiler.cs similarity index 98% rename from ObjectTK.Data/Shaders/ShaderCompiler.cs rename to ObjectTK.Core/Shaders/ShaderCompiler.cs index 8c310f7..472abbf 100644 --- a/ObjectTK.Data/Shaders/ShaderCompiler.cs +++ b/ObjectTK.Core/Shaders/ShaderCompiler.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using JetBrains.Annotations; -using ObjectTK.Data.Variables; +using ObjectTK.GLObjects; using OpenTK.Graphics.OpenGL; -namespace ObjectTK.Data.Shaders { +namespace ObjectTK.Shaders { public static class ShaderCompiler { diff --git a/ObjectTK.Data/Shaders/Material.cs b/ObjectTK.Data/Shaders/Material.cs deleted file mode 100644 index 9aed016..0000000 --- a/ObjectTK.Data/Shaders/Material.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ObjectTK.Data.Shaders { - public class Material { - } - -} diff --git a/ObjectTK.Extensions/Buffers/BufferExtensions.cs b/ObjectTK.Extensions/Buffers/BufferExtensions.cs index b085ec5..9305ae8 100644 --- a/ObjectTK.Extensions/Buffers/BufferExtensions.cs +++ b/ObjectTK.Extensions/Buffers/BufferExtensions.cs @@ -1,4 +1,4 @@ -using ObjectTK.Data.Buffers; +using ObjectTK.GLObjects; using OpenTK.Graphics.OpenGL; namespace ObjectTK.Extensions.Buffers { diff --git a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs index 43c7c17..ec51720 100644 --- a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs +++ b/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs @@ -1,16 +1,15 @@ -using ObjectTK.Data.Buffers; +using ObjectTK.GLObjects; using OpenTK.Graphics.OpenGL; -using ObjectTK.Data.Variables; namespace ObjectTK.Extensions.Buffers { public static class VertexArrayExtensions { - public static void Bind(this VertexArrayObject vertexArrayObject) { - GL.BindVertexArray(vertexArrayObject.Handle); + public static void Bind(this VertexArray vertexArray) { + GL.BindVertexArray(vertexArray.Handle); } - public static void BindVertexAttribute<T>(this VertexArrayObject vertexArrayObject, ShaderAttributeInfo shaderAttributeInfo, Buffer<T> Buffer) where T : unmanaged { - vertexArrayObject.Bind(); + public static void BindVertexAttribute<T>(this VertexArray vertexArray, ShaderAttributeInfo shaderAttributeInfo, Buffer<T> Buffer) where T : unmanaged { + vertexArray.Bind(); GL.VertexAttribPointer(shaderAttributeInfo.Location, Buffer.ElementCount, VertexAttribPointerType.Float, false, Buffer.ElementSize, 0); GL.EnableVertexAttribArray(shaderAttributeInfo.Location); GL.BindBuffer(BufferTarget.ArrayBuffer, Buffer.Handle); diff --git a/ObjectTK.Extensions/ObjectTK.Extensions.csproj b/ObjectTK.Extensions/ObjectTK.Extensions.csproj index b215520..1856cfc 100644 --- a/ObjectTK.Extensions/ObjectTK.Extensions.csproj +++ b/ObjectTK.Extensions/ObjectTK.Extensions.csproj @@ -5,7 +5,7 @@ </PropertyGroup> <ItemGroup> - <ProjectReference Include="..\ObjectTK.Data\ObjectTK.Data.csproj" /> + <ProjectReference Include="..\ObjectTK.Core\ObjectTK.Core.csproj" /> </ItemGroup> </Project> diff --git a/ObjectTK.Extensions/Shaders/Material.cs b/ObjectTK.Extensions/Shaders/Material.cs index a61e0cf..a005455 100644 --- a/ObjectTK.Extensions/Shaders/Material.cs +++ b/ObjectTK.Extensions/Shaders/Material.cs @@ -20,7 +20,7 @@ using System; using System.Reflection; -using ObjectTK.Data.Variables; +using ObjectTK.GLObjects; namespace ObjectTK.Extensions.Shaders { public class Material<T> where T : class, new() { diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs index 3d76803..53eab25 100644 --- a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ProgramExtensions.cs @@ -1,9 +1,9 @@ -using ObjectTK.Data.Shaders; -using ObjectTK.Data.Variables; -using ObjectTK.Extensions.Variables; +using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; using System.Collections.Generic; using System.Reflection; +using ObjectTK.GLObjects; +using ObjectTK.Shaders; namespace ObjectTK.Extensions.Shaders { diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/ObjectTK.Extensions/Shaders/ProgramFactory.cs index 0a7536a..ef66ac0 100644 --- a/ObjectTK.Extensions/Shaders/ProgramFactory.cs +++ b/ObjectTK.Extensions/Shaders/ProgramFactory.cs @@ -1,6 +1,4 @@ -using ObjectTK.Data.Shaders; -using ObjectTK.Data.Variables; -using ObjectTK.Extensions.Variables; +using ObjectTK.Extensions.Variables; using OpenTK.Graphics.OpenGL; using System; using System.Collections.Generic; @@ -8,6 +6,8 @@ using System.Linq; using System.Reflection; using System.Text; +using ObjectTK.GLObjects; +using ObjectTK.Shaders; namespace ObjectTK.Extensions.Shaders { public class ProgramFactory { diff --git a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs index c490109..a1cb186 100644 --- a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs +++ b/ObjectTK.Extensions/Shaders/ShaderExtensions.cs @@ -1,4 +1,5 @@ -using ObjectTK.Data.Shaders; +using ObjectTK.GLObjects; +using ObjectTK.Shaders; using OpenTK.Graphics.OpenGL; namespace ObjectTK.Extensions.Shaders { diff --git a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs index 8e128ef..d660995 100644 --- a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs @@ -1,9 +1,9 @@ -using ObjectTK.Data.Variables; -using OpenTK.Graphics.OpenGL; +using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using System; using System.Collections.Generic; using System.Drawing; +using ObjectTK.GLObjects; namespace ObjectTK.Extensions.Variables { public static class UniformInfoExtensions { diff --git a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs index acfd3ae..5bc6fe4 100644 --- a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs +++ b/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs @@ -1,5 +1,4 @@ -using ObjectTK.Data.Variables; -using OpenTK.Graphics.OpenGL; +using OpenTK.Graphics.OpenGL; using System; namespace ObjectTK.Extensions.Variables { diff --git a/ObjectTK.Tools/ObjectTK.Tools.csproj b/ObjectTK.Tools/ObjectTK.Tools.csproj index 82bc7cb..d09f5fc 100644 --- a/ObjectTK.Tools/ObjectTK.Tools.csproj +++ b/ObjectTK.Tools/ObjectTK.Tools.csproj @@ -9,7 +9,7 @@ </ItemGroup> <ItemGroup> - <ProjectReference Include="..\ObjectTK.Data\ObjectTK.Data.csproj" /> + <ProjectReference Include="..\ObjectTK.Core\ObjectTK.Core.csproj" /> </ItemGroup> </Project> diff --git a/ObjectTK.sln b/ObjectTK.sln index 17403b1..5e23e1a 100644 --- a/ObjectTK.sln +++ b/ObjectTK.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Data", "ObjectTK.Data\ObjectTK.Data.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Core", "ObjectTK.Core\ObjectTK.Core.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Extensions", "ObjectTK.Extensions\ObjectTK.Extensions.csproj", "{DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}" EndProject @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "Examples\Exampl EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "ObjectTK.Tools\ObjectTK.Tools.csproj", "{B5DCB84E-3E09-4F37-B06E-68565756624F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.2D", "ObjectTK.2D\ObjectTK.2D.csproj", "{77B6C529-5DD8-4A76-8577-E50F0F06F7F2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +35,10 @@ Global {B5DCB84E-3E09-4F37-B06E-68565756624F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B5DCB84E-3E09-4F37-B06E-68565756624F}.Release|Any CPU.ActiveCfg = Release|Any CPU {B5DCB84E-3E09-4F37-B06E-68565756624F}.Release|Any CPU.Build.0 = Release|Any CPU + {77B6C529-5DD8-4A76-8577-E50F0F06F7F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77B6C529-5DD8-4A76-8577-E50F0F06F7F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77B6C529-5DD8-4A76-8577-E50F0F06F7F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77B6C529-5DD8-4A76-8577-E50F0F06F7F2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 51cf183a3b0cc960e27c777d1389bf4b31805a60 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 13:21:24 +0200 Subject: [PATCH 21/52] move all files into src directory --- ObjectTK.sln | 10 +++++----- .../Examples}/Data/Shaders/BasicShader.glsl | 0 {Examples => src/Examples}/Entry.cs | 0 {Examples => src/Examples}/ExampleProjectAttribute.cs | 0 {Examples => src/Examples}/ExampleWindow.cs | 0 {Examples => src/Examples}/Examples.csproj | 0 .../Examples/ExtensionPrograms/BasicProgram.cs | 0 {Examples => src/Examples}/Examples/HelloTriangle.cs | 0 .../Examples}/Examples/HelloTriangleWithExtensions.cs | 0 {ObjectTK.2D => src/ObjectTK.2D}/Camera2D.cs | 0 {ObjectTK.2D => src/ObjectTK.2D}/ObjectTK.2D.csproj | 0 {ObjectTK.2D => src/ObjectTK.2D}/Transform2D.cs | 0 .../ObjectTK.Core}/AttributeExtensions.cs | 0 {ObjectTK.Core => src/ObjectTK.Core}/GLFactory.cs | 0 .../ObjectTK.Core}/GLObjects/Buffer.cs | 0 .../ObjectTK.Core}/GLObjects/ShaderAttributeInfo.cs | 0 .../ObjectTK.Core}/GLObjects/ShaderProgram.cs | 0 .../ObjectTK.Core}/GLObjects/ShaderStage.cs | 0 .../ObjectTK.Core}/GLObjects/ShaderUniformInfo.cs | 0 .../ObjectTK.Core}/GLObjects/Textures.cs | 0 .../ObjectTK.Core}/GLObjects/VertexArray.cs | 0 .../ObjectTK.Core}/ObjectTK.Core.csproj | 0 .../ObjectTK.Core}/Shaders/Material.cs | 0 .../ObjectTK.Core}/Shaders/ShaderCompiler.cs | 0 .../ObjectTK.Extensions}/Buffers/BufferExtensions.cs | 0 .../Buffers/VertexArrayExtensions.cs | 0 .../ObjectTK.Extensions}/ObjectTK.Extensions.csproj | 0 .../ObjectTK.Extensions}/Shaders/Material.cs | 0 .../ObjectTK.Extensions}/Shaders/ProgramExtensions.cs | 0 .../ObjectTK.Extensions}/Shaders/ProgramFactory.cs | 0 .../ObjectTK.Extensions}/Shaders/ShaderAttributes.cs | 0 .../ObjectTK.Extensions}/Shaders/ShaderExtensions.cs | 0 .../Variables/UniformInfoExtensions.cs | 0 .../Variables/VertexAttributeInfoExtensions.cs | 0 {ObjectTK.Tools => src/ObjectTK.Tools}/CameraWindow.cs | 0 .../ObjectTK.Tools}/Cameras/Camera.cs | 0 .../ObjectTK.Tools}/Cameras/CameraProjectionType.cs | 0 {ObjectTK.Tools => src/ObjectTK.Tools}/FrameTimer.cs | 0 .../ObjectTK.Tools}/Mathematics/Ray.cs | 0 .../ObjectTK.Tools}/ObjectTK.Tools.csproj | 0 40 files changed, 5 insertions(+), 5 deletions(-) rename {Examples => src/Examples}/Data/Shaders/BasicShader.glsl (100%) rename {Examples => src/Examples}/Entry.cs (100%) rename {Examples => src/Examples}/ExampleProjectAttribute.cs (100%) rename {Examples => src/Examples}/ExampleWindow.cs (100%) rename {Examples => src/Examples}/Examples.csproj (100%) rename {Examples => src/Examples}/Examples/ExtensionPrograms/BasicProgram.cs (100%) rename {Examples => src/Examples}/Examples/HelloTriangle.cs (100%) rename {Examples => src/Examples}/Examples/HelloTriangleWithExtensions.cs (100%) rename {ObjectTK.2D => src/ObjectTK.2D}/Camera2D.cs (100%) rename {ObjectTK.2D => src/ObjectTK.2D}/ObjectTK.2D.csproj (100%) rename {ObjectTK.2D => src/ObjectTK.2D}/Transform2D.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/AttributeExtensions.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLFactory.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/Buffer.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/ShaderAttributeInfo.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/ShaderProgram.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/ShaderStage.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/ShaderUniformInfo.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/Textures.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/GLObjects/VertexArray.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/ObjectTK.Core.csproj (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/Shaders/Material.cs (100%) rename {ObjectTK.Core => src/ObjectTK.Core}/Shaders/ShaderCompiler.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Buffers/BufferExtensions.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Buffers/VertexArrayExtensions.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/ObjectTK.Extensions.csproj (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Shaders/Material.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Shaders/ProgramExtensions.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Shaders/ProgramFactory.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Shaders/ShaderAttributes.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Shaders/ShaderExtensions.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Variables/UniformInfoExtensions.cs (100%) rename {ObjectTK.Extensions => src/ObjectTK.Extensions}/Variables/VertexAttributeInfoExtensions.cs (100%) rename {ObjectTK.Tools => src/ObjectTK.Tools}/CameraWindow.cs (100%) rename {ObjectTK.Tools => src/ObjectTK.Tools}/Cameras/Camera.cs (100%) rename {ObjectTK.Tools => src/ObjectTK.Tools}/Cameras/CameraProjectionType.cs (100%) rename {ObjectTK.Tools => src/ObjectTK.Tools}/FrameTimer.cs (100%) rename {ObjectTK.Tools => src/ObjectTK.Tools}/Mathematics/Ray.cs (100%) rename {ObjectTK.Tools => src/ObjectTK.Tools}/ObjectTK.Tools.csproj (100%) diff --git a/ObjectTK.sln b/ObjectTK.sln index 5e23e1a..4d0b457 100644 --- a/ObjectTK.sln +++ b/ObjectTK.sln @@ -3,15 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Core", "ObjectTK.Core\ObjectTK.Core.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Core", "src\ObjectTK.Core\ObjectTK.Core.csproj", "{163450BD-24E0-4C3E-A310-3AEBD709E065}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Extensions", "ObjectTK.Extensions\ObjectTK.Extensions.csproj", "{DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectTK.Extensions", "src\ObjectTK.Extensions\ObjectTK.Extensions.csproj", "{DE7D5895-068B-42CF-B69A-D5E3AAE7E43B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "Examples\Examples.csproj", "{AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "src\Examples\Examples.csproj", "{AF523BFF-E1A2-45CF-B9CE-F14F3A16536E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "ObjectTK.Tools\ObjectTK.Tools.csproj", "{B5DCB84E-3E09-4F37-B06E-68565756624F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.Tools", "src\ObjectTK.Tools\ObjectTK.Tools.csproj", "{B5DCB84E-3E09-4F37-B06E-68565756624F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.2D", "ObjectTK.2D\ObjectTK.2D.csproj", "{77B6C529-5DD8-4A76-8577-E50F0F06F7F2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectTK.2D", "src\ObjectTK.2D\ObjectTK.2D.csproj", "{77B6C529-5DD8-4A76-8577-E50F0F06F7F2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Examples/Data/Shaders/BasicShader.glsl b/src/Examples/Data/Shaders/BasicShader.glsl similarity index 100% rename from Examples/Data/Shaders/BasicShader.glsl rename to src/Examples/Data/Shaders/BasicShader.glsl diff --git a/Examples/Entry.cs b/src/Examples/Entry.cs similarity index 100% rename from Examples/Entry.cs rename to src/Examples/Entry.cs diff --git a/Examples/ExampleProjectAttribute.cs b/src/Examples/ExampleProjectAttribute.cs similarity index 100% rename from Examples/ExampleProjectAttribute.cs rename to src/Examples/ExampleProjectAttribute.cs diff --git a/Examples/ExampleWindow.cs b/src/Examples/ExampleWindow.cs similarity index 100% rename from Examples/ExampleWindow.cs rename to src/Examples/ExampleWindow.cs diff --git a/Examples/Examples.csproj b/src/Examples/Examples.csproj similarity index 100% rename from Examples/Examples.csproj rename to src/Examples/Examples.csproj diff --git a/Examples/Examples/ExtensionPrograms/BasicProgram.cs b/src/Examples/Examples/ExtensionPrograms/BasicProgram.cs similarity index 100% rename from Examples/Examples/ExtensionPrograms/BasicProgram.cs rename to src/Examples/Examples/ExtensionPrograms/BasicProgram.cs diff --git a/Examples/Examples/HelloTriangle.cs b/src/Examples/Examples/HelloTriangle.cs similarity index 100% rename from Examples/Examples/HelloTriangle.cs rename to src/Examples/Examples/HelloTriangle.cs diff --git a/Examples/Examples/HelloTriangleWithExtensions.cs b/src/Examples/Examples/HelloTriangleWithExtensions.cs similarity index 100% rename from Examples/Examples/HelloTriangleWithExtensions.cs rename to src/Examples/Examples/HelloTriangleWithExtensions.cs diff --git a/ObjectTK.2D/Camera2D.cs b/src/ObjectTK.2D/Camera2D.cs similarity index 100% rename from ObjectTK.2D/Camera2D.cs rename to src/ObjectTK.2D/Camera2D.cs diff --git a/ObjectTK.2D/ObjectTK.2D.csproj b/src/ObjectTK.2D/ObjectTK.2D.csproj similarity index 100% rename from ObjectTK.2D/ObjectTK.2D.csproj rename to src/ObjectTK.2D/ObjectTK.2D.csproj diff --git a/ObjectTK.2D/Transform2D.cs b/src/ObjectTK.2D/Transform2D.cs similarity index 100% rename from ObjectTK.2D/Transform2D.cs rename to src/ObjectTK.2D/Transform2D.cs diff --git a/ObjectTK.Core/AttributeExtensions.cs b/src/ObjectTK.Core/AttributeExtensions.cs similarity index 100% rename from ObjectTK.Core/AttributeExtensions.cs rename to src/ObjectTK.Core/AttributeExtensions.cs diff --git a/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs similarity index 100% rename from ObjectTK.Core/GLFactory.cs rename to src/ObjectTK.Core/GLFactory.cs diff --git a/ObjectTK.Core/GLObjects/Buffer.cs b/src/ObjectTK.Core/GLObjects/Buffer.cs similarity index 100% rename from ObjectTK.Core/GLObjects/Buffer.cs rename to src/ObjectTK.Core/GLObjects/Buffer.cs diff --git a/ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs b/src/ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs similarity index 100% rename from ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs rename to src/ObjectTK.Core/GLObjects/ShaderAttributeInfo.cs diff --git a/ObjectTK.Core/GLObjects/ShaderProgram.cs b/src/ObjectTK.Core/GLObjects/ShaderProgram.cs similarity index 100% rename from ObjectTK.Core/GLObjects/ShaderProgram.cs rename to src/ObjectTK.Core/GLObjects/ShaderProgram.cs diff --git a/ObjectTK.Core/GLObjects/ShaderStage.cs b/src/ObjectTK.Core/GLObjects/ShaderStage.cs similarity index 100% rename from ObjectTK.Core/GLObjects/ShaderStage.cs rename to src/ObjectTK.Core/GLObjects/ShaderStage.cs diff --git a/ObjectTK.Core/GLObjects/ShaderUniformInfo.cs b/src/ObjectTK.Core/GLObjects/ShaderUniformInfo.cs similarity index 100% rename from ObjectTK.Core/GLObjects/ShaderUniformInfo.cs rename to src/ObjectTK.Core/GLObjects/ShaderUniformInfo.cs diff --git a/ObjectTK.Core/GLObjects/Textures.cs b/src/ObjectTK.Core/GLObjects/Textures.cs similarity index 100% rename from ObjectTK.Core/GLObjects/Textures.cs rename to src/ObjectTK.Core/GLObjects/Textures.cs diff --git a/ObjectTK.Core/GLObjects/VertexArray.cs b/src/ObjectTK.Core/GLObjects/VertexArray.cs similarity index 100% rename from ObjectTK.Core/GLObjects/VertexArray.cs rename to src/ObjectTK.Core/GLObjects/VertexArray.cs diff --git a/ObjectTK.Core/ObjectTK.Core.csproj b/src/ObjectTK.Core/ObjectTK.Core.csproj similarity index 100% rename from ObjectTK.Core/ObjectTK.Core.csproj rename to src/ObjectTK.Core/ObjectTK.Core.csproj diff --git a/ObjectTK.Core/Shaders/Material.cs b/src/ObjectTK.Core/Shaders/Material.cs similarity index 100% rename from ObjectTK.Core/Shaders/Material.cs rename to src/ObjectTK.Core/Shaders/Material.cs diff --git a/ObjectTK.Core/Shaders/ShaderCompiler.cs b/src/ObjectTK.Core/Shaders/ShaderCompiler.cs similarity index 100% rename from ObjectTK.Core/Shaders/ShaderCompiler.cs rename to src/ObjectTK.Core/Shaders/ShaderCompiler.cs diff --git a/ObjectTK.Extensions/Buffers/BufferExtensions.cs b/src/ObjectTK.Extensions/Buffers/BufferExtensions.cs similarity index 100% rename from ObjectTK.Extensions/Buffers/BufferExtensions.cs rename to src/ObjectTK.Extensions/Buffers/BufferExtensions.cs diff --git a/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs b/src/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs similarity index 100% rename from ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs rename to src/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs diff --git a/ObjectTK.Extensions/ObjectTK.Extensions.csproj b/src/ObjectTK.Extensions/ObjectTK.Extensions.csproj similarity index 100% rename from ObjectTK.Extensions/ObjectTK.Extensions.csproj rename to src/ObjectTK.Extensions/ObjectTK.Extensions.csproj diff --git a/ObjectTK.Extensions/Shaders/Material.cs b/src/ObjectTK.Extensions/Shaders/Material.cs similarity index 100% rename from ObjectTK.Extensions/Shaders/Material.cs rename to src/ObjectTK.Extensions/Shaders/Material.cs diff --git a/ObjectTK.Extensions/Shaders/ProgramExtensions.cs b/src/ObjectTK.Extensions/Shaders/ProgramExtensions.cs similarity index 100% rename from ObjectTK.Extensions/Shaders/ProgramExtensions.cs rename to src/ObjectTK.Extensions/Shaders/ProgramExtensions.cs diff --git a/ObjectTK.Extensions/Shaders/ProgramFactory.cs b/src/ObjectTK.Extensions/Shaders/ProgramFactory.cs similarity index 100% rename from ObjectTK.Extensions/Shaders/ProgramFactory.cs rename to src/ObjectTK.Extensions/Shaders/ProgramFactory.cs diff --git a/ObjectTK.Extensions/Shaders/ShaderAttributes.cs b/src/ObjectTK.Extensions/Shaders/ShaderAttributes.cs similarity index 100% rename from ObjectTK.Extensions/Shaders/ShaderAttributes.cs rename to src/ObjectTK.Extensions/Shaders/ShaderAttributes.cs diff --git a/ObjectTK.Extensions/Shaders/ShaderExtensions.cs b/src/ObjectTK.Extensions/Shaders/ShaderExtensions.cs similarity index 100% rename from ObjectTK.Extensions/Shaders/ShaderExtensions.cs rename to src/ObjectTK.Extensions/Shaders/ShaderExtensions.cs diff --git a/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs b/src/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs similarity index 100% rename from ObjectTK.Extensions/Variables/UniformInfoExtensions.cs rename to src/ObjectTK.Extensions/Variables/UniformInfoExtensions.cs diff --git a/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs b/src/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs similarity index 100% rename from ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs rename to src/ObjectTK.Extensions/Variables/VertexAttributeInfoExtensions.cs diff --git a/ObjectTK.Tools/CameraWindow.cs b/src/ObjectTK.Tools/CameraWindow.cs similarity index 100% rename from ObjectTK.Tools/CameraWindow.cs rename to src/ObjectTK.Tools/CameraWindow.cs diff --git a/ObjectTK.Tools/Cameras/Camera.cs b/src/ObjectTK.Tools/Cameras/Camera.cs similarity index 100% rename from ObjectTK.Tools/Cameras/Camera.cs rename to src/ObjectTK.Tools/Cameras/Camera.cs diff --git a/ObjectTK.Tools/Cameras/CameraProjectionType.cs b/src/ObjectTK.Tools/Cameras/CameraProjectionType.cs similarity index 100% rename from ObjectTK.Tools/Cameras/CameraProjectionType.cs rename to src/ObjectTK.Tools/Cameras/CameraProjectionType.cs diff --git a/ObjectTK.Tools/FrameTimer.cs b/src/ObjectTK.Tools/FrameTimer.cs similarity index 100% rename from ObjectTK.Tools/FrameTimer.cs rename to src/ObjectTK.Tools/FrameTimer.cs diff --git a/ObjectTK.Tools/Mathematics/Ray.cs b/src/ObjectTK.Tools/Mathematics/Ray.cs similarity index 100% rename from ObjectTK.Tools/Mathematics/Ray.cs rename to src/ObjectTK.Tools/Mathematics/Ray.cs diff --git a/ObjectTK.Tools/ObjectTK.Tools.csproj b/src/ObjectTK.Tools/ObjectTK.Tools.csproj similarity index 100% rename from ObjectTK.Tools/ObjectTK.Tools.csproj rename to src/ObjectTK.Tools/ObjectTK.Tools.csproj From 697afd81a1a581cf2465d40a1887ea7f26185641 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 13:22:12 +0200 Subject: [PATCH 22/52] Compile fixes --- src/Examples/Examples/HelloTriangle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Examples/Examples/HelloTriangle.cs b/src/Examples/Examples/HelloTriangle.cs index 18d1634..e8664c4 100644 --- a/src/Examples/Examples/HelloTriangle.cs +++ b/src/Examples/Examples/HelloTriangle.cs @@ -1,7 +1,7 @@ using System.Drawing; using ObjectTK; +using ObjectTK._2D; using ObjectTK.GLObjects; -using ObjectTK.Shaders; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Windowing.Common; From 2884ec5b25a5873a1cceeeff6aa28d77ea98961c Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 15:06:03 +0200 Subject: [PATCH 23/52] Update to OpenTK 4.1, QOL changes --- src/Examples/Examples/HelloTriangle.cs | 32 +++++++++++++++--------- src/ObjectTK.2D/ObjectTK.2D.csproj | 2 +- src/ObjectTK.Core/GLFactory.cs | 2 +- src/ObjectTK.Core/ObjectTK.Core.csproj | 2 +- src/ObjectTK.Tools/ObjectTK.Tools.csproj | 2 +- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/Examples/Examples/HelloTriangle.cs b/src/Examples/Examples/HelloTriangle.cs index e8664c4..6f2858e 100644 --- a/src/Examples/Examples/HelloTriangle.cs +++ b/src/Examples/Examples/HelloTriangle.cs @@ -27,22 +27,28 @@ void main(void) { "; public const string Fragment = @" - #version 330 - - in vec4 VColor; + #version 330 - out vec4 FragColor; + in vec4 VColor; - void main() - { - FragColor = VColor; - } - "; + out vec4 FragColor; + + void main() + { + FragColor = VColor; + } + "; } [ExampleProject("Hello Triangle")] public sealed class HelloTriangle : GameWindow { + private static readonly NativeWindowSettings WindowSettings = new NativeWindowSettings { + Size = new Vector2i(800, 600), + Title = "Hello Triangle (Basic)", + }; + private static readonly GameWindowSettings GameWindowSettings = new GameWindowSettings(); + private ShaderProgram _shaderProgram; private VertexArray _vao; private Buffer<Vector3> _positionsVbo; @@ -50,11 +56,12 @@ public sealed class HelloTriangle : GameWindow { private readonly Camera2D _camera = new Camera2D(); public HelloTriangle() - : base(new GameWindowSettings(), new NativeWindowSettings {Size = new Vector2i(800, 600), Title = "Hello Triangle (Basic)"}) { } + : base(GameWindowSettings, WindowSettings) { + } protected override void OnLoad() { base.OnLoad(); - + // create the shader program _shaderProgram = GLFactory.Shader.VertexFrag("Vertex Color", ShaderSource.Vertex, ShaderSource.Fragment); @@ -63,7 +70,8 @@ protected override void OnLoad() { var colors = new[] {Color4.Cornsilk, Color4.OrangeRed, Color4.DarkOliveGreen}; _positionsVbo = GLFactory.Buffer.ArrayBuffer("Positions", positions); _colorsVbo = GLFactory.Buffer.ArrayBuffer("Colors", colors); - _vao = GLFactory.VAO.FromBuffers("Triangle", _positionsVbo, _colorsVbo); + _vao = GLFactory.VertexArray.FromBuffers("Triangle", _positionsVbo, _colorsVbo); + } protected override void OnRenderFrame(FrameEventArgs e) { diff --git a/src/ObjectTK.2D/ObjectTK.2D.csproj b/src/ObjectTK.2D/ObjectTK.2D.csproj index 40b390e..a7966fa 100644 --- a/src/ObjectTK.2D/ObjectTK.2D.csproj +++ b/src/ObjectTK.2D/ObjectTK.2D.csproj @@ -7,7 +7,7 @@ <ItemGroup> <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> - <PackageReference Include="OpenTK" Version="4.0.6" /> + <PackageReference Include="OpenTK" Version="4.1.0" /> </ItemGroup> <ItemGroup> diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index ff0f5ff..92d4a40 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -189,7 +189,7 @@ public static class GLFactory { public static readonly GLVertexArrayObjectFactory VertexArrayObject = GLVertexArrayObjectFactory.Instance; /// Alias for VertexArrayObject // ReSharper disable once InconsistentNaming - public static readonly GLVertexArrayObjectFactory VAO = VertexArrayObject; + public static readonly GLVertexArrayObjectFactory VertexArray = VertexArrayObject; } diff --git a/src/ObjectTK.Core/ObjectTK.Core.csproj b/src/ObjectTK.Core/ObjectTK.Core.csproj index 5834461..a846987 100644 --- a/src/ObjectTK.Core/ObjectTK.Core.csproj +++ b/src/ObjectTK.Core/ObjectTK.Core.csproj @@ -8,7 +8,7 @@ <ItemGroup> <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> - <PackageReference Include="OpenTK" Version="4.0.6" /> + <PackageReference Include="OpenTK" Version="4.1.0" /> </ItemGroup> </Project> diff --git a/src/ObjectTK.Tools/ObjectTK.Tools.csproj b/src/ObjectTK.Tools/ObjectTK.Tools.csproj index d09f5fc..b3651ea 100644 --- a/src/ObjectTK.Tools/ObjectTK.Tools.csproj +++ b/src/ObjectTK.Tools/ObjectTK.Tools.csproj @@ -5,7 +5,7 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="OpenTK" Version="4.0.6" /> + <PackageReference Include="OpenTK" Version="4.1.0" /> </ItemGroup> <ItemGroup> From 9b9438cca67b04538a56b84833363f91d49ab926 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 15:52:26 +0200 Subject: [PATCH 24/52] WIP:build system --- .config/dotnet-tools.json | 12 ++ .paket/Paket.Restore.targets | 276 ++++++++++++++++++++++++++++ .paket/paket.bootstrapper.exe | Bin 0 -> 72424 bytes .paket/paket.targets | 130 ++++++++++++++ README.md | 41 +++++ RELEASE_NOTES.md | 3 + build.cmd | 8 + build.fsx | 294 ++++++++++++++++++++++++++++++ build.fsx.lock | 326 ++++++++++++++++++++++++++++++++++ build.sh | 39 ++++ 10 files changed, 1129 insertions(+) create mode 100644 .config/dotnet-tools.json create mode 100644 .paket/Paket.Restore.targets create mode 100644 .paket/paket.bootstrapper.exe create mode 100644 .paket/paket.targets create mode 100644 README.md create mode 100644 RELEASE_NOTES.md create mode 100644 build.cmd create mode 100644 build.fsx create mode 100644 build.fsx.lock create mode 100644 build.sh diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..2d31f95 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "fake-cli": { + "version": "5.19.0", + "commands": [ + "fake" + ] + } + } +} \ No newline at end of file diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets new file mode 100644 index 0000000..072e852 --- /dev/null +++ b/.paket/Paket.Restore.targets @@ -0,0 +1,276 @@ +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <!-- Prevent dotnet template engine to parse this file --> + <!--/-:cnd:noEmit--> + <PropertyGroup> + <!-- make MSBuild track this file for incremental builds. --> + <!-- ref https://blogs.msdn.microsoft.com/msbuild/2005/09/26/how-to-ensure-changes-to-a-custom-target-file-prompt-a-rebuild/ --> + <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects> + <!-- Mark that this target file has been loaded. --> + <IsPaketRestoreTargetsFileLoaded>true</IsPaketRestoreTargetsFileLoaded> + <PaketToolsPath>$(MSBuildThisFileDirectory)</PaketToolsPath> + <PaketRootPath>$(MSBuildThisFileDirectory)..\</PaketRootPath> + <PaketRestoreCacheFile>$(PaketRootPath)paket-files\paket.restore.cached</PaketRestoreCacheFile> + <PaketLockFilePath>$(PaketRootPath)paket.lock</PaketLockFilePath> + <MonoPath Condition="'$(MonoPath)' == '' And Exists('/Library/Frameworks/Mono.framework/Commands/mono')">/Library/Frameworks/Mono.framework/Commands/mono</MonoPath> + <MonoPath Condition="'$(MonoPath)' == ''">mono</MonoPath> + <!-- Paket command --> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket.exe')">$(PaketRootPath)paket.exe</PaketExePath> + <PaketExePath Condition=" '$(PaketExePath)' == '' ">$(PaketToolsPath)paket.exe</PaketExePath> + <PaketCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketExePath)"</PaketCommand> + <PaketCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</PaketCommand> + + <!-- .net core fdd --> + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)"))</_PaketExeExtension> + <PaketCommand Condition=" '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)"</PaketCommand> + + <!-- no extension is a shell script --> + <PaketCommand Condition=" '$(_PaketExeExtension)' == '' ">"$(PaketExePath)"</PaketCommand> + + <PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' AND Exists('$(PaketRootPath)paket.bootstrapper.exe')">$(PaketRootPath)paket.bootstrapper.exe</PaketBootStrapperExePath> + <PaketBootStrapperExePath Condition=" '$(PaketBootStrapperExePath)' == '' ">$(PaketToolsPath)paket.bootstrapper.exe</PaketBootStrapperExePath> + <PaketBootStrapperCommand Condition=" '$(OS)' == 'Windows_NT'">"$(PaketBootStrapperExePath)"</PaketBootStrapperCommand> + <PaketBootStrapperCommand Condition=" '$(OS)' != 'Windows_NT' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"</PaketBootStrapperCommand> + + <!-- Disable automagic references for F# dotnet sdk --> + <!-- This will not do anything for other project types --> + <!-- see https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1032-fsharp-in-dotnet-sdk.md --> + <DisableImplicitFSharpCoreReference>true</DisableImplicitFSharpCoreReference> + <DisableImplicitSystemValueTupleReference>true</DisableImplicitSystemValueTupleReference> + </PropertyGroup> + + <Target Name="PaketRestore" Condition="'$(PaketRestoreDisabled)' != 'True'" BeforeTargets="_GenerateDotnetCliToolReferenceSpecs;_GenerateProjectRestoreGraphPerFramework;_GenerateRestoreGraphWalkPerFramework;CollectPackageReferences" > + + <!-- Step 1 Check if lockfile is properly restored --> + <PropertyGroup> + <PaketRestoreRequired>true</PaketRestoreRequired> + <NoWarn>$(NoWarn);NU1603</NoWarn> + </PropertyGroup> + + <!-- Because ReadAllText is slow on osx/linux, try to find shasum and awk --> + <PropertyGroup> + <PaketRestoreCachedHasher Condition="'$(OS)' != 'Windows_NT' And '$(PaketRestoreCachedHasher)' == '' And Exists('/usr/bin/shasum') And Exists('/usr/bin/awk')">/usr/bin/shasum $(PaketRestoreCacheFile) | /usr/bin/awk '{ print $1 }'</PaketRestoreCachedHasher> + <PaketRestoreLockFileHasher Condition="'$(OS)' != 'Windows_NT' And '$(PaketRestoreLockFileHash)' == '' And Exists('/usr/bin/shasum') And Exists('/usr/bin/awk')">/usr/bin/shasum $(PaketLockFilePath) | /usr/bin/awk '{ print $1 }'</PaketRestoreLockFileHasher> + </PropertyGroup> + + <!-- If shasum and awk exist get the hashes --> + <Exec Condition=" '$(PaketRestoreCachedHasher)' != '' " Command="$(PaketRestoreCachedHasher)" ConsoleToMSBuild='true'> + <Output TaskParameter="ConsoleOutput" PropertyName="PaketRestoreCachedHash" /> + </Exec> + <Exec Condition=" '$(PaketRestoreLockFileHasher)' != '' " Command="$(PaketRestoreLockFileHasher)" ConsoleToMSBuild='true'> + <Output TaskParameter="ConsoleOutput" PropertyName="PaketRestoreLockFileHash" /> + </Exec> + + <PropertyGroup Condition="Exists('$(PaketRestoreCacheFile)') "> + <!-- if no hash has been done yet fall back to just reading in the files and comparing them --> + <PaketRestoreCachedHash Condition=" '$(PaketRestoreCachedHash)' == '' ">$([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))</PaketRestoreCachedHash> + <PaketRestoreLockFileHash Condition=" '$(PaketRestoreLockFileHash)' == '' ">$([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))</PaketRestoreLockFileHash> + <PaketRestoreRequired>true</PaketRestoreRequired> + <PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired> + <PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '' ">true</PaketRestoreRequired> + </PropertyGroup> + + <!-- Do a global restore if required --> + <Exec Command='$(PaketBootStrapperCommand)' Condition="Exists('$(PaketBootStrapperExePath)') AND !(Exists('$(PaketExePath)'))" ContinueOnError="false" /> + <Exec Command='$(PaketCommand) restore' Condition=" '$(PaketRestoreRequired)' == 'true' " ContinueOnError="false" /> + + <!-- Step 2 Detect project specific changes --> + <PropertyGroup> + <PaketReferencesCachedFilePath>$(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached</PaketReferencesCachedFilePath> + <!-- MyProject.fsproj.paket.references has the highest precedence --> + <PaketOriginalReferencesFilePath>$(MSBuildProjectFullPath).paket.references</PaketOriginalReferencesFilePath> + <!-- MyProject.paket.references --> + <PaketOriginalReferencesFilePath Condition=" !Exists('$(PaketOriginalReferencesFilePath)')">$(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references</PaketOriginalReferencesFilePath> + <!-- paket.references --> + <PaketOriginalReferencesFilePath Condition=" !Exists('$(PaketOriginalReferencesFilePath)')">$(MSBuildProjectDirectory)\paket.references</PaketOriginalReferencesFilePath> + <PaketResolvedFilePath>$(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved</PaketResolvedFilePath> + <PaketRestoreRequired>true</PaketRestoreRequired> + <PaketRestoreRequiredReason>references-file-or-cache-not-found</PaketRestoreRequiredReason> + </PropertyGroup> + + <!-- Step 2 a Detect changes in references file --> + <PropertyGroup Condition="Exists('$(PaketOriginalReferencesFilePath)') AND Exists('$(PaketReferencesCachedFilePath)') "> + <PaketRestoreCachedHash>$([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)'))</PaketRestoreCachedHash> + <PaketRestoreReferencesFileHash>$([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)'))</PaketRestoreReferencesFileHash> + <PaketRestoreRequiredReason>references-file</PaketRestoreRequiredReason> + <PaketRestoreRequired Condition=" '$(PaketRestoreReferencesFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired> + </PropertyGroup> + + <PropertyGroup Condition="!Exists('$(PaketOriginalReferencesFilePath)') AND !Exists('$(PaketReferencesCachedFilePath)') "> + <!-- If both don't exist there is nothing to do. --> + <PaketRestoreRequired>false</PaketRestoreRequired> + </PropertyGroup> + + <!-- Step 2 b detect relevant changes in project file (new targetframework) --> + <PropertyGroup Condition=" !Exists('$(PaketResolvedFilePath)') AND '$(TargetFramework)' != '' "> + <PaketRestoreRequired>true</PaketRestoreRequired> + <PaketRestoreRequiredReason>target-framework '$(TargetFramework)'</PaketRestoreRequiredReason> + </PropertyGroup> + + <!-- Step 3 Restore project specific stuff if required --> + <Message Condition=" '$(PaketRestoreRequired)' == 'true' " Importance="low" Text="Detected a change ('$(PaketRestoreRequiredReason)') in the project file '$(MSBuildProjectFullPath)', calling paket restore" /> + <Exec Command='$(PaketCommand) restore --project "$(MSBuildProjectFullPath)"' Condition=" '$(PaketRestoreRequired)' == 'true' " ContinueOnError="false" /> + + <!-- This shouldn't actually happen, but just to be sure. --> + <Error Condition=" !Exists('$(PaketResolvedFilePath)') AND '$(TargetFramework)' != '' AND '$(ResolveNuGetPackages)' != 'False' " Text="Paket file '$(PaketResolvedFilePath)' is missing while restoring $(MSBuildProjectFile). Please delete 'paket-files/paket.restore.cached' and call 'paket restore'." /> + + <!-- Step 4 forward all msbuild properties (PackageReference, DotNetCliToolReference) to msbuild --> + <ReadLinesFromFile Condition="Exists('$(PaketResolvedFilePath)')" File="$(PaketResolvedFilePath)" > + <Output TaskParameter="Lines" ItemName="PaketReferencesFileLines"/> + </ReadLinesFromFile> + + <ItemGroup Condition=" Exists('$(PaketResolvedFilePath)') AND '@(PaketReferencesFileLines)' != '' " > + <PaketReferencesFileLinesInfo Include="@(PaketReferencesFileLines)" > + <PackageName>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0])</PackageName> + <PackageVersion>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1])</PackageVersion> + <AllPrivateAssets>$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4])</AllPrivateAssets> + </PaketReferencesFileLinesInfo> + <PackageReference Include="%(PaketReferencesFileLinesInfo.PackageName)"> + <Version>%(PaketReferencesFileLinesInfo.PackageVersion)</Version> + <PrivateAssets Condition="%(PaketReferencesFileLinesInfo.AllPrivateAssets) == 'true'">All</PrivateAssets> + </PackageReference> + </ItemGroup> + + <PropertyGroup> + <PaketCliToolFilePath>$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).paket.clitools</PaketCliToolFilePath> + </PropertyGroup> + + <ReadLinesFromFile File="$(PaketCliToolFilePath)" > + <Output TaskParameter="Lines" ItemName="PaketCliToolFileLines"/> + </ReadLinesFromFile> + + <ItemGroup Condition=" '@(PaketCliToolFileLines)' != '' " > + <PaketCliToolFileLinesInfo Include="@(PaketCliToolFileLines)" > + <PackageName>$([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0])</PackageName> + <PackageVersion>$([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1])</PackageVersion> + </PaketCliToolFileLinesInfo> + <DotNetCliToolReference Include="%(PaketCliToolFileLinesInfo.PackageName)"> + <Version>%(PaketCliToolFileLinesInfo.PackageVersion)</Version> + </DotNetCliToolReference> + </ItemGroup> + + <!-- Disabled for now until we know what to do with runtime deps - https://github.com/fsprojects/Paket/issues/2964 + <PropertyGroup> + <RestoreConfigFile>$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).NuGet.Config</RestoreConfigFile> + </PropertyGroup> --> + + </Target> + + <Target Name="PaketDisableDirectPack" AfterTargets="_IntermediatePack" BeforeTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references')" > + <PropertyGroup> + <ContinuePackingAfterGeneratingNuspec>false</ContinuePackingAfterGeneratingNuspec> + </PropertyGroup> + </Target> + + <Target Name="PaketOverrideNuspec" AfterTargets="GenerateNuspec" Condition="('$(IsPackable)' == '' Or '$(IsPackable)' == 'true') And Exists('$(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references')" > + <ItemGroup> + <_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/> + </ItemGroup> + + <PropertyGroup> + <PaketProjectFile>$(MSBuildProjectDirectory)/$(MSBuildProjectFile)</PaketProjectFile> + <ContinuePackingAfterGeneratingNuspec>true</ContinuePackingAfterGeneratingNuspec> + <UseNewPack>false</UseNewPack> + <UseNewPack Condition=" '$(NuGetToolVersion)' != '4.0.0' ">true</UseNewPack> + <AdjustedNuspecOutputPath>$(BaseIntermediateOutputPath)$(Configuration)</AdjustedNuspecOutputPath> + <AdjustedNuspecOutputPath Condition="@(_NuspecFilesNewLocation) == ''">$(BaseIntermediateOutputPath)</AdjustedNuspecOutputPath> + </PropertyGroup> + + <ItemGroup> + <_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.nuspec"/> + </ItemGroup> + + <Exec Command='$(PaketCommand) fix-nuspecs files "@(_NuspecFiles)" project-file "$(PaketProjectFile)" ' Condition="@(_NuspecFiles) != ''" /> + + <ConvertToAbsolutePath Condition="@(_NuspecFiles) != ''" Paths="@(_NuspecFiles)"> + <Output TaskParameter="AbsolutePaths" PropertyName="NuspecFileAbsolutePath" /> + </ConvertToAbsolutePath> + + + <!-- Call Pack --> + <PackTask Condition="$(UseNewPack)" + PackItem="$(PackProjectInputFile)" + PackageFiles="@(_PackageFiles)" + PackageFilesToExclude="@(_PackageFilesToExclude)" + PackageVersion="$(PackageVersion)" + PackageId="$(PackageId)" + Title="$(Title)" + Authors="$(Authors)" + Description="$(Description)" + Copyright="$(Copyright)" + RequireLicenseAcceptance="$(PackageRequireLicenseAcceptance)" + LicenseUrl="$(PackageLicenseUrl)" + ProjectUrl="$(PackageProjectUrl)" + IconUrl="$(PackageIconUrl)" + ReleaseNotes="$(PackageReleaseNotes)" + Tags="$(PackageTags)" + DevelopmentDependency="$(DevelopmentDependency)" + BuildOutputInPackage="@(_BuildOutputInPackage)" + TargetPathsToSymbols="@(_TargetPathsToSymbols)" + TargetFrameworks="@(_TargetFrameworks)" + AssemblyName="$(AssemblyName)" + PackageOutputPath="$(PackageOutputAbsolutePath)" + IncludeSymbols="$(IncludeSymbols)" + IncludeSource="$(IncludeSource)" + PackageTypes="$(PackageType)" + IsTool="$(IsTool)" + RepositoryUrl="$(RepositoryUrl)" + RepositoryType="$(RepositoryType)" + SourceFiles="@(_SourceFiles->Distinct())" + NoPackageAnalysis="$(NoPackageAnalysis)" + MinClientVersion="$(MinClientVersion)" + Serviceable="$(Serviceable)" + FrameworkAssemblyReferences="@(_FrameworkAssemblyReferences)" + ContinuePackingAfterGeneratingNuspec="$(ContinuePackingAfterGeneratingNuspec)" + NuspecOutputPath="$(AdjustedNuspecOutputPath)" + IncludeBuildOutput="$(IncludeBuildOutput)" + BuildOutputFolder="$(BuildOutputTargetFolder)" + ContentTargetFolders="$(ContentTargetFolders)" + RestoreOutputPath="$(RestoreOutputAbsolutePath)" + NuspecFile="$(NuspecFileAbsolutePath)" + NuspecBasePath="$(NuspecBasePath)" + NuspecProperties="$(NuspecProperties)"/> + + <PackTask Condition="! $(UseNewPack)" + PackItem="$(PackProjectInputFile)" + PackageFiles="@(_PackageFiles)" + PackageFilesToExclude="@(_PackageFilesToExclude)" + PackageVersion="$(PackageVersion)" + PackageId="$(PackageId)" + Title="$(Title)" + Authors="$(Authors)" + Description="$(Description)" + Copyright="$(Copyright)" + RequireLicenseAcceptance="$(PackageRequireLicenseAcceptance)" + LicenseUrl="$(PackageLicenseUrl)" + ProjectUrl="$(PackageProjectUrl)" + IconUrl="$(PackageIconUrl)" + ReleaseNotes="$(PackageReleaseNotes)" + Tags="$(PackageTags)" + TargetPathsToAssemblies="@(_TargetPathsToAssemblies->'%(FinalOutputPath)')" + TargetPathsToSymbols="@(_TargetPathsToSymbols)" + TargetFrameworks="@(_TargetFrameworks)" + AssemblyName="$(AssemblyName)" + PackageOutputPath="$(PackageOutputAbsolutePath)" + IncludeSymbols="$(IncludeSymbols)" + IncludeSource="$(IncludeSource)" + PackageTypes="$(PackageType)" + IsTool="$(IsTool)" + RepositoryUrl="$(RepositoryUrl)" + RepositoryType="$(RepositoryType)" + SourceFiles="@(_SourceFiles->Distinct())" + NoPackageAnalysis="$(NoPackageAnalysis)" + MinClientVersion="$(MinClientVersion)" + Serviceable="$(Serviceable)" + AssemblyReferences="@(_References)" + ContinuePackingAfterGeneratingNuspec="$(ContinuePackingAfterGeneratingNuspec)" + NuspecOutputPath="$(AdjustedNuspecOutputPath)" + IncludeBuildOutput="$(IncludeBuildOutput)" + BuildOutputFolder="$(BuildOutputTargetFolder)" + ContentTargetFolders="$(ContentTargetFolders)" + RestoreOutputPath="$(RestoreOutputAbsolutePath)" + NuspecFile="$(NuspecFileAbsolutePath)" + NuspecBasePath="$(NuspecBasePath)" + NuspecProperties="$(NuspecProperties)"/> + </Target> + <!--/+:cnd:noEmit--> +</Project> diff --git a/.paket/paket.bootstrapper.exe b/.paket/paket.bootstrapper.exe new file mode 100644 index 0000000000000000000000000000000000000000..81df15f98183f6e9aaa981ba4927ab18aa8c6d83 GIT binary patch literal 72424 zcmb@v34D~*)jxip`^-EunQSxJCM1C*ge1dc5_S{>B<x{_AX}+nNCt?6Jn@-?RcKJO zTKA1ttX5pQSof{1)mo_5YPBu2TB}uxwOX~yYpZRwD*nFb-22Q-0Q>Lz`TXZY&U4PW z=bn4+x%ZyCJu@s=eU&hU5FY$}_L&gh!;?N!8UAO`kL0|{@8^k!vwl|nJ!AgQs+Vo- zOjh+c_68@uxvD+h-EH?)txHrnece@^-BmLdwN`DmI}%N~xq)F?_2QXA%r{K&)+2AM zaZ5WUhKg)sq!90c6HwfRd4>>Gz^m{i>j;<1ZeYS9K%ccp2jBRDfqJdIP>3M^OFuQK zq{Sz>hFC;6^p>WSfc`{?w};?4)et#&Je6aJ3OxVoPn8h<3}HX$IT>_QZ(>_7=w*Ke zKpNK-c4vO7P@5(v>9m8%w!ubL`u9vJ_QupEC(&g?kZdKJ$p_-!C&^74$Pr>B`4u0s zO$x6V8yDiLy99hE#fA*Gve1743P(yY6>`uT^4LFwhDaEVSlejTIpFmK%*I^HL67T+ zl!D)2c_J{`%9cJG*(~W}aeE5zDCw$&E>tCC+V_H$&KQuE%AoYC43I4x=@Ca!5K0Io z2O	MnE=Xdn4#cR*pXw^f|Do$1X$h#m9{Xqr|uSY;>gB#&F&4F9JDkRT{!dmXq22 zloEjf4Y^sdnZ7K0Ft~MDP7PH6-6LRE0;J6<^jf6Y3VGQ&mq=HtAy@JIUNXz_?QR=b zG@95gno_vvLQlvOtM<X4TzbgkoH?NQ2nMeeG%PdX1!CoSxW*B5KMU?fr?z5AtJX&M zwZf}Nhh>FrIM%X!$ttQtJ#e304OAIt&jus5Koc`TM1~?Uc82E61E<g`up)3nps`kQ zs}93WNsQ}&Js;@}d6qBY1A+%z!hT`RjYCe<+?b;{VH^DrIqczhIB1L>2c57d0%HS_ zIx@j$4N^6TQd^ti2WWFtKO`flL?9Uf2vF{Tv!60TDquGN)Ha5k2f&e$7^q|;zz!$N za7CIx?_N8wDXOU{Mo`{<N{OILHSCTLlo?7gqgaMgs3jVx6&kWjavG|9{@YRY@?5LH zjEsd49^>$^#{>AoD|7t5D>_HNV!=q%MT)EOM5hRuPKXT4g%4sr8K#D@OlSB29=aWP zXA&<DXuyi)NcOO0&*G$2DRG@p!oD>f+s%{hbMyG@X`JWFC*}#;bCKZM2S2K@=-fhr z`ADj5%&9Y-$6WG6Goq-MS4>4d_yqMz4ZMI=+%y7JL&I9qw8AS*`!qPkT7?dJI=Kj~ zX_=PGwI_gwcwmYjLKl5Z=Oq+sPXs?!nDP<x(7^*R>L00eDoFW@d7R!*CI^fN_*_Dt z&dWIIZhSc{xRN^_Dv=?`xDqs-!IY4)2x9{+#5~rjn#YV}flq!h#WFNDMkoBzkj|+I zl_hM?AT7Js4eWI_=^#NV93<fSA*Q7&AT4JCG^PWTZr@dz#W3L(L(ObDZJFszxakYo zjP`+M3`?6qDQpHh)#*MbNu{3w|Ap;IfI0pvI!nit`olM31WX149WN^#DomgDJNJR` z=xJsN#q)r(mDKRCFOqKeC7u$GN-d{)yi2gj(X*wRd=M#BcrK4j1sW}f-)X)_WC}%^ z!3kIqbpC*}rvs9^1G_s0R<o9>ITH!B{ggrhwIPB*7RWvdr(2edfe?7r7ZnDU8WJr! zdAeG)(3nPNrYSq5%n3M`!+a}}4R>-N%9i#);Le>?Q<@NSq~HENIDQ|KsE5e|JObS+ zBC<nxERb&WrckmD76vSHR|4kASe>LO8?cUB^=<=EAa01|N^2*H*eyto7O@W0os117 zF=w!j^{iv0q>&$>$lU-%h&^gnQi=+oh~y~H2kZq(+ceo|@f07GHo8k7D#|hTzYG1S zE#fo09%w9c9zjjRmm{_rwI%YlNSvyLanKVL$;FTen9{xryd1w}F9Cft;E!2;<zmZT z3QnXI;4pL=k!8S2?6ZgoKQzz`-;nKVtZ>5SfI`0L7Lt23=CfBoKKE!%p~qPTvC@<+ zwc(KGwn&Do$U>W9)|6tD$eQS`L~De7ji|xuz@RZa67`d)Ut}e;%E&4}do{pisEiT$ z0x)hz^fIbHdP`&to>uf5(nd)E=PsDw90K4;0f7n&jsV)c7$)0oz@tyg$XYym(XWkK zB?_knYQr|hexOz=Q4GL9?I0T+RK-cShSq{1nM8}DlNT6~<xm+5`79ev2YWUE#-uMA z*$5<Cv*GqgCnpp|{mFBH)kZb}+FgW(?ag>#3`v3d^T*WnGPzzy&AOuk)_0Q_j|UP8 z28CG#>#0A`aubaoG8=Q8Kcd<ZRKf~JO*@L`ZkVFhVK5Hsuo!han@aAd6dE=SyJ23Y zOe4wkuneW_hRvDDP3dGxp~YqcFV_l$?I2fUwsWRO^dytOcSx`OD9p&_z<}A=#tJ<U z=>u@~Kxp?CVD?skT<1d2Za21cH@*)%w>xFsRvY#zzLlk7Pod{%QMxnxVp!&I<Oq3C zch%2s7t8*o`k53riw?sGkpG&TH=(&7W7rdYLPoa109hJAf3Rc{y~>K9F)T^zg$7y$ zx#)19(IIkY7Udf%&0UOu0i}w;2pI6IVlV;*yrdY6fC1f#!3Y>wbSMTRV4y0B!3Y>Z zm%#`aA(z3(L|qXx(m-~umVG9cO0|u?I<;U=#)!Q|mR`P=I(|uI?#;E~%D~NPMu{|1 zDtuFp^*#cEfEgi^BY73A2gAu7@Dc_jWGs6p@a%?sjDhoj<shEy!V~0fJR09VT3TQn zFG0=9b(~2Bb$9#^5fu}u2pa1JV*DJ{MzfrPJX%pw8IdnR6%dN~Gav^qAm;aj8E6>4 zy8u<U>^-2eefIfy#L9j41$a88&|vQcW?x9)A^^ls&Sy3LgkrQ5W4K(@&;BxH8Hy|_ zs9+CtAIgqN3j^q4q#?vBBr=-(Q>0=r`Z?`_Vb8tbV&{~+1hOoGXqo5CA%!#!i*k<6 z!$yq8KyFs@D-fcsM`RS}oTH<#386g*Y8H4kD`sUWtkCOx1^L~v5Yn9<s)Qf@Fe2o$ zaUyW0+L}tyD2B{)W2q2loh8cAeT}(JC|~qcW+g9$`hN14vK_%)pudE|Xv@oxWM2-D zyaHf%5riUF0t+0i$aZEUyK98cz6xv=%a01HQJT^4<#V|kIrl;CHl9-(V4jXqQVgyX z6=Vm+^!eJ~2xQ|>^`K!!u&T2H$!nms*1i@{+SjFU%f3E^m)QFl{~y4*TKfh(?EL`I zY0gV1m<{hI!>Md)+Yxx8wupyD)YF(}mVPmoWrkOkt`4tkFwN4{fs*WoTv@rszL7Ng z!YdJ}NB^%{Kl%|%3#nbD{Z*uzHf=~(+BcD;$&;#DJmpH~O%!h5ObO8vs5A>bC57IG zaUl;js$T=U(6T~SWz}(GZGez0LVQ4m0?8(14Iv?Kcx9nC<V7!_qDCLIV%f5CsIsjg z$JdyJ?x#!1DambEZ2FaUU&vRvW{i~;UYXl)8t|cGhRCdN1Pd6eBwafh@@Z9tGONT* zb(y?jQgs~tO_^nJx)sYx8Nl<>LiiK@4OM*xBzX(0L|cJ@@n7k)(UUOz*;}zJ)K?W} z`6ClxiO<F$!HWNAARU`6wYpLLgvNfuWYu@+oB{JZe>|w0U&^`RmCM3WIk#k_EQxwh z$5C=_=@%RG&B`@EzF;4K_PU08Cegy0VS1DivILnqO$mZ7K_{X9NL4AOc5bwiw?avj zA?ihqz;(oKvn02K8};<NAuUtQ>Tk@WhHdgwt2W7Sj(-9IjVSP-QE7#4HEz#}O{JC| zGlH5|DIHM>4dIpCct{DUhDR3NJ~Pp{&1rHx7r`B8Ot>Tmo?HOS?Ari*_U(Xm4TW5U zC!E`mmCEOKCspQ|vp@UnGk+|Mo`U|x&dOB8Q&|~}9Gc1)!JL92s~C)cf#sTFFaidq zNyT6U3^+|O7y+ZwWiSFpmCIlRjB1y`2pB_M1|#k`E}=G3({ng72fmfOVxYZ(B@4vy zVlSo`D}wN1$&v_qD(?f;e1SF*sTq+oc$5lnWD3dSP-iMXy%9_=pn2PZr!O*>X+P_Y zc1!yXIGj&RXmc*@ue&7X60g7_kk_lupAZouOOO>yLDT{#D<vEvqgMFxwHzudV|udP z-G%D%@z^FH$E{Jcruqi*)b>*f9RxJc{)7T5l`$J-gy9R*{w9P{>L%V?YJUrifJM8( zVOGhF+<{9*4e|hw+=(PBte(klgIE%ddWx1{5YQOd4xOdY>3j;iO;yJjgme`UJ*_Y% z^t-@{wK}1o=<(TigYen+0IJpay})=m%nREb>BDXmYX=;%__KI{>sJe0zlWyPfZRC@ zwL=KI9|Wq#c8u3`laU8V+k*hRNKCg~WGQ)6IwN3!Mf(#=IulZO^z7X=kY&Bneh7I@ z`(aYvl*Bw|^;2TBY<Dd^hRA+?j;5W3HR!mf<hT)?hAHV0WT?yuM-pI1qcVl2((+1E zX)d}@=Zky?nRW7bnMqC25<>>5%yrVm=4R%Ntfx{(tE`Hc#Rhst7}$?1&e^QkjC>b` z$;kHr8AW`y#0QwO2B963qtS^1RqvtiL>`62?mASOcD{k4<5njMNj^sT9tTLG9kC|= z0nnVt6M)W4c$8N_YV)yMard~~x}wMrAx1M*Y#kp77Se(2LGbKD1b#%RzJ?l1Eto$8 zy<=(OM}!Rd?I%Iw@f3-ntpgC@S>c7F#UWqcI1<bXWnm$tmp>s3JNC$rA?Z^Ka1+Mz zQ7i2QarQX|Ffs`s*K!53=qS<JwHY<Gb`rEP05O&B_5qJ{0FP=uf|$j6G>yfS6~QFd z5Q{kXp}OvZ$H@<&zbRcT^CcLh)<2qyfN5#8DvcrpTC~5juo*6f3IyKwiS-j?=M|xI zT3Ruwpulc5`kXk}4PK`ckF;>etqw{0aBMJ!0>v|=>l|>R>U`t^G4dgr&S>rK6>IT? zIM${ZMOJKuIwiBu1fd#t=79e2ER<!4NE_Y8ilCva$WM`UG#qe}u*vlcc4l8d+EKw} z!*62n91+G`fpwk~v{nF)gJG%$_tWQ~#D1PEMgYq=*AIlVwLOC@?vK<8R*v&K<n%{= z2HBEqADe(cLG}6rni#DYN{*#|ZpmHU)Y_h1Ha*N;J@oMII+q^Dt#Rb1pF>HuwUbiR zDY@TSR3LhC8b)g7OseHCAQkgF+c~Agxd+e8WD1En&dcDsF7V$LX+uV5P+^*<bC8qu z7Ii1vr3xoD1t%-lIWr?u7Ecq6W)|B00`OJNa3LC<Z6@<*$f-FG?GlKsb*_aVccjQ+ zFtEzp$$m)JlAKN1Ec*xqoHrrwZlST2z>$n)|B`b03Ve}Y0lBOfji-vndPf&M9Xeta z&XOV&h7P4m!H|bft<%pz$kE38vm*UqHF%SI@W7Dw+kHS{MOqPNF3bjQqL+m+-u)Qu zyC_2-6eu|^L!P!qKd?!kpaT^ZqS2^QHfm_aRy$i^h3kBGH>7Hxs{~;eTG1-Z4&|y! zKa`mx_jBv(e3mJv_gPAFj;lGNWkcCE`lS`hQH2aI&M+(I^9$LOA*X`!sr*k}s-eia zJwrH4bu^WS8}qe{)X!HHhbn6)jRgAzH1KQpz^R3K;lh0Dq)vGsL>sqgcVoO;vCa&l zFzAdcNp~Nef{0;JKMLB6@n8rAm7m-asBjKZE`vKXj{_<aGjCyjC_m=+h4SndVdK%9 z!jLZ%Qn-jVWB#De2>kgl?#JWrR^SuSRWtc7fu940ia%a)2XL%P5&Jl*RwS=NVH{nO ze*`A!oYsnT0W_3lq`fyVEs#!<_GC_LW=KktxVFwzl<kRS`*M6m_CJx>5H^{z6qRMs z%AFGY(w@gE$OVzj0MS`yOv<QK*8PS!yYmgc|BDqVt_Sq5;hbb4ii}FEX<h==PxCsR zLe<lgmhOyzfq6<X7y)Cr%U}cygi<BJ2pA16gAp)dE`t#;8eIk>@Gq?$A4Dr)rVE*U z`B?l0tj3^oQy9mte+5XQE;#tZv5bvMSqz(s6_tZ?Ze~PYhEUXJqn|*8Ac@eEMF??4 zk}N`yMCi#Pgt#I*S%hHZ73hsk_R#?q-4UYoa0APPhY5<OZ86*%;uJ>Pkj`!YR#`<6 z%;GpU21RaXilEy3V=wCC#KsCG6f06f&OcFoEfbEaw8jc0i-5?AGG&Uj9wpgSpd=M# zUxM<Go>914HDckWSXGS)pQ;*yFICM7`P{0dbE~SU{jU_8(2kXv?T0$aNV>hoERvCQ z(~N1Bk#sAJ86)Wc*L4t%%hL{2l`oKybivGu@}5JA>rpO!R9RJ*qZ_SOCB<EW3Q7@F zPNP}UkgbZeUq$<*61S!k2_2Y72I!oG4ooD2bt0iE5kmrf+Y-3K7F85OQs<<NbWYlE zv;7)M4`5@J+J7}EUN$bBbFc*qk1EA>>%>&>NBX$g8;Vbn9KJDE&5k%1^p}i8W&J+v z-HxIx8$r_oH>|kW$uZYa+)~9Y)m+TtkR>Zd`gp-`%F>|uVyf{LrDKq5nduvJqkSGT zv+N!Gl=e1$BGm8>oI*~M8w?l$0|8nE6h^=p=`t9hGo9<;*J}9F`8NfJ-=SVIvWGpX z&TY5js2D3{?Bmt>?bOoD^ILW3#$CU<z&NEy<QTL?UI$2i1s2yz(qrKr3OoYN!U5{& zOxUXR(XlTb=F*z=dDw^D0%BS4Kg6=V$Y9a2vJNpAtZ9}TH!ealf>Y%8D7dk}qO<1| z9g|@U=K-7(BpM|JgiMJObu@D5aV6eBDY*r>q0VGP{s3<DiQS{n4z-PSb-OX1)JX%n z4Ne+Pr-kvGkg4tGlztMVtua5FBA3Es`z_KjS8u>+<_tux0iSxnXcDJMhmrL%ay1gn zNFkuc?YAj6t=SDx2jA9^ZzDyd_Z_74PQe_GnEWpA6R&&qeQ!u)m8mnqb55b(WB-W? zD2x1=9z)c1S+vgdcq4z&oHhFSS9%ULC2uW&cp@cK4MP5xl17`!_wbDTjR@+iWw3V` z*~|Re$mI~P4cLE2x<&gqoGV10!-F?8FkvOJkcaL}Y&>g`w<u8Ak=-y$c*4hx9BF#| z6lsib<O9g&9$jev1J9}|;p=ab$IGlni`Sdj>tdM@@Kpv@R=sUv2mdcn**IyBeOE2l zcaMeRBOij>_;qI``gHOm;5+C(72TF@#KV=MsT{toGfM|WZliimGzWzlv;PfQR6Fu9 zo^|9ith3p7pQ;2;<TxSh#Loy@U3ok?0bQk5?m}$!)S9~xMLiJE8ly|mtn_J`8o`n* z&`;)3{}@M4>K}}xucV$LgAiZ60=<>`MJQq*U%>f3>Y{G$)%Lh-5Kg1`CZFjc?k&T7 z@UiN2ZscdF^L>5}a$e<UnR96wrI$P3#8c(Jt+v9+E+_6_X9PX5;gl%T7cl`N9ss)V zBAeDyRq%0^K+fH2m}>c*aYx~7MRLYHg_&_r5w^WhsO~a8_s)XK!a7P|#fJ4q7@nq^ z>8IhFZ0TGG<(AJIvB<igfQMJ>aFG5}ZV#uRf-c5h0GpTH>>)ZfV$NamF1&x5>wQMR zINfD1@(L~j(WoY_Xk$>9^r563ri~JCR^l8;v0&4S;7L#9B~ncN+bbr)ZUc6!B2C_A z297r1auGe+YOF#gOixy}Q#3g3L!a`YFL0DPyFN3(U0%Lum<V;G7qhCsf;F^zJZv@9 zi+{L>p{vGUL!Y{kYpitc%TTME2BXXJMt(~+y23vKp>VIsFEU!l`o9CSevxF-S)KMF zX@j+9=XUViZ8Pn5@E$`vrP@P>UT89H;G-buZhHw@>eLs~aG}1B{-MZvM#VNM9u!r- zR5<wo<6mH%4*ycMz3K(W@2ASN4+4!~aT3U;yVY4x$aezz-je%)i8mE_i>h?wd0ZEi zJCCA1Cw8A?fZE>~RXL#gCss2@8^m?a&8#zBW%{|+Ay3IUC3ZH{)rCA+$`MtkzTHgU z*So47K*iu7b+38182qezulY4`+KaBQt`-Y_m-ZFnnLrlZ7x|o^Q5Mm0Db^SCf@-?w z#IQhB6m<>f!hw}-1Ml>kpiK*<z3#kpvZUMfe}P=t&ZsJV662f;%#9lQ{KqYnI!cbu zZ;!w;^UWJy?$L?qsbEa0bG56@%}M4qVASCC4_$%pfupYJ5%zU|`liUbU-?CdFNpRh zL}WISa1u>%!Q|r_$kLvz6SZuB&yv#+0_fc)EPZjvPQKxx$1h1)ycXSc-U&&MK?tXY zXQG4iH3eT#;FxVXttPM`4nzu|oK^u1{9ZC`grc+bh#poAKhcPeUQ}5T!RsmkXBJq_ zQUYgFVm^5N<0(`jWKEza%^-|`fk2@cjFdU&AWJk5jxJZx42}MKn1^76r4P?BCeP!N z`v=wvRscI~L<kvq7lakTDn!M7kJtsDR6?#)&oU;D^xYSrM82IlAINcQ7S*yGb+7HG z6k5wPz#IM0qbgqv#_qiXGtH(<K~$`^pHgV$(LlYc0lQ`WewIaVzK|*0K9liOHop$8 zvkkShuK<R(3uvih?Z(nI)2caXt0;xy0N=mU9J6$wu3x5fS(Y<#C=?gKu)!-WXRb>O z0g;ii%Ep;P`l6{yZFIsna$oX@xzLXTf>23-FHW-?8m-Fgl>yUP1AUfVguFSX<+qfY zTwfNy#M$TravS_;I%`vMwSnR>Kf<eiJP#j)UITiaZAe$Mc)&4g28=Emvg++V^f?N` z<SrbuT#1K_yaDJn`JH#GvBfzJc_U|Y%IAyaIA3?g8lp~YSh_fUB#3jlQ*c#bK2Mmg zvvkouo1+=U^LtSj%=Mx4f)R0v%u`3frd<p#VcNY4<we$lA9daWs%o9>TvD4hL(ihl z@4%yxhGX*2Toe(RY6j1y9e~$y9tKYpmt`^GRMzQoj+WIqTU|oQ;MG9NaJ&rdpw^R{ zMcuWc44oe5`d%>_b)mlL`~vy@L%Zn4;C>sy9?^={VWN#-2Vq46d<NhZ2cQc{A!mL4 zf7IoCjC8K;z&5rb6oztm?HwtB4|xWJ8_2g=9L2Ky%qv8ABPQOlIk}BgQu4=?$z$5j z;Hg!F?I%D`C^`e<ibD}2u$$s2`aPXXhLSB9fOHRm1ub1bd>Idkm^hclWf*ojp$IB4 zh=wKQL-Z0ODc?Mu4;yjHcL_Z_yS_pX@2*R=mieRwMg^QPq~$ZRC|&+2(z8J8xlHN7 zUWLnFn9A9j%IVsTb_^vK>3j$-R6e>5=UYtqO3Cg{%2(#vjfFhDFBM8I;e6(<tB@hG z8V2Dz20Mx1Q|2hueJSanx_h|ZbugLNj#$l#vCyHi`AmBdWTMWcD9Bx8Nxmmbue8** zNJ(bvyNs_xzU=Z`bV|JGnwGCEReL1bdjAS8Q#Ts5gM61ECYGy(8|K^DxZO}E_o3nc zCq1~sLp5>x7e}R!m!<Yxqr`&UVm6Ht^c5_RRbOEQ48(KAU<8aQE`t#;(2tb_BVbH* z8H_xbn%}Trq4^CP3`=?=She%p3s?){>5XLL87*@zK&8mvG+w`K2)rSNHd}!-n(J?X z<|2$EY<kemF&SI-<ETvR+$6r$fLGI;E0KHGen@4?I5&e^V*db=yT6Jwo)d2ba@;x_ z+4LI=l)?*wtmD>dV#6Z=o+QD*m&TMFOJp}};~8I>kZeVwwUcbag@BEh_i<|~X^)1J zERG?mBe*Zn5!@GVw#(3OQU`3Qw<&HKXj_|GW^F&EsFHmr&DiL#D@n2(I_ZVahTS(0 z)U%dS)f7%CkqVOe+CZ7OtD&}^Qs^Dhh8%yR#Yb>azn<Y~KKKFJ1Z$koi4MTY!dXy~ z?K}!+=a_sS*;s_N+j8dq4qO#+u@J}B&>9f)s69`Lc_%h<t5S*=yGrO>0k7XF|2t{j zDqeaA%(ZmY)&_CaBj_Eq5}xT!hcm<gNj*QQrlU6+X(~Fp9q$NO_7He?@R&AJ-F2=2 zrxF}K1uDc#Y<3l>s_WpJF@?@&sk(-&WHl0YxB^#^K$$Z+3TJ?aF9`)Am|z1bIrUl@ zUpXHylM(D}tXQ$Kd_atE7@@0!ZOS9CGRyfAbf$Nmg?^pxPt6(ZV?8OL=4yU?MFig! z+Y!@w4|@&FJDuX&bFhgIhcMSuzR#cQ=?(RaVSwur>IFH@r7$Pg?FERG)C+Q)=cwYm z=f^}huouvfp`zgS@1sK4f9b|l?99==`13kKTD{8aAJDuZ|A3C*4|!EbXc#&`EG0z) z7(#kM!nV;1j^u89(~kYUhu$oqJwc(BUey%(wA0YSYW>1_;Y6Y`7BJ-l7BDP?x9!ym z#&t%j!Bl%qH6j}gelIqFcX;XCcP84BKIt<NZ-aX#;#Dtj;Y=jO!iEHUZVz4?+clk@ zo?TGjk=|W1@NnljghF*jvXc{cQW{_U2aaadaYzWzb`DVt2PRH!EWN~&J4x$hi;-VB z8_U7(e_nbV?vOjl9CZwXH(1rpOO-RUF|8BBk|ibE5kZ`@^ml5g-bF<ss|v-f)|xzC zb#&li!RUCmfS;qV=xXOWD3%e-+b5hqG3PMJU;-nPTwkn0851xjRL$@TXE-WkreD5; zOabTD83tRIP3HQO)qM6^fE?tPt_Z%M6^IN2$Uf?=3*%&zwhVeK=7?EKg_r6=aTeo{ zKdLO#{w|aq9bV^DG^IVGJfa+ZG`G&V2x+_qr}tVA=IN7{Cn~C-lkup?#SDRcwf6ci zsKQN21UIYyi&W{+CVzvK7xhG7O7Bqw^|cjHf>?p?r9DF>!SsM#i^^apba((G+lraK z#_R&m@nS#LF8CsYW!FIvQ%WY&$IM)RR<a(6(I#9JV|j%ay-X^bzNx0l9&b9YLVuYZ zA+hoKhVuy(H=HR`@^_ci1>Ja1>roL!H6<IUW*ewxbIsI*tG9vC0uwvI0<+{sxL_m+ zZX&^bjvPTzDhln61=Ps_;BR+01;8TEi8FV}FICZZWa#_Ira)u!$0?!QywZ~D^^a$% z8&H&|Z^EF%+bBh5yis!>xQ)JWBu08qPW};RIv1JL0<|f58rkZQtz{8>%Owz9@4g_q ztCw^~@ZFZct}P@$>sIxh9544_N)K3-pEh}{@R)!&icmEP+Fn)X?-Fm+%R>4J9OW|w zmW$$yRK9Gv6B~U`jt}oUgq!A;1djH}VpXDF?%akXddt$H+pEB?9Ux`prz&|TQFcH0 zxj1Oe+SNyiVNMGNj*d8$Tvp>t$~0NTx=<Qyok+H-^H&dS`|_8St=+C2To7J8R|V#y zKpM_eT(m4X0$$m{F%x5v&Veze$sd)+$CS#Q<SusHm~2_1%nmdZmhklfwntobzC-}N z9kRQq!W1ncQ(+W+C&8e7k-*T$JrU}P6OWxcArr$|0T$2;={wH@oqaUV!i`a#OCbcP z*p54!VIn}|vne@~n)rN3N26-VK`(g*cv#REj%*Z0S6e$Tf{5Hndp7%Hlo8z_cV5ga z+K$PcXbQkfDftshMh@C$$(^*zvOm=<+Cj;kR}$+uv1ZBie#nWUJJVOqP+c7I@4A{~ zv4S2{$M0S8mxgV;_p83hKNiBfu7QYpH#Y)*@P4}+e7Tbn<WADS!vW`6IhJz(N&KcD zZZXbw4xdUey3Tp;1is1F3(=*Lm)$YEE=w*hf|J702i120<WAZL@SDV=!Uzi~ieFxj zj3y73AS`62R8o&=N`8^Ne<M``cT8j0)#>OlR4w15Q%qhJ^Fo(e2X&p+Iv1ys9BTRS zcgxtOkxgSpjv0jsMBtmwU4R!Ou-EJs;sZQCz`;sQYp>JUy&*{wZzFV-q7&7e)hfjQ zsNbWgnSE9Z=3fy6O<xeHnbt+$@8b`AYpkfeEjud@<iCwEqC^FH^aom_3oPXYR`vp0 zWwr-Z;WH2fBkHI0{Sq++f1UWFK|ct8WW9yIQjHJBQ-~cn3!{%Eju*UEX^G1V3BJN` zZ^0dvh2m5A&JyP`=Z1n;23g{sLW0W}h8Q+6{8_<|i!AYz+Pz^*ylKAZ4Tuj19kDDC zi(OJ<i7}oRz0hn@>f?-0^1jtziB2x}5zpRmo_Mf+az&mvyI^vKB}RuIfc)tUOUn0# z1LDT|cWMKoWjMi-MuJ01NZZfKNKy`Yz&l%9Of4<SqH|H=6%`M_hNZ=X|GS)I_JCuF z@F2?d%`m|O6}JqxL@nF%9AH4qDk06oq2Cfu7n00tL#Xtf#dlN|h`R<|iMp3mUQ$ya z9;+w(?>QvXJCxv~tl5vczz@(L5Z^8%J+H9Luek2feB#Rx@t?~kdpyGk+FXmDBh?c3 zu}|L0A-}zaR<OkT7V$4(nd8L|cuT||a~8l$lZ%P}n|kuzAJ}_y^T>yD29po(uc6d6 zY|k?I5S}lh`d%6)&;NN4>95YC((_}~rbBbdwu!^;s0@fnusk3Zu(zM7Bs`Hr@a~}m zuV+iD;TcP`RS?XF{{!N*in%ob5i29OAV{7+0M7@+lQqP-ubec$!|>$*<@&>5f+6<* z*gPt|Y%uA6BA@)zgwz7z9em}W0`U`gzCh%Z5nK#t;b#^o@26!1g_rVL?A6<1R3jgH zPMLT-w;qz0bL;;qpZMdf{ph84v)}UBCvUKZk0D<o-ZvLij4+<BpkB14mMpm>n=HvG zqEfyKNg6HNFzM2WGDJT@d@ovk98-Hhy+3%*;BgprDy>^nA<#i_Qw^nMVLTFbeJ)WU z+!T?P)2oOoz&DSHYUO-II3>Z2sQ4hZXYkkY3iaun)>KQ9WuQpQy~7km<31?<&`4B` zSR%-lUz8A4D^_y8Sz)5;@GCErucLyfdb}4v)b1crP2zmccLr-2B`y`WLhDx>zf?u> z<qDR33e-4Iw1x-@hp91QA4|5d<T#uylg{s#ydD^b8a&Bqw?yYc%XslDQ(GGpb%eD% zgR~x`{gU%Nz|;isI#bU<awAqN?}<IoIULkDQ15fTVW4_2<6}pMw2wL8bWv!WkGc;Z zN@q;7#bBnsR!h`bn!29Tz5vRs4vHga&2i$3L?Pc|=o%*yqK>J(OsyA@49N{xgs1au z5+hi07c3elHjB|rJ<n9P7@HyKi1C~@2TPoBqE}2{>J2Vor<lfe(r+Y;!@bXpjC|)4 z1<QWUk{5{<raofoVlj^?5Xg6#Sisagrmn#Jkgm~HVu|5}m)a2c$KjVpS~=}T)^dYb z!PG4#rR^81GD^QutT9^qC*^H2Tl-(EB{;R5VE!P2eWe6%11u5W8@|b0(!Z{L6V3w{ zWjVM>n-JIn_?4_3fZt$vuAlHV4992f0-ne4w^@7hMu{u(FU@Q1-{ak6juO`mzADeM z9`jzGx4i$Z`YnK^F@h^g2v%j2=G*;LmXk$rq>tbeKGHv#`8P4XfZ;p-8^F&+xuZl~ z_APnU;y~5yc_FrNl;|qH2dR(wuLt}k!&iNT_xm0Me4jPvGyKq^QfgWMIn24#{~hT0 zc=!(>`DE5lVB6KOd6amm?m2Ll1rFzp7vqOet`D+a&>Tbb1%8vl!vW%Fa#X!kjmYLD z{d?hm_!h8Q?5MsT_K&S2{QSnlz^`a{0p&JUY%-VkZwG&Q|00IJ3ld%xCD<Jzcvn5a zA&f7`A^d}Eg6E=5Ap<*?_a7=D=;RX2)V7=@e~7kT-mf$(4Nsxnm-jcLl<}h1`)Xc^ z_)xqK7%>U1H{JnUW&R5=%>36R@vjk{d`o;4xfG<lIr$~xej^0<h*<{s6;D|{@oRwJ zBO;JLTr(1IBI;{#-7V2P)B#>MY%EJofMi@yTZ}KD7JMT@o)25sL*}-jQ}PYG+d(A; z01fdi&opTJac~Dx{S~wGm-qjc>;7kk7qFLZVfX_;vSc3gzs|J?nTvrBH(qDWt5bSz z8%nr=(Sf-JtpMBd&ITuwpNStFG&a9l+{i7v4jx|8zXLv5(!YrDiUPuqqx2>HM*&@H z$7ye`gAKpI5ps!`?j^XDty<^VkiWPJK>*`?cwG-_eUqkU4B4LV5r>)DCpv5Pz_P~? z4N3B`>V5gy;^G=b{igb+{2UQMJfgINRd?j)iM5(~f7spmL2)-z*NXhwyYmagHbhvG z{N=Fk<`;?I)G6x0>>t6Z_cV1!@jUc_HT5bjQ1?uJsW_mimZG2M4-((g)OFDp^UK92 zDeBey!D23LJ5a)F+4FEKzJ{r5MZENl{3<bNIHg@Hp3j|!w<Wh}>e~8u^J~OynmTRx z-|}n43z|A_$iMRI#8_J1Bi}hipUQgC#ne7=Y4NA|!^Is9ly-IL{z_l4QQXheMWxr` ze7I2@Q<VR@VcAG~TT|a276kP-O}!W^2{wt3H1$TT9F&Za&Wrq$>MC$c7tqwax`%N# zQK+c|(ngAMP4yvdq!^~D(uxYK5Mr9Dt$0|D664%_<rQMIn5?PI<qylzVwR@n46P21 z5eqf7Z0K-MD>U_4b#-v8Xwy^~(#DF7ntCrXIyg@BFtx}3Nn|3Z?J5nPm>3){E@o<< zxUG76@HBCYrbZSo2%atuDoHUc+%6}GN!S$$@w7OjxK&ORi<#Od)(&kAP80_;bu4#v z@C<QGQ?FD!lRsHp+(h|QJ4_KbDN6jczCAca1V>QXK5=gOxxuMoBU4IpnmA8UBByF+ zaGLm@rmnX324{-rX-kiMXB2znY;pQ1qOKO@RhI?lhyzUR6Ei~lg7d^(qbcno|92`{ z<$UpwrVdpE@v8xkYwCmAR=GetrK!(qgJOaBnWjc$x5|a$MNOTV9mKcLj%sRdr~<!D z^p>W+5PDcH6922I=Sy4VV(~9c9WBMmgfBYDmahgYu)_0?QI_2wd{{0KAx%xlslfXc zgEZBW^RQehhH7ej^)10x5!KYf>TiM?qp3SeD#S8zhNkW-c~~wJGZe*r{w&d-qV5l# zB@QzMpB2r++Ud_s?GfF>2g$R=;<04e9`WqZgTb@K9hw^5_|xE85gSKods*i?(aqF8 zam|n;!FA#yrd0cNh-*}u|HarV!49!sQ*Xq62kKT$?Y7<wCd9o=T`RIH-vRZ*6m_TE zAbzT;-xa+R+$esVqVAOEh_^Jgul$|hCh_kSb*J1c{It<VWGK&mC)h1YQ`DWZM-0`} zCAIGa&lTfR)SWUZrZIK37?Jm0uvaY8lqdM_;8xM4sbgUo+Ahw+Ndfh`X52>X5Fcvl zpp_TeDVFic!animqLR=qv5gk@=&eViHK9F%z8_BcR^!Kg_KJy`y2TnBx=5^66vwPf z#CoPK^4~h-A#sW5*3?}?yr8yf>R(9viujVIj7l%4i#4^f_#x~8uF}*xe4YJLv0qc0 zg3Y1J#I2gz5u63;+nQ=CX_c3Y2Q}4I5)_w<$29frK&!k$JgKQC0zvF6p4Zeqq+Kaq z(9{8>T`7(+^_Fp7`TWpT;=oj@`_rPdW=ZI3QQEAi?(B!Ko_L(8ed4^(^3XNn$TUh* z@%mcvvZDNNhFj&e;&n~E7Y?F@-__LOyjFRg_`9Z7<puHGfR8n`sbWp&dSTK5BgWsB ziVjdYOzjiRq0OOv;%=sto&PhS^c%$98I*6I|IOja&<)~YO}#gKH>k%o_1f?TKaR5a z^RzcyJW{5qS-IC3H;QLiQq|}t@mr?$_;=NRC3KT`LsJ*mUkU2ZOuc20mYaotCMms0 z6oju2eND_~>MetG-Xb<=>V{aWyj65-YH@9g?^dxzQ-kxq8oEvNYwGOWp!mADSW~UJ z*N46#uF_Pzbfo;I*srNhl<+Nao2GhV*BIXxcWG)x{%xVV#rHIIVQ~=ayQ7+V7xTlt z;$2NW!_)^%T`dlW?+o25`e#v%-ZEAfT_1Wtd__~|SV6qAx?fX^V?ptdxJ^?%RgZ)o z7T?y?7f`=P#Dkhz8+#)39r2i^-l=*j^gZ!oO?`-bkBL_`6|=4nJwBjqe<0rCG!?Uc zKxX0dw3qyurpTXZiv0P65`-lA^H7Q+fBq;%kw2eIQRL63QWW{~=@do&d?rPaKc7ue zREM9YD5}GADT=)Ge2OA3{VYY1mwuk2$S=Q0QRK5<rYLH$7g7|pSel|XN>kKEFN%-Z zXM6ms8;^v3EzH@Jb&tQh@z<bon4(_(>(EQ0LZylO2alA$5%+8A>bi%$FN=yfl<y+U z{jY{zArzmdb7>U6rU+2CHoOr^Q{QQLJ571tEB$Nes4MBMFMU7syA;)pAC&lgirSm| zap(<~%H5S)A^wn}=Anc?h_l$1r~Op=A4Hd?l;n1%-pW#vdz97wIBfZY_=={;6K{%Z zG)10xQ+!oXG*cG5C0=0aDRFx6uc5a^tc47CN(>9WA9_cOolDdn(U+4|@Mp1ho=W@Q z{EtKLiM{g`Rg52H`<u9qsXgM3oWF+tF0vL-+C}2>oRRW<QO=a=$sdTxOzrjG-B?iY zftabOgN<QO3pGVn|3fU-6j}Wb(Z-bW#6QJ)O_3-5DLR>=wjEsXPtnhms?mqyTTJZ{ zCDCs4BQbU%S++;~I@l^d7X6w!o<r0zO--q(E%;cRzKA51Cq5A#ERu+#+I}VuYl=J} zjJze3rb;)AQl_5vlVzq+!IaX1jUj(jU&7lAnj%Tdc!nk4%A%fS8HY7RJ<Bp)Rg^(J z%V!iVrHpSG)U*7?8ck8p$~Lak6!k2;pv<4AywtY2DT>+_TUeb&HNvmNYKm%9U_8%S z_K4hyrh-BPi#dFV8edRssQFK=v%<y)Dvet+Y<!|AYR$0WUB>x%G?p5<nxfV$HA*x^ ztKUJ!5KYnQcaTx9DO%x{86z}BE8H^UbWPE!vfP-eDOy#Q8!b#xJIpAkFt#wI`b+hI zR;f1nIZgGDYNKd5*{RxSsPWzkMUh`>jRUI`MSiI>?qG^aSX5ANe5ljNyA8(utJ7Ly z#!oawT1FTzGNo)8Y5ZAJ)b1mVkC;-Uc%<R^0%_SJ-pQu4^E5TME(q#Xrk)aH%P8Yr zrqrk!ty_gGGjLM)Pfoi4XS^*woExqoofn8vW{Yo(5!94ztST65BsI0p>?jy#d`VN) zqQy7fxJ*-jlr6r~j2ks|ljtrueL#5=jBn|*!;qXXAZ?=Yos6`J##2lwtIrr9d4_RV zOFn8O3(hd!(9{#=_JT>q+nT!8v%O%l@s|uOQwC_6Vtk|}zavJ<foW$Nm0whzxEu$& zXAa1BrV-O=w)|4TnZ|yml$}!tNKQ4rt|iYA_10A5Zl=id_<dsI8Kz!0>M*354RJP= z_qwrfcm=4tnc5>JdMND~m6o+7(kh#c!&>qNy!DVy`yO6>YBqkO(}q@FSkP?Lw<(?L zE2knYb2Zv*jO4TnM4r3?lIJm{>M(79<TT@AE%_(3^fcpIO_iJ16-+nwX=)65&x`^2 zW*WEaw0mW%oOwdpcXZkf@a~CeFY2_jPm%VvPK(K}7Mz&xW1aS6E-!a2)t!8OjWN@h z%G3oSQuEi)Y@=6GpCM|@F)q{8X;|sZ8DM9N@pYXxT^=ZC8IU&D_`XiFye+=D#ve6R z?HwuS8UJQV`E&k&eDe(}F7UZP{N6KC&NuQjwE+1Rq`bQa-d$)^>$EP<fr3SdyM{P8 zjBdRTWz%oX_v0SO<tThsEv3F+O{uR|;f|SQyy9QEB>8AD!NWDKjEj?`i;o+6BCbkQ z{PP<r^(vfR894bQNM%W!pq_}&#HowRpI$_%<LZc`auwzi=Z<>fm|TlY_yFvb;`eMV z)k})oVZSLV2T_d*^C+*<`G19ew%iMwT@7b)>H8~)^B2@eihreWLoDRd$*TkLdm$r5 z41P1k(gI3VoP})j&Fn);mEt%gP4T{$WEB7ZYO|6zP<M$_V$wzydf1=1^$*d__&W3l zpIDVc-*H{fwNoA*S|X7v2Q6-h8u(m_^VkE5PxW>EP=UNse8iH3<Nuxb|CRIZkYLah ze~YCxzdM9*<rC_YhQKri8!lz<O>7{%8Mw)P#)H#!k|B;17osnjVl|*4u4GB7yNi<t zO!kjkyZ^@LbtR-hLF#Fz%6p(PEu(a9Vyme4N|DIOmFDAr1j$Inw>qKuYs~2@Cp+hG z|55x*cy})8d<4)CPcg3aXUgEh3o<WoG{{$$a4m>$h;8g)1r<lhFXr*6@G{7l;=D4F z&(y4N*G_7?Ogn$WRw<eP#?DO5X-nXll(kZ1T5_VDuB7t0iXm&bc6B`BHUP)(y>hR} zY&#k+xFP4Uqf#l7D2@v=`-bXEO8<Y#>z37S(MUX5r^=gYi7MrVMzS+g|GThIiafUJ zNsbbk*4A;XBaUlrriPOxRVgQ1ezKnbM&=;<?XPUZd$3Ikg=c!~WIS!58>!Z12ZLVm z47c@vQ*OEy)F}3dogCBtb6#p+*GtQIKFWlLIPPU~e!<?(<P2jAGvRk@NoN(tDc$7} z%#>HSlDQFHk{pK(aS8W2)%qvPpNf+&{(@Wazu<Ru=iql_m*L%vwfG&kHTeCYwRkfl zfWHvl0kiOY5r03!+Z(iY4*_~1OL#S40Jk#NRtCichRqCH7%pMBiea4Loq&eeZV((K zudOT=cN!D04&Be|&m8d*e$#uu@m;Ji_Zu%^WmzOHtQ;?@<%L*D4u?D<vHU1+9^ifX zi$#lEIearLzPjkkVi+`E2hQK>ZUiS;bdOjf{Ur|p&M5vaIM-G_4!Ekq0Oxq@X?#~K zT2ujeZRHWMN<Nu05B$esFNwIEWW9%9;H0wRvTXRjM5p{g-6!H)dAQy*mdJy(*~ZIA z4T7_4SjZR)oXY)qZPb{g@z?TK87=bc=yqd<aH942jqFg-<;Hfg+`7i75W(RO!IF_V zHvu1(^G(3Y8nSkM^bzPkQulphk8BP-1^)8zb4Ig#5%panOKXl8x8i*Fm~pk-<b4xx zfAyb?{qlz5zZvtn+$HkST94c=?x`IlTVzda2=F&+N6J0o`r0$V89lri`10^V*~#}% zOJviKR(YrFsC^nIW>nuJ;-d0)`K&lQ+9@A^AG&2oj?LWyJiGc!(2!q$xm+bK!R<`5 ze5QE6JS0aByBY8wUh?y!wYNiCbHSbRb@7*)djbDG^kKl9#z*B5d0yy;@*T0P9`Bq; z;vbR3e@9Fn^tAj4rPB$`HI2Up{*%~iNUdso6Zm7m&qZ%}SH3QPJM=x^j}HAO;0Wxd z@08uRxm?C|U&F9Po*t_)JH%;4XPJLPZwU(W&)Mcj@{HnyxkOrxxJ#BIyW8yK`nG`6 zYi2?JrDg?s+CH<3dtjEi7k9i}g7!qnRr*b{+Sr*-rvOWfzh{QbvSAgt{r*kO56wa5 z^6-z%YBN;SDwoLpIAI@-oBvih%CI8Oo1>r^;{vc9d9SVfojJk$VfkMGmyi!Rwb|HS z@`3rX2;zLF1wK4(9^!s}NdC6G$kS|o184Eg=0(E@epvW0yj=sU4#_t$Mh?jvaQeT* z_+_Bdv&7)uZrmLk1^kzR@t!5}jhe~8X|xh&k%vYB{m)*@ts~&9s@MRT(e-5cbiiKr z;YZ@<<-|Escai5K;lZtSCp27Rd?dDqZUpDc!&}iV!_kLnEPUN_uF*F9ZqIqp`Iu*k zc~<aA;MZ0@3&~P=>^yD@l6=7vHy;`DTfk?BybicG|4!LyURmPvUSibXt@rIFjib0Z zZCIXnkNHe>v3HfcAhuubG4B{u=Dpf@rn=gDiFt2zy?4J!(co6YiQ?SeAkVLo->Pc# zQlB5~rGB_rJPMmh+gZ@IO8&WSn)d-|#ufms9MmeQ^j7a)t}miQ_S51L<Avdu!;;a6 z50@AZTi1G@HNIQ9-}|WXIF6|HipO(~AXbEm>XAx5yc5=5gK>IZIlL`@g1E5+_`}{# zLH9A_y=T39<c!c^FSUD6JYdcUz2&_OB_6?>N)&l6V{H$Z=aqlxy^bxp4yDxN4GYr$ zx}f`uBeEcrXFX~bgo~`#1>IU4GH-xS?v(YhLDroZQ&rXxvnTecd>QuOy)Sc2e!Vr^ z+?YQGa3<iL^0(m`*2`i@{X^m%v!G&{_ituNbeZ+6@mP4Z^%3VfA}9hMG8e}>tV3o` z)h0lS35U$)f^&htQ?(WH(dxZcv;1-1et7%#{Qc-5R_WEyf7kF&WwU8UaSw}D{+dOe zL0?6DzSkNh-?M&X86M&s5z&%oted!|E%Mt%Z(FP63&lPkN#^<P(ER-R8{xgHiylTh z&M0p15k3j9u%rc&525tCS@L0qkF&>U+&$!bUTat$ecNi02J{>;Hr4*hcf|NdFwgp% zu_OCs;249xzZp^V@OO;L>W_Wz7<Y%I|55SR!gBv1v`DL*0X^u+D6z&r%5w%<VUY3N ze2T!2*4_)7zn(qK`;I|3R;%PE-ckMus2$BIl{GCsMELMXX_(K}&Gk3S?9zE659_qJ zKM(t(ivV-P)qscyc)7WVVJX8ZmYFZ+Wcl&F;%2}#c(cooS$Hd8hd2-Ld9eq%JO=6U z8>F+sxCopo<66LB#{Ga1<2k^XaSU*z@fqM)BPWn2PB%h;lZ+C;sYW^A3}YhT9AhTn zeEj@<9^U;+0xmPI0$gc)6L5|3IN)02SAZSHp8+=-Ms}X)GD-n^j4|1M@v^ZMrF>v4 z1m{EJn}DAfc{#Kw*$3#6(Ol@4q-U`_2z;6R2yms0;wwCBWJ{hDhS>wS$J3M7g#SCo z$!fxCq_D6FzZ+QrSR>8=Y!EX5$B1=+XNVnu)5V2=^TbiWR)${?e=2Ne4b?_F^fWV! zGu*@QfI<3iW&9xHhZuj7@nZ~MXO560X-Lvj&2Xy8IvK8I7-!hea1X-+3~yz4kl`VQ z#~8lOP<Tj>!LW*9HN&Y4n;A}LxRzl%!+wSrFg(EUR))7TJjn1#hQ}Db&hQO}!pkKx zG#OSgtY%ola4N%QhSM3YWf*7J&TtRITN&QY@DRf%8NSZ&4TgqAC7KLt7&bGU&hP?; zw=%q);gbwsXK45+Z#BbahH-{_7#?7FE5m~f4>3H(@O6g5&-G<k#c(RawG8_i9$<Ko z;W36Hi*i*loXT)5!+wSb7#?IOvRRVhQ#qTEYgjJ9{#@!adl^5#__17)`~!1D9_L~> zmEnv$%C(m9euf7a9%Oiop~&Z445u<&%dlT@f|R<JVL!tI3=c9q#;~e@WTq-uoD}1V z)|L{dU%@iM4=_B)@EF6Y3eLrFEyI3>2Zj*;Aj7Fugs)}T&+q`lgA9)`6xAeC#c(Ra zwTgq;2v#vX!0;f$V+=)vQmYuw!f*Jm#_v$wVBBN8V&uv~IZm#SKa-}p+kC+MrTIs* z%v0x?=2_v{?AhbF!t=IgvUj$3mG@@vH@uH}pYXou{gc<iuewaMF12p3zF|FL9kyPv zM){`s7W$U^+I^iq+jqY2V&84PLwKY0E#C*e9RE1~WdC%(7rQR};v^zU0RM+mA^wk> zVnpr=?0zaiRpV<ZL-9Ue4Zc%ShrLie-brsj%o;%}d;HGr80?`YV$U>L2)w2K4ea4Q zh}{LasP2Bi?F@%k5Pohs!IeWF1{}gr41XN>dlgRsHr5ebo=vbVM3V2968><I@C7*p zmsURmc&LQ%4`PP_&$nI#yl=?MfZj@i>x&8Q4!#E1Q$iYk6d?FK!_UHmd-DnIsQ5kL z2gBb5{A~C?0B^4U7|>}%wYALm8@#~x<Wh;}F|P7va+Lg2jR8nz=2bEZX68~lGv$>B zRNYnWGUYRIWkV=J_AiR$7vfY$m}tLpK#3Niwj2y7(JJ)qgi1gus?fT$gUtet|AQBJ z4WPtMG8cF)phVl|1Fr{^_$4&@Cc|(*iIyz{-T)}k#>K#=07`Kt`h+2-0^$@A{lXB_ z0Hv4?TMX<2%Yn~?Eryr{DDjSdCGa_bQnbJp1Ha!>4SXJKG4PgM4e$l91?Rwk603uH z;Hv;7#>H?z8&(*i2T+Q0MI&$rP>Lk_q9J+#rRc*B-4I&<rPzwTi8DGtiCr#zcVh>j z6g$Ofz_DHjem?f{hPVJwV(ohd@CyMYZp$YF|1u!XOHo$?tJpJvUyi!c|L8d#oNEB3 zcoMb5`5~ah-f}kJPf<TZJO?PnVbo7zMYsU)mv{?MieKTKKAb3uR>-^vD8;YwjRixz z1Sqi@UIF~~fKt4H+8cNWVHNN<@w-}5yoGo0BzBK&fbZiCXemAr?STKlHyI4vyeEK5 zgTDD;0!pl*I)Qru@&6YZn}GWOC013NfoB0q5isbxA=!XZ<QnG!<{3%Au+axtYHS4@ zgdIIv-`ELwrm+isqE}V|Zjsf1J7f*ud9oI8H{P$sH(lg#!1HATdfrIfpI#1c3^o=R z7a1QKxn{Y!z&v2~c^>p!=so8B)O*Y-@vZUo`Toaui|<jNrypZa`~o()pCg0m3^4s! z<bMVyODFQwcXkHKO~!fmK)IFvD{<yFkhjSH2F{F6<h9`hnSPhcL>)}@R1+h|L@zZl zYE1M{oR?#jTaR^b1b;MEqFCuRU<|}CCL8hBgz>1NB)!c`Z|zo~FAm0U&<sXD9E@+m zpknwKGFm?d-v*h0zc{`jlE8{{1ODRTGvjLT{)hiAmiLH@Wn2`SZ-`mu`{31}CF0^d z&j#R^1230`?;hX@{KbXgE0>j^>wGnG7gnkK=fgK%d=tPwL)Q7Y@JUnJ+uCMyCVRT# z+oyNMlgUvd+eV5>Qzo>vjT%MRtj?~k8TQuhE<4__sHeBn?oQ5f?9I*2hQ7^-?%w2- zb*|(|nm9jeB1Ib#y=}7-y$kKFoP|p{vFudQV+e!voOp60i!+0Cxhd1O_rTiuoylHG zSIH-+8=F!$j<5ysZLEq3QpL#PxRXqzYSY}^G2QN7-?^dBiE~{kM=Hap@!G8U@!mwT zcd?Vef6twWCljof6Hju2;-WN0mL}pIt%=@V`pzh2I(44Y*zgl-Gx~J5I*crjcXf8a z4A(;{^@Kd9WR99}D)r2S$5qvqC!8djx}|%1ynQ2A4-Ry@0TqdE;j&N6G~IUGq}D{& z`m=h-OsXtYwD!iG-o^1viQZ|p-J9%n;ypd^g-%@%@9fs7Tb4FNb5ATvvsXY(T4G*e zyC!rm9`#@MVn}kHac#iT{YA5x`(O1JonbtwIl0MoDjF2niB)pFr&3SsPMVAE#F<a- z1f#^PzV7z5qr}3#uCDmHt_0AQncWzxj!P|aI?!)B1~8l3skgK2xqawaz1yeTn|tEu z;2HUQZK7z%;W25-=C-z3o!#-SuI;*(&0SsdJG&FfDIINXqeqLD?%pw@l|x}Ru>Vk1 zEyrRfR|=^P22R46G7g$m4Mz*KGer9mi{qWn+R<W0C)XkFYzM*3h*HP=$5O|TjpN6D zzRZ6}8Yf!kG>^tx;cijD{zC=Fiw%f>XDyp`I%PoTvOD@Pg2arOi)SvJF>~ScRc*6c z@Ye2}r88U4n!l`V=F+8$mbRgYr7a6*w=Hj3G{1RS%c6y%b$hZmvAL;bk=R0YZ)+16 zU2(BF*={>so$H{y-IbYccXcJ$C&{MSiSC5c*)G<jbFd{X9sHQy=QxPs3*z1J4T+9r z8_CT`nlz=Wt*x`Wv$r$em0~XHNpw?Z7K$V0V@42*x?B6&+Y`y;`o7dOA(}fnM01iu zM~7&q2+|=|#5;Ru*$%}G^qS5j@yI1D$z@KwJu$PJx+k*rpp=f8$@X{;QORYA%{{gg zcRIVaw`}M}WKp?hcEx*=z^BK%+Y?>r35dl>Vrc(l*1feS(T;j_?m+Uw#Maq;ov7fn zzRs?WDVy5brp4PgAp*_nOmu+_HA_`U{~UpZeK5M!?sM7`C+Aics*rh->V@&mr^u2n z@blDV%rYnGoMC4~*ppHh$9vm1o~(9})474h?a3){w{4$-uX3C$KVYsnIeBSc_sPuG zjrP_#iLRcLQx^7ZUWXxmQZ;7TT{QGh;xCAwW1ouMiEeT#>21{anl~g`x)*eI_hAA* zS?H|p9>=EMoWL?*^X7PW2UZ5BkVDN*o#0MesRhN!Wh{$3=t3v+F*w>2+`UdtLmyb5 za6Tt-dRHfg@X495km)^T!p!ySDK2bD;KwU4HE-B{a^6`8>+3KwK3@V8^Ex|;iQ*KQ z;b%1t7d!U0QwXd`tXrBmw~v=lrxKvJz~fIOQyB5mgC(7MB2NVnahB6Lud};D@LHoO zz1T=NO)cHYUQ~~hmnN|AZBK}nB+ZwLoD~~8dlRia#9HA1<=7-TDF*@#2ds<;z~*Jr zGZO3LeO<kotnPHc5VO^ScDmi6RADvL+m~c=PH%5d21&J@xvjI8)5r-a0y<if3*s9( z+cAYC#O4%6y_;F<fo!I<W%hh~Yr<)bucrzwqEWPLW4s&d8a)!oAib1DTVn>`3NAqZ zCw#MhE`_!&iKX#w@Q^_vWMD?PV^3t#ogAz=6pHDH+USUg!HP}|lJ1Vh<bA!$B<1eX z5}|8j275rDarrIXTkK72(#-BHosQj2`;q0CDrhDVEouRy@bp?ow9sb9PBK4LeR!Vo zbn&uY6Eo~S;$f)wc5Y5A+unnvc6SFj$VC+Gf;7ji5V@6V3pI?+z*M5q1#qEC=IsTe z<U>qgZf>{ks?VmVje4~$)}uhq*K6}*b!QJhcjzbCh1pVx=;wU99mdQ^(4?B^ZtqMa zIT;~H?cQ3tPfF{d)j3N|w|llTLME)Iy78DmTuIs>nh_>9uj|^rtg{!?N}Au)03n3> zEOSm+?CU7DSoOEG1P_@^F2*4BNR}XFWC#<eCc0pU@`cNBEAG-MY4Y(b3~f$`^J>VI znbGMW4BF0iW=xtgrmc-C+3nV&73&tNiF(X{AD5vca24mrlf5cF5Qoeg$bpRm8Lmh( zua#I2Ev0C=tenc&y40R1;n4iTOsWBvEsUd2ucIt#eI!~F?R|(+Sp3+%cDvn0-BM81 zTQ_3qE>>*BIzPQ40)Apwqs_*EMrB5NO~Is_NpHoN#}%YKa3*tlyr;Jh3dv$@GH8wA zhJ>Wzrh_#*EraarZtv>rNPwfa)T~8i&tQ@tPhzTAlOdI|E`!%IQ1j9RqChvyqQJ}Z zk*1M1m8RynlnXOLN0W*oh_TLg-Vw67naeS*-~dKP#$t`~sX(Dd`^;?#*Ue`+UDTT? z7OAv_eLb5td~WLWjR{QCeVb1ufV%MFcYS9&MJpa-nd(!1`n*&<Aax_B%$hW1R9jmT zlNWjvhd6=g=4_=2Q>;s@N2glSX9Hi^+>4*bT8FikplFPa>F`Db89UNRGZO3iHf*2( zoaPOPEopX3FSfB5vNTgB7GPt6!H`Z>E2~)!2Jlwf*_2LDB_y0VogIjRY5vS@SRm0k zN1EjpOruCw`{cxyZq#uz9}va6K38f+BH8YA@{w6u1vZ=s2LmIyyffK}DlfCsY05{e z7MqaxHgy7(PIqm?aPR1A?@cG52gY$C=ft<Cd3xUBS+KWrT_^47)2TF$&PpOqB)YoL z_u8q6rfmn<fCS!E(=>;974xYgDFJhmBG7x0tne+g55@XonS%!+Y9CIHwz$*a%xxIf zOp`-t5)^7VA$Xc;%8YnTiEYq>d1~9D^={NsTTSfG1fN<=+fGi!Tt=Lk-R(9bde5h8 z+@u?XL^wvTh&$axpwpb{>`9!3BMaJYBErYj&$*@Iq$V+4YK#VoMwi(dY3*B=<X?dk zkP{1N)5UJ&?U#yk%tQ6yXY{reOt$vgJzE)DX7?cryqP-C<Kcofp+$hZEF#St1@=O; zHWKZrWdxIG4H}&;uC`1}btksET-DHUMXDo_rXB*+y7Lp=8-TK#k}EoaVi7Gc!3cZZ zIhbn_o47LS;FVYQi@Irj(S==gFAcc#I!`R5@zKR<-R&l4P7!ub+iYGa@sf0rGn0;; zSmeY>jg_dKDW_{xui`Zo=bbCu#!HhHgijSa^=3Yas5g+IR+Pl<!ynI?y|8C9dE1Tu zXkX%}iJn@Us0COJJKHsZb|)U3u>m6xKQ^kK<V}RC&2BGlS=2=1kd7$O{7qaMpW}%2 zG+8T@+Pb-GgN-P<aWm$J&dr=kJq}&HZ?hQaG9u?gA+6{IEhw;S>CQZ5q2n6#na=Kv zR>)`rZcx=6Vy+D-RGbW>#Sk^V-PfB6kE!vXhZf1Y6U)FUg3BT`8Is&bGI?(I%jB`k zP7zj9tISiyT-Bs*QKVwPMuBTPkORX9GP*F4q*gJh!d#VG)G_#}+fnt#zFwPVg7z7S z_H+}o8+h%F_7;dcuq{Qp)z^h&RLm_0-8g*(A*dlSbO$okfvr$0S~@jr)wc>5J``hI zRZA1=^&uebh};7~L9NW;JA>z*rw%A6BYn1G_w{7ZST)VzQ`rpOfV?xY55<-&Be^vZ zciK0qYb3ZYgJ@ZVsUpFXCFTIkDV-e@kJC()mL?Y3y{&ycI2go2BF*LQYvYu$4=0Ex zYJ(Tml}<VZOKjc+r8zW?xZ}H~BvNXqchRz=FPSl~r#eg~53vC;mM31PGl{04teBj* zztD3%#>X<7V?37WjP-2CgY2i?pdt=q#8UAgMP_sx8i$!A6@*#cVOedk)5{b>6rF2v zaA!tp_ruhVghR!~dqitjBGJPpyC-#QcZ#5COK?|kyV%OjT}{}Xoa@qzPshEOBc@{? zf<UtwMzTtE#K#IXssia!?nh!-VjF@l9rR-%!4Kt2KJ5W>9Ua<gRceZ3RT|ajyqbb* zGEaTb)=4^k=CeexUOm?J;Uo-JW)3%X6i!w<TRPhlixC?2@i+_8&Q~2e&)kB(tquSj zu@X9Z5o@81H@s+O!g<Br+|x-1o***~(kzx9a6Tn;i&7A#;GdaEA1<(3Wi{$FK;YzM z6(;m_e}oZkujg$G>d8|W&v6bnfJV_tu~HS&=nSfRO9CSe$?8B!Rguqf(2J<scB!TJ zGMm<|bh1c%HiZt9)dmKfMSZ<JeZ7>{fj_j6J}<-A=Jf<BLmML`q)6(;e9+4+tuW$2 zG_e5ziSBE=kc}3!C-Pu8Hx~=EXA-QH&WV*)#<<=y9S2PJ!VEhNw^OHsSn4vR$rZyg zev)2;Dql~*eG3-PeChT%Ix_N}AlyV}5~8V{AIaX71v5J1I8#evs!8%#T4v)E6Vcx8 z?nq)AmNEM*NMQN~^MrLVMI?k1NB3;XL>n)}Dmpey(ya|$h9vP8z($bVKQb9~9-L0Z zAyMYhk?IozI&zb{C52Nk%WlBo6SuiOb|LcQ-ruCg1+_m3^ynx1^Q1$*B=^0Hw-VHb zg%1FeBEh>CO}MSWhj2-3LgF3nb*1RSxMkC(_a!l#r*=u~5`9-7Xehckcc0WLYU(~g zcTx9rHO=3A3fZ<abJ2SC1LpX27F3w_W2j+j$Dx|to#(j<DS|A@SOlEtm&~Midac0y z=+t)}T$j&DLRWLIMnp#!MOIdXn8!E`MHi=PoN%b+F48liC}&GhJY@{6$j>-wo-}1_ zTU+nO&Lq|^sdMBco0mzeu#w3jm+1JC$tLSCN1h_3JwrWjN0MYJMRo2R=q>}-y3EzV zIyKm63Ts-L*wEJ%cV=#Lm;8D(p;qeH^`zHK+_9PwW(Ld_x{vEv-r9rRyvssi*fFa& zbFeAkw^q14c#>94L-Vl0)QSxQi;fI%I1M(fG1R#vuS_&b?$cMh!geotY5eLdV~kK* zP>6U(2OVN(+`?k+rVE1;xe%lc5H~+=Q+ks^uMbsYrhLP;yP+e^rFJ`++o9h~O3Tq~ z<jQHU&=49ZfbRLZX$$S{&r4o`8zp;dQdd2#GVZo3`w~|*Nz@M0oH}0CG&__RkRo#} ztJaii$=BSqHNIW76BgqLKdGV0Bxyh|WE?#cC;I|Z9(EsM(YkX`7S=4Z)=w=;VJDpv zQKPy23p;i8ubQuU6loMfsaqw@;&Ta&rzd&Q){FXTJt$vaTC%PTa(z05?8Zr~dxOc6 znKVX8Ds6_{+nqKyV>qN{Tg;9aVCW9C1E!sRXM1Na&Yx!BRvY!Cp~2hWIh`9e&hOl; zDOg5VXrdL<T~}g}qsPCXWBN2TtJBFO$?!QS3s-t#nftWQ!Yc|`VsD|FrfwvtMNyie zBaG9$0Rc@-ahWlY7U(L8)T_%|70&n`7l#Q649*1lh)!!){8kK8=v%2rP3rX*^n~<g z(M?1Mb#KJP${BV$haL2f6Qi->a|5AFsMl+TOvmeYM=~4W#O02T38%{KE_A5b{)5<m zQ3$(By|42BRZynrq$#7@+Hfk#)#C(pFRpy9ajc@~uAIllbgU{BwiHtrLT=nq<YMeM z@y1CKjhbpBeUF{KM&N60>J$h9TtxasMH+}1)VkCgj9ly-tnF~qj0LiwbJB&FNZe}D zq~b;hTn>PsRT3kcwx}Ma=OMJaG8i{TtQD_Y{=fFV1g@&8YyaE<?&X3PxPSsOTyai; zb5Ro%L_idr704kJ5fD)(0Z}ydf;p9QYMMD!W?GKrSZZo&TBZ$_!)uP2X%1wjW$O2= zz3<`Ndx7eGzxVz3|9;=caE872*?aA^)_(R{>zuO>+oNeZB;B+erhyky5++DkXgv!! zz#(ch7Ul(}74E?B$6Ww-G-z|ia>L$o%q$nV@!ohOV5}6Y1s7OQ8he_6_%T{d1A^Jq zTm^H*lmq%`HxmDe5|Ud?NMz=eB#a(fEtxwbmdQXa3@coE)}h)Z6fd=TvWP#ZSX`|j z^R}v`X4*GK9jj`siUeYK_0+_K^wO;A$!S><wN=+st@aONFez3`wB-!>T~(Dx&WYuA zVMtt2Sz!r<Dhr1*c2^4w3(OBH?v<ZgCdA~IVa_fjVN^X~2Z>spWXkDWk*cOXxEOQ? zTt1H<3tu3kgf6$tj(o`R;VCCV2P|MAr^V+Nk1m4qU6>BQFC+A4R+{BFF&|HqAZ&yj z;u%zuKc2#vC7<Qx<jW`0Qy=kpg}97Fg(-6^dMY`jq>G$+RVnb2cp-$R*bQOJC1geM zqC9~K&Mu8wurD{vt_)g~iLic3hII>M*rZX7_Gx46$^a91jfJdpw8(--A)XK)i6_NN z@RWKM-jT=>1m|EpwO)ibDDv?MGdeE7aS7hHplvYT&CEeA-iq+2ybR<bkcG5toY6iP zbs*QNgw=uiOug~0L^r$_k&O2hV)5=nFB~P|zc12z<2N2hX_oUioC)>P(HbI9j4ogy zTFA!R9hl8)OgEw&wVH>21X=N%em<z8{V+y*K4><wS}286Xv7oy<MB?y1bVwfla3OZ zXty_L&O#a7zrx!mqtPmHM)2y4dWz83EbCOC-c`JNhFwvNx``Wt7q5rvBD&H+JNQsf zt}%(x#cLGmC88aon99eYbcQgT%GbB%+cS(yNqCo}7ih4~3&Hzh#KEdOCYM61o&=+I zsV`ij#24PWO`bzAC{<uvDk$oZbcv2!@SLAfFLJ>hMIhzLb<$O&BfLh)9yOqp2bH3} z2ZM(N_|3(euTkI*r_GK#^<_;=vq(nPNI6eP?_4FpOw@^oE<j0BCT-H+9Gqji#k&_= z3ykOsNmG&y*8|@FJWxm4MKWuL@?0MjF+Guj_mgoA^*B!$3d+lnVqa5r?cy~EeNs?k zI=e0l*HQ0{7G1K|!0PoCp=2J)@_IN;Cg`Z(HJZ^v?>VKjnn=$Tc<Wyty|K8Kw4VB3 zgmfA~)N`R9@6T|g6+@yj|KzbioTJhixHbzTfw(smeI~vW7x)M?S~N2Qh!G+PF>>oh z)LVP)Bon%pbdGSP(9(*a!n<3|<L%m(>oVf1s48v<ZDcKwG{d^AT+)a)amEY8H!MXn zqeU`PV<YQ~1a(7eVU`h{FTe|9`4D*lx|GRCFR|2+ixgrIvADWA6hP^1ThZZFE;z<a zU>uB!Y)TN5YZh8Nyn<=n-P+0-@j6&9KxncB7?OlRXyI90OT)`{h&?An+Np2{l-A+5 z7ZV8|2*nr*I;fdE_(=@^+%L6GDnnc%-f;zxz=YRc8$kVeOV(G?AeW$x583JxG(rY4 zJaGUZ2@){V#K7g24JwJ&(U1wJux60_bNZ-8(jS5hK5T2E(wZjTp4=0AK#c_Cr{I-B zK7}ShUMT>4nkqXm$?#Tako|E<4n+1EZUn8?dTp(DI#&N*>2u9xYNMOrARSyHnc;3f zI7VZEz%m{G5-<@ZBoodbg6px+ODR`^!YK4Q5galKJ=i`4qahyCA?FRzmBU7+G>WbJ z$4wqi1&tQc2$GxqR6?|JBZ73A>$7BJ{C9ao6JsV?By1oWIbUk;6LBmTWx1I^U`&!9 z1FCpB=VLL_b1<$6)-wUuoQKjBUbD3RDAitTs7;A01nHSL<Jf46fwdtQ(L;Foul^D} z(!?)~GQw=qE6yFskZR8;%>{?jAzPxmdS8ed%K2A+X^JFMk7FJl(O?p#mPxKOt&<5N zBSQ#|X>Q==0m+VxOL>kU-J;U6;Y}2lBJE%O<;Dg{gIXoZ$QYox&Ipr(8=tiqN1Sdx zh2!ouN>g7YowBA<b`K&kE5%?WCRmL_d)hm(_T{<OT5}|`NgB0?RHMxdaEiu1=`_ia zToG=zP!GzgXd+`oHaqRx{iE|l$dG0SX_QIr6Kc>{lV)>j!HD+q(LP~9F{l}dy=3Z2 z+~JNCAu}0gGzZc+Psf&A8X2Ri(<EIfQDCpNoCh_b8R-*U#c_>B1I=ZG4kT~MnBz2z zu5z2m^sfV)5S%3HgvQpj6Go8?2nlIRvLIVXi0M>Ij*R4lPn=^CYRbklOiA;Ucrb(y z6Dmq31F4u1X~bSKC$gaawUbUwN!IgUAzCI)w)}-QgRu%xG2Y*{wah841#HS_2vK59 z2Z;VD*q2xeG&>G#9SwR(C8h2WiwF+MqORS{vo|6M7JA?+vbnjUSy9)Nj54X0!L^!> ziaM=8TNvIjr}cvbhakMKF1YuE(U68A*%$l%SV=(e;68>;n*VT6OP+o^yssWw<%Mut zT5ytb1!w69!f$WQ?b^Uzve!ev4}xtP!r55r<Da=!NR$0!Ne`r<QImR8{9+`N2buHI zkdxKD8F<{>%I^~#$m<ar5G+geOTH9IG8^zh(h!<km!Oi?a6ywU4G>lmZ`rem3SuGL z{}rP8LR0ebE43hVfHX24>7@6hNzx#;(tzMtR!?;wPco-y5}{#EH3$VXEF~S}b;@Q< z_4Xwhaqo#DBh8^fMi!Bv!Om-zt|L7!0(5YgB;XaA*W`5Y5j+aL=57<Ctd%{KNwwM< zqMWbfeIpvu!gfqbK5~uqN5?UsCAgMq?hQ)0^JhQiZ2KERJ!zbb(ge^P+DS$nPPyS{ z@$%z3TcpLOO@jWKud=0_<XLJNTY_r}4A*Y>?}e2<dJ00Hp5SYB3ad|kq^q(4DD{#% z9&|?2GwaL9?u`1{oL0FG(m%p6Zs<xBN_`^?Xoq+itxwhvx<L~jp&PZB32daXM0}%3 zSfWNYHmwarp}qaIFO`>K2%Hj{CS@utz3G;K-jLx^-H4N>UYdkSLVrqa^V;aB)@qD> z$$z@7wp0U2Mds(9QwU9rko8s`pIrZ_CNe>Yx11j02{*!VWk2~!BciU=!weGFIX3-e zu9auWfzz6VU=3mfABj*a?gvW^_F$|iU_mBC@6iFWK*=_z=`#zz1b^ID%|T8f$`s+8 z(#R$vSm0#{lqiSWgk<?s4rhuC;?gA16m=C~=^ru^c%ZDQr5&=3Xo8?C3D~%xXfTt& zxRTT0rXKK?DL6*Gr(kh9Xv#&))LYvDKzRhmL$N0?s+nJs*+P7!pjA`Ur0B!_W67K# z8i*4TO{J`64yt6G6OYLn9)@4yiR6itfKIa6Fi~p?K*tC{P>F&NKiFc<P?(a!<{c0- zN{4wd4mNu*mRTAEgQs~_8JaZ7t1LpfRJ6klA4MICSV%d7lT??Go(xK;R_+<t8gyg_ zl65L+1Az{=h-H&ZlD-rXpx)BND1}sov^dsBE^piDinW0u14$-YDPhv%{=4m@O|;nD z5Wp=93Gz8_tvyTPFxLWkBq(}B!aN*{UXv!-0)7+>FcV}dVo&}cO{U}@at=@~d3nRY z_i!9XgU5=%NQ>5SLy1D`L=TV9b%2o)$#g;XN0Jz?c>tcg3c<WyawsCPW)WGA$tc3n zhdUu81Y$IuQFNNRNQz1w=n0a#Ae~B((#Z|k2GeN3kh0OhqE5^8Q3q(=CWQ?JK@?=- z!-ofYxGQ30l%d1*WoqT?jO<DwL(b#(X^d<pFGFlN2yC<s*QPOg`AnY%`nlajjF*QD zUB@w$(uq2uVI=mpJ*~!4Fg^5-#nRZ`y0cX~i``JiI#n>gC=tnpV{J?lL6XrzBDB>j zn&!gTR7`nNEy1iC++4BlCY7-s8>CqzAR}W2;Z6{i@0X^QV5AcQaq}QkP!z{ioprKf zc@o;@`pJ!C8O2FGD4xeLmESVrF)G4M8b{<F<ycgQdTw3MKi4LYX4t!7WKwX&<Z(rN zJhpFBFfXa;-VJGM0RwPpw&kP7)?T$2kF_;M_L?--WX9T0F2peVTDV9sqenjjhFRaq zl7uBq64v$`hcvk*Twh$<^?!67jaGsuQqB@gO+=w&r&-&-@?AJS&T=p^F^$0zFMvYI zHet=ZBcPV1K^vOAq&@~S4B-=`VvIa6WUELDFp!el-e)2u90ux%do@kLd@|=Pk#(L3 zg_V0D_g6@g1_6ie+GHh9JCc4BF=I#Kn`F6>MhSgni&h?zeA20%SF)X6gPaHa^ELiO z4T|mu4q8v%QjcU!ko!;rWr5YpOL8TDQ(>M*43?t0e9k4SsrqG7Gc>H|3hUS!HOx_z zyRBqhQn-PF7SdgYF?JoHPLciA54Fi1gaS8^RgEIVL`fJH?Ry%fOEBN#CakkOSqjdQ zg1}*Q?v1h>y@fhmSgri-k}yCHpYTA7^}Qz^BFV#4GYsvKOI-k~jUy#3a4FXsiac`4 zr3VaP<7NM+Y7Rv^l68#-B3vWUbK(=Vj_K2#rbe3-6@pH9oI>IN<r1}7C?}Yw{pZNE zw+Eys7N6a@I3&yv+R)TR77CG0&zRJN4l*)vgb?x)a1HlCCBxg+2I0n`tT<A8(zvI# zWPBkNCe{#xWSpeAgWMa0M*sEZXcW*aPbQshqZIV84r57ElQgdQs48Po+cI+PGyWPC z^7X}-HZoWjD4016XG8~iP1UCx3u9Aia#J~I|B<Up<|-fmk`T!j;-bW~XI}MpYulei zMTL~VqK919YOBk72DPv=klfnL8hw9ast`!d?3mi~`z0Ztp7-G~1}U~6xtq09BF)4# zsQ^VLYOB{ibkG;=Qw)h>(voOvYn24O@b49LE%Sr<rN4tL8G1u3z7E~0BI|V|aE_kA zlAzftwE_3}x+9MVQcCb_nYGO+1lk+_cKKeCY*WyZq%lGR`>P}{>CE5>DChI6g-UvS zg<E-2{IYru4-asAoLrzki}Z0Yqo5MUS#qaI_bG*3cv^Fp1zkq{JKM6>W;vQ~*CI0> zEKeEMk!1pHwt60p?ljp*&*rwA^~7vbD$u$<jtMsTQMR&^BkFwoN@kcfTsOm-#UlQj z3yPSU{3I!2Zg08Dff9Z<gWOGpv*fbEaEZ32we~SyYhNS&+VwSX!Mr3Hsvt!f$rzv+ z6OaC4n2=pbDr2q8c%KKU)=!8Lcw76e|2F^EJo*0}X`BTVE~L>#Y~Zp~m|vp)O3ENR z!lV}DPVq^^-WB3@IXR0YGO|PLOGw6$<a+SQiqH0Bjqs;nxWKptPe8?CNs*mwMIudo zQY?ep3I9x8G@bE&kPTsNonR1-s;wP+1?TNjbb<6mdWuN0s;t$vIv<+B807tgofRYX zxEbqfb-g6M$(m_9HM5&A@wL$`OM=36JX%c8oyd_zt6PmZ<ha{MQ)v2-KwS=J(Bw?f zUXn6JlM8V~zLW&+GO$RpmLa79di>vQNzjm4Uj~m$4)F=>5#`#S7*ja($HXD12IB^K zD&SRcAdnSQxSemgF>dn^sZ%MqK_Lwx!hSLz11uP0foDEsLYPKn!_%RMaC5LPrM665 zvi4y{`=}oIc$P3nXf&=SHvntXplz%I#<YtxO!oSsz;(JSf=M*6<`$&-gr<L-Pvt0{ zDEt~b%RO)L{)E?thYxys@4Qe!WfT-@qe7u|z{cH+4)u=M7|NZHrF8T%nAa=xY9qc4 zfpb3xFGGYv?_?BMx`*Ik6b$BLYK>B_R|^Wg9$%%<>-8#)LT}J$44z*2ytJNDyxbEN zT30uPf>Hu-bp*C5okEWaQ3Q=^Jp?p1K&e+c7?lb?Z-bjcDHWvj009{aB_l%%GWA*~ zkVzGJ2xwY~ny3wwK?2A?s|JnQ5asXX-UG*4zH=1NGZXd4Fo+$u(QAwf!yrR>8%DaH zvys)wQe3EA!ytZTJvXJ2k<IdnGNLI!q0?0rai%n0T3Hw5^Il3@)&;Fj!3(&67yeTJ z9C;dXSwX#L9MtNJs39J`(V|yMg;uN4sP%e(J$f(rtDKBVf4#rTy*$d1I_pL~r=o%i zy>%~-chD#eeIOLU(8mFr@<inOJCJPs9sC^_s~z-eozg+Ch2V%ty@N&tQ8{Q72J=j6 zL+_4GRP}<<PmJd!=91{k`%pi44-Mt+$o2Dsn&_Q14u&j4upvip$Rmjua;QEB4RL>f zzXMu?ez}(q(xMZ7I8>^23PZ3n>XKNZ5(Fp{T1Y3k`1z>?C?;z%i*%H9L18FkBFte5 z>t3Fx)u;>;3}uE1=p+s%;Ik-7+7lDX*aZ_<m7}?Wk4DYtjg!VfZ^!|!lp2yB80?^< zEj#nq>x0}>Droy=Wq=~Uh8Y3qIMV^8qfUi_bOnk**NjT&shfv_G24*i00#RzC>=pR za`jGb3d;a+0m0@eUhd`@phIU=gHI5YR!QTF5@|@VOeY#vOh%3vY6kN{>Y;fdXUHr% zDWAbk%u8G}j%WiFnU@*zG^9-K<x8LpN<$vw)-pXRQyR>x@aI)cNoiOzF0aCv)@oTZ zYgIapR*5scR;2>-rDTjEg-Xl%u$IFF#u92?tJ1n^zzd9PoX~|Ts?xkxqk-~cjPh|# z$_LcYD8Op2%UWkBI0R<iX)tfqks`a7uXckt1?Z)pA4w3}&zWo}qrTzeY6>ROwK`;a z8Oqla&xl$6en@vW??ayz*ac{G2J@?i-i9bnSE0dt#1IAOGMGO%m`}1&<vVF-DBn%` zf>8wyAK@H6$XIfO(qnW`Qi~dZc0(R1rj|yImh0;Prd56|GzNotC1|~fGJ0U3!F<r& z{GB1v5UDkI<AnYFpfsdHN|s{O6En4if*3`0NS_Pow~oe%U8vQ9nMx7?@y!sa(>MSF z(6S+tR1I(dYP5PChQ4_rv0BGKQHNBW-UVpb(a@14>!=PLv9c1}xu>BEeubh!Oy%d) z*ye!e&`Bk6q5M1I0*V0{utiI>b3%3IgIc8_$5l{M8F%v|_i}}Mc_kR2)oMx0&=34E zPA&m=Kq0o!NTrK_AqB)Cq;fz$O4WgmqAy%{9E!9W0f6V{=cfUCq0vMXE<sNmaGejO z(BKkq3}w*i+$$VFl^*QPF?cf=dxs5Tu*aLBcZE|GzDV#*V;$VX2z9Th!`edwU<`mC zqH+YdV@K!|NrP9b)oIkog=$0GMkR)XBY`sX7;}?e1H$NswY`Jp&Pqa6DAEUP`ytzY zMDngw7`&-kPUpvZ0H*n107*VT;2Kd0S~0`8QO*g*Es$dV3e5sdRIFo$NToYe!~7|0 z)nNVsQe?8Ka3_gXcsbJeH{?NopntrSUJnR?{FIO*c6GR%?%|MVNH?U@WKA=s2B?yb zc@eCoff&!m(>>ra%|lA9p*Qc@Td0ol2y?JXyM0{hGd`^^%+PL%PMhR@QrE6gZ<tC_ zY&I6=6Pe;<PLf+Cy~m`J3z^@Hfqh99k?r%S<h+p0M^7S<Ek<^|<fnunN=WZdSi9mB zprY!@1CVTgx<-!Z+u#1?cQpAUQaozUg9=m!J#j)VEq_>*Y+!vGY{K9%x5eHhG_rP5 zt5eUPrd89|c+?8oC}{&;3K(n}vkTq9rQ445LY^O;SicBk{XU*AW%7Pg2-!Nzv!-YC z0;oKBSKNNJfBS?rOmR4h1*$0*n^M{g6WFD-o7p<5nXJ=%ff2<Y2(f>Y)Ig=kOO)?o zv;NVYJn30cYK%L1Q9@mA2iw1<>DievpSnx}<ejN2A6nng_m-8(HVWcdlZ{>1Iv60| z;_;PV(6oOE(<&=Xuzf$Xzr6?X@4EXl>_1hp?ad$a)c;&NnUJ7$XyuRY-k9hA9dyWg zQ&U{kyx{MkNrsi0L(t*&MEzBtRjk=ztleb|sQCiP18wrh*^&c_uhuylTB;n~8z~)? zj+h}~1ker>s@l<Do<*BgN=Gfy$WlaM(TV0!nAL_d$~=gqjyzY#a+m>w#8GNTOrAJM z#(ygQ6R7xf4X!4qvJTrz&YTN7v$$%!2%I65Utlp#VN|gquvjR0v85V4>h+|AbF_H_ zXT9lQ84e=p;5{OVn+`}S#J@KspW>Bax`unEFtk(}lHr@+z>w@IIFOqRHozQ>F(k7? zm`a8yJuBjAh_dWsbaV-Kso7ym#x|5ib=c|+$uORjxR7ipX&1vSDnoB1Dh#8@3Nwsm z+cG!;YFujYhP#Oc1IX-a3F87};n2Mi9lAHtkgE^sv^Zl2EP?DFmVg5%)aYGBwl~@% zyMLaRh)6b=m*B&bESLK)FgLXPh_S-FR;y(FGp|KODy5s2`40lxLe;QA;0QqvSYveH zYSglT0wl^Z;043QbA!L&NTv?NMl3)=875owL7+aMcQ9lr+YfEP(lhTv$0z|uR0J*` zwgyj1^D~%FyI_`vVGi*?(x4MIcuOVGNya!Cue4|F!|oFd9U0d;s$o<6VWWiW0eev* zUMCT+qvVcyyoDp#-S|o;I?8Qus%R9eh_>*Y9gW-qXJ(q-8I9&xY;07>IZ9yx7}G{8 zW16Z-X4NF~3K)f{EF~4h!OLa!!tg{Z-XIcck!ncR!uy0334KKc39NVm%S)iVDsiB& z`JBFv$YV30JV1cs>Yy;77~BOX@?lY%9>EJspu;c-aT-fhgxYsN-Q)-05NtPs?Ri?# zF$y!`6nrD6lZ<W<LPWy4R5ycaVgpe&6O@`}TqW5aT7on^9g}{jwNwa7fJ7}_*3puq z(`l>N?tnt(dz3qhHp#R}rA-2^^3y8teRKK=PzVZq;=3*_nTiF&s#cK2dgWLkOo4J_ z#R>T8rQlt|B8SOXa~QWj>L~<6^;`kp<P;oOIzE@H5RzhynbHS5%8XcfFFiY}$cXi| zj3GValZ|7rPN=b%uZGJ~dyd8$B1Wu|Lf_9QHsV_uMy!lw#F9nyy&kMDomGq&w+lW7 z+9o7SY#U+{ghYklOO;ivo!`>3q)$|7>yS3+sot|H%kr^ET0z*r2&l?2qAY6aRJ}{K zt2$aOfXx;rX~DjcCoRWl`Fb2<pKx{S<y1N%Zu-GGz5uc>+`^ZDlR71}TJW=Qa{9b( z3zAAszi}dQ4H?gI?NYHQd{!zWA+@+DgCE(fOPPx0%u_83gQphK*G_Dgp)brFN=^Qc z{b{5pPVk=&bZnH)Z1<v7Iec>&-}S&cKy1Nq_BFYztdPvyTz1Km#)7e<?Zy9h_CJUN zN_@|ose#!W``&_Jwk4jxOu%F4)zhh*nKm{*y!`NLSzPbDF}=<;Dun6e!&-i(t6Jme z8N8lv?-!-9m-jp4O(^==t-k%37AQK7FunCYn&rYJW~r7F%dQhkdj_r~)*`lei;2vG zEMO%Xv8$4iOCf?{__Ok@FJ8qa^)&ztke0<B_%kQfYx;<l5#iVK-`03W7B5u@A0oV< z!25Fass`N<qnE(}?s%o*e?qWAfY<B+`lbGMLJx{@^NGS4v|@{8Z6ox@+6SsFT0{I4 zF-OYv+4|X(ZyOz<_UTLFBr&?pOV4P~4b`655;p}<AxDX7e@4La&Lzsj3_yL|acwrM zi6leMB2$m}<DdeA#AjH$y)5Y@b!u1Q1D*YA?YBgfS;21F(d|}x9InKwH`aU<@Jt2q zih>VvS$mGz^D7cBYb&5#_Ujb=@pbef3V72<AzbIf6la2P`~AI<(PQ&+jivlc2T?($ z5HZMzPld5ht3(Cii>1NgLB?XN*qWK1Tacd>6;zg092DK5j;@X_GTrhCFe9qSFOCWt zU6kLBeJ?A$I5;mSqo|;`U|2~o)(dWzUYr+FY6>FrC1;rY#Rc9TDl;0ZDobP^iz_L! zp(#Wpy7FOkL<RLI!@{Uo_LF@dCj{#m2Ziz)N{X<6Gp%R;7wHKLV%MSVV$0HamUE;O zVL3U_nT6Hfa!RpA8<|pnt(UE&T8;RT>#;1dSCHQwD;?(=b7>nDlwQm~V^<Vp9G%0L z-i-<xhVKJqSvtik39W$|iS$q#+9N}&n1BM2p^}8~wC?}?{BPob0$-;G*8HE`|2GM} zs;}1qaHv!YVnx6yN2jNzCQQ9wN1;)!tOz)Qq=QO@!sLwTnL`V`O6lt$h}|7^EgThU zMMYbsLcOws7%A4XN^upPR0?6G`Zc9l5F1!sr}q5jfMS5^>E|L2pEu9a`kWfRxyd_) zD=U1pVukv7u|k!*Ql-Rm0&cOsKP_;2-Y2lHuG^tTP1bZ1>r_#ta6tP7j2u;p+R;Oq z6mRkr4URa`c{pRaO?+6axWpI}Yic4kqEu%O|Eg51C(1sjW=u}*ZM1xb$`m9TshrBg zr+T@#7$dFfD+bi7BeoHr7Tb#9VuVQ?Sg%f)D7I-On#9)Ot-=S2<qNGSN=cGVv>wWo zWK%uSiyF{)=#$cOON`y&LmK0-@~A05^y74UB@fRsrX<DpP41hLlw3tw12K^Iz<W48 zJJ>EXbj+ABA)~P%Gz0ArOq3>nu|6l>GbOoaFjc`8r4Hsxe2W!|AZy;?4!5d8;R-n` zbjk{aLilW5dGzbAr;lA{5>ghrFK_A^=y$%|(u(2Yhh5YCD?|0a?J2vzy5a4VK8v0| zcJ}hl{0^p5I%D?XpHJ^yaHEU5gYvVdUK=z`?evSd%=?9xx2*H~J?4v5Pk-_-YTmBz zPZzfN?aKFa4=jCs>6elB3`@pr-tKf^_*K6hcNb(#A2H&wbLo*iKL=gO-ubrg;4%BA zXwKEi-FwUN@R$)X%h$Mm^YGS!dfR`WvgeJrKk_r3`)1qcSMJ<CUw6)yzAt^V>Z=*6 zG$DI&H#|1L_u{FAt<PqbHG8rv#C`vF*Pfl9@UV;X{@gR`!zRbvUHx55;iIg%dB6SE z=c8YDFKXeVZuw>2nt$AxR4_T~(ulXGO&zU-qAFf5|5+@rWW4rosP-1?nmyO=UOcY# zdrj{D_ED4M+p66c8hw)NEBb@e{(5y?wda|enI)dDdPcr|Zpqr+&o=AvV&suiqMou{ z6^bWnHMH1Kbft3-I(HCN*op3xU{vcwt?1~e#-Si~qNG4|l-OR3SlM=Eo2jiVlFlf~ zwUu<Jq@0ot$HkClhM=I>#!-vm=zv?o3Uza_sn}RL7Zp=|EEN`H6c^goXss9+R8S0s z&?7eV&3!N2(3t1;?>zH?PsFgNA_un2JO0(_X(_YHoDI{*cbs$b@Plr%QtD=`-`?*Z z?OW{ra$m0i)wFJ%mR`QpF}}&&CW$RZJYShS?yJ}{zkfO6{b3W2F2DZ6`~T1!J}|%M z<jC^G74uJqIbBZ-S>-<Jm8ZWr*mL-{PxSR0*WH-=?V!?Afkm5NYBIInS?_N*#{Y2s z;o^;+-Z$SE{L735@pn?xUC%vfdd{(H$6wz2pz@0A66O1k2I)hZ?c38n%{TgGx92~o z+u_vfuV(lU`y@5(OozL!I;S>4XU~2ZE&O`5&Y<kiAFT{fwK(1J{+>^#4NEq^`TCA~ zK0{A_(PZ=DCbwSsq|=)Cf#nOmeDC!E4qXKfeP+R-p{YIQ&O90W@a>S*#nF|?K6Who z|902|u1tWYu(l%msRmc$B!B{bc8N9B7k!|IYOROC@{v7b4}78lUv&Xmn%tOT1HCjr zFN6^@O}?Tx71w#V$Mx#bt5Yu{P?9a3pOtAciUE|T@~CIYqi<vxu_!t|CX=6yl79+G z>nbXrU;FH-QCq(l)Z*sP9!8g6m;UhioRY!$w{A2~IQ8+KmN#_iLq6R-f7Wy7O5WEk zAKr7_=tjj&H?+O$Td_KC$Hz{cyH8v-`G-rYA#XHrYufRZ0T=T&cBt6cAZI{c#;2cc z{-y3KWs_fS=kK!d$b`>(o;uKZ)#}CThJ2RtmBIaPd*|Fk(|0WlxxKP;e8h9_{BU{w zwSF(BJ$|^~Y1ZS}udI$9(E0bn!GoTkcBi0!lLL2Re^2=~YfpA~#=GvDS2e!5cIlpk z^WDdMxX#CU+oP^?T9&13emr2{z`T?f{o;PvoKn<$MvsosdnP3+21PDS)jm9WX|$Ka zOUtxFpX{o0cHM)md)>m07G2jiIp)J5sY1~eoa$@?N;RU63`&_nQ@3@UaYXHULfwCU zi+A&*0-EMl10|X$IVb^y07^=QAbL<*W3`K@lW;?&tqH7Rsa&8MP$dGYR<@dIsuiqi znv57!l}Jqhs)mch#3<=pR9aP6VvAIvs7``EKCz|6#h|*9{|3^zABno?aIJmTJ4Z@P zs_kbchaZ~1>(Q|XXET;g2$=iE;*U@FAKrTF9p?r~%LjCRlriP}<1Xt8uS5^lE^L<O zS@|evL*bR}m7BIbvto1hj^UFBzcu9S;)q}VkvQ06&D`v6m-D~BaVPHZiO>m877bjZ z`g&>d%7$OA-oJA8uf0Cs;@IGEgF#JauH1NfQ{P*^e|&TMtCdHZgnzv{>}JBt3kFAB zh-&lRrX&3~9`65SXi44qnK5UMzIEe8)$V;gHw4ZL+i|f``|&qDhdWJO)a*$6Be~7? zH_o}&HGTbsrVo<VjP}~p$F!+3=1GTvO#+5YymWa)#48_NzZHFTi$`>dO5MYGZqZja z9)2)wZl5jTK0vz1K)S0Iq-#-pwj{&7`@m<zy8a~gD@wFSy1x@K2+bm3e!=9TpK54U zKDlN%bNM4UbE$$eO!x#@Iu}>=F~sbGDllsyHm4kwOOTY4ln@haGTLHV5<V!MRrII0 zwzu!o747~}(zednlauQ9_8E3_m+z9#Gs0hS8MdY4*)`_gdvijb4%KBxcU;x=g^V^! zPxyRVvaX)bycSzij6M%P^lg`SG-7GRPrDYb@;%l1@QxYd3#S+M8J6?on8$|}6pcIH zxcp}8idW8Sz1o`I%iG|$*ZX9h<Bzvq{OIB4E~9?<?N-LTA1i<SY=GMRxed-klCD2> zcTcF&^+fkUCXdj79M>sJ;}`9pWq2`rL*T}ow;dOi3+LxOx6tqEa-Yoer5_LJ6q<N> z&ZHqD;v+mdHCVmt;k@5sI^OJ|e6QQ2^Or6}?O1o$_f*W}Ig?u5jB&g)VR>}Y^Rt?r zIahjU_x;%c;m1DwWJn{`x8u6ME#X=TI8|taYc&FwjB6WiogT7l@V%A_!=u@=wxkrb z>0D50i))S_iY|mr%-B*Q+)4uVZ%n3_EvR**bfX&h1)Ir*xiDKy3MHOB6&s5UB`8uV z>eeG<D~835Xh}&<b^+Pip>e&F#6QG9o5E~rWM5jfOnz}OX<-Zli=>8tfy2biS~2i1 zRaYX@4Qr3l4YHZFXLY^ZaAvmNxJhffezEBdKmR(*f>RG|7<g_@y#Jl$sdIlB{7&KH zFHax4;`4?sZuF25lixV7<awiM*Vm7`ANP3Rc0bu^;`M)g5mNSzrhD@Ctw)w^x${#% zBhM4B9{xCco%7J`?^QZp`Tk0SZa!g4TJQ8pAERqEH#_&k>0RgFTNS6cyWzEhBMWyg z3co-3{`%*d1>OxmKfA%lqlPC1f3jiSC9&S*pyu9NFV38CBmcp~@b~BT+L@+lZ5a9T z$*b+>?GfrV$iI~Ld*8C#<&Ae8_c-zJT#IAn+xpGudFR|+=dP`fPI;o;xhU<1yT^r# z2UY9)`CS||-*Hd<k0Ya38&~9<$k}&r|B(*gA1u0mz5b$03pP#-5i1<t0SYd#AYfb9 zaADE5-KWp43(p%dD&-k#mN~=coKQ2!{2OehhGGK-GakMco2f7E;l|;<q>-S-Vm1*7 zw#CeAvIfEMR;I94Z6ex4zyrN&MPH|Qlb#I;wY!Uh*xDqvF}b2Yz%s3iV^aFqg8VX* zWY@W9x@YASj?2k5`M`@u5hoWne2+P^7@yuaup-OYD%jM<)KyHNES*aXJ`;9eMN1>T zB7wWgO^o>LAHKj;WbBkvm>UwDn4cZeEH<WjC_n9&Q&d8U!$K?xbSTxO`Zv_|r=Ytv z(zDCsCqpmynX>NN6TKo5=Dia>OI*|Q+%xJg?*(^^OmrwcG^g8T@%rS?XKWn&rE6;Y z_OG0u8oNXj^HXuMW0z~8M{_EESGj1u+K`ofVz&E@d+ke)7snl*R&Z`hdDP6zmDBfV zA0;#n+GV`p_G(a2kGJ~wIU4SMIC|BwxKXp(mJPbLsWR^8cjI)?dq%!|cE!!n!&bOz zXTG_;eTVInE>-^IJFd&PhVGetqtX_Zd4%2X<GFn3kCoeAZQgm;lk_|B=FEn@K8TKJ zcz%DHZ^YIH>xVi0w&QZ_!6k|3oi-gEbhL+i`sJq1(}PcTNb1!)wLHP~!f%K6f9seL zli2E~;c3ou!}~q(fAn1|33NAtQ*YaVZu5CVp1jcGw;R8{Ibz50U$1uCo%or-%EOJy z8t-uR`Xl$Yx3@O9o?G1E*O%H|u?1a?*$#ATFe6nkBb|m!O;AjI5DTz_U#xZ$J42HI z!qFnUUK<criZtO`Tv>pyzZD4MQ!a$T1(^jQ_}~|V;y9`&P#r0@6T??Ny|VSxFe`JE zm(57$z|F82qlyNVWlS*xGFP;>M>|OE!yc9EgPYCT{<Hc@5OT864=|RZHVlldD_{X9 ze|I$oT)9^|zDrtM+>veZEtaezYRe9M7+yC%-o49;785#MxwC2YiZO$~_J8fuh_?q$ ziF|(YxYG5PoPPbRq*e6mo^2vhdVG04D?=Cj;ZxI_Ejwn6y}7QtzLRih?6ZN_ax<n3 zdbhN9{H8A7E^V=B=ibl*`6DX|6Su#x<EL+5*b@EjrG3JdcgCDKB<^0kJuBzQ+13du zi$-<UZF@O1tNFNx!Do**-FxM|9jzxD11C*0-rBCaIj%?A$ou0pWAhd@Z~Jq1mq+ae zo?O|ocj1@$UnD#n(&Ed8w<lk7oKR|5f2FX0;Oj#*#<=C%vd#oIb#CY1eBQv8{yklz z=loLe{h@_PzixB;;I(_JO5Pjx**k{v_-l_^U3cm18JulwoYi*hjYW62m^J{fFTi5` z*n-y~&rSPO|5De!j~6`h+kUL|Mr)S20I$oZSOMa{*U6RaLXRM8z(!auXPD(SlQCvA zKB|guvzJlm(9{anYlIBk;W!PKfctNrSN<$Q_~zod8Dr+Pp7g@!=YGgGx!?FS;E~Dy z-JL`GMZfgHvzJ!{GzxQXI`V@)^VS?+zP$0fY2|NuyZQ$hMg7C{@l&1Nz5M94;miD5 zF56pl`O4^(-?eEt`^XEod|fgRpNd^IersP<w|1LmH|*9e<3iAaw&PEh&DD8&_i1_c z@jk;Hzv%RI-OShi@yh{m-LYogqZ9U(4b&cce`d<e`(KsLZP%)E@8ZR&KTqj8($#!! z@YlN^tquLK@x5Qielsi0ZGWef$hncG&Yu)+(5%&6-ndUuFxR)?rL^#~hqQybygNDO zPKeOfbEjcl+5Eo8rn!zkHMIE~6UE*2x6UkjFX5-l*Bbmfxcktu7nP1HCY^Ma5EP*y zMGqSUeShObWz=tPRz^NQd;P8O#Xp`73;W6nL2Cq9+Zf?g7PtNj?l|En15NALVRw#y z@nW19vod;R)YSHWj(^rVTBV}QC><pM7jQaD%m6e?K&G4;T2*mvKqz_V7PtJbp`cYz z9|KlZfmnnxS{ZTR)`O$%XMF3D*JE>K&-uMJ?hkLN{`6pm``b<#8{dBI8)fvT1wIF& zzV_8Fc+&XP+UaXrxcOdKx>*zC+sCinR~LV9+IzK8$;N>3bxrvVZzuN&?yI~sTI<lg za(kbPeS|~Pe#yP%)~U4Lh|2T*M>bfO_|<c5d+vU+ZFF)+@2C4^yC3VNyz=<&ncqj( zJNx7I`&mv669eP=O};+SI41q$9zVUG)#I)EQ{pun$K^E5n%lhNi|5C;>k~2at-!*v z^?9+z*N(g7s%CaSR;*d@{lMAn)Vp3=^<3a58ST8*eC1VtP2VnIYk%IG+2!+ffk{2X z#Nz!0+s9TcOMTM${gFZb)14pGU)TE0-)G)CHz{l8OjAG8iKl<;vg-IJFTQo#&%6IY z$1z8{E$y?hySD4NIhS7VdujIUPn%rXa_YPA{cqhoRQ_t4k!$;>ch$Z8Ubon7Da-aO z`Mxl3z=OP}TqgMpNppE+dan3RU#Gcs>py9+?Cc5S(HYm9O$?jubAEh6tAKB^9&9-B zV6x{+r4uqw%>Haon+Z>fOg&aC-yM(}`qms5$KDTTHhs7B$j?{5Inesj%xMj#ra#`B zQgX4u7?o~#?)z7cti5`CK;s+F{TQz=8#eq}(6Jr27f<Q2$UV~Og%guLXx7Z*;fSNj zv*xEB+n=@AartKn&wjPF?Mt0wp3|H={#)GbUD@eRCL~^XU!0I?zI?TAM7K4j3Uxo& z<Vi|}LM)&6H{0Aww`x9td=G48q3C9H&&$O`ey2~>Z7L^~$;B#LjXOQ^Ei-3koy+H5 z@ZqGpZcb_wZZNbgXe;h|D(v!y=e`;8;<@dEuDU%RXFb8;Mvl5dA>?1!|N5+1F}oLS z*e=FyP$d6wukB;=4wKKtR&(l)zkGbg*mYAL&i0D!5$RE)nKmW$+_4Fsv959HEl17> z>F^-<%=Di!vhM0c$AWd8-rLml;N4Q)#8yl0DB^C1P1xD<b>EkEFS+CSVVl`I$HyGY z?9#mWn|)fHqv=51`4Ml<-T7U@wYNN{JNfTC`&N^RUFN$vFP!an`~_q9g3s<Qn)O}m zosQcZrFhqyG4fIFsgjcKUVm+S!<Tm(mIi+P<YY?QPZUEdU(L|<h}&AY;;p4m&b)T+ z+UCq?xA_k~@Y+z{ugQrkUr!l2AuFqH?B(m{CJt|OIoc2vd$sPAFIw;0955@<(|?w4 z<(N68_jkLjs!%o)E0m37?m3z&lwL@3XBsqH{2Sv|O1El3H7oTQgdlpA%vC1msuPU@ zx>A+nU~=WruP~DcZ%>4$XRj+KTqia>s#_M_`sSX^p^p!(pZaqDs2X%-^vQ{7M&Y|r zxqW7TnsxmPA^Y+CZ9`MvowlxEajxso$5ZAnTe0S_Z~aBCfrf5x%&7eNj&JjJrSo3u zHFDn@pI-@b-q5h=rvsJ!pT8ZorPUh~SFO95wxVfJ>vruQoSr;8W$($k$~&_ov$pSD zH+|mYhnL!%`uytZ-{Rj}b#rgU+l}V0nY_4c?K@fVYcHRfI^&a{b0SXPj4fI7%e9O7 zADp_-sgB_H<jvog?tfwA(U~u{2tKzWBkaXS&WFA9-Iw0}{NxMYWvsjM(~i?2s~=2? zY`lA4sb<Mlx19b>-+$P)LqfbUF4*VW=iYs%%URXqu01<V9I*UMfA5_kY3~{aw44!o V;p=**E0gYoX_w6j@S&UC{{_n6yhZ>3 literal 0 HcmV?d00001 diff --git a/.paket/paket.targets b/.paket/paket.targets new file mode 100644 index 0000000..ad11fac --- /dev/null +++ b/.paket/paket.targets @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + + <PropertyGroup> + <!-- Enable the restore command to run before builds --> + <RestorePackages Condition=" '$(RestorePackages)' == '' ">true</RestorePackages> + <PaketToolsPath>$(MSBuildThisFileDirectory)</PaketToolsPath> + <PaketRootPath>$(MSBuildThisFileDirectory)..\</PaketRootPath> + <PaketLockFilePath>$(PaketRootPath)paket.lock</PaketLockFilePath> + <PaketRestoreCacheFile>$(PaketRootPath)paket-files\paket.restore.cached</PaketRestoreCacheFile> + <MonoPath Condition="'$(MonoPath)' == '' And Exists('/Library/Frameworks/Mono.framework/Commands/mono')">/Library/Frameworks/Mono.framework/Commands/mono</MonoPath> + <MonoPath Condition="'$(MonoPath)' == ''">mono</MonoPath> + + <!-- Disable test for CLI tool completely - overrideable via properties in projects or via environment variables --> + <PaketDisableCliTest Condition=" '$(PaketDisableCliTest)' == '' ">False</PaketDisableCliTest> + </PropertyGroup> + + <!-- Resolve how paket should be called --> + <!-- Current priority is: local (1: repo root, 2: .paket folder) => 3: as CLI tool => as bootstrapper (4: proj Bootstrapper style, 5: BootstrapperExeDir) => 6: global path variable --> + <Target Name="SetPaketCommand" > + <!-- Test if paket is available in the standard locations. If so, that takes priority. Case 1/2 - non-windows specific --> + <PropertyGroup Condition=" '$(OS)' != 'Windows_NT' "> + <!-- no windows, try native paket as default, root => tool --> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket') ">$(PaketRootPath)paket</PaketExePath> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketToolsPath)paket') ">$(PaketToolsPath)paket</PaketExePath> + </PropertyGroup> + + <!-- Test if paket is available in the standard locations. If so, that takes priority. Case 2/2 - same across platforms --> + <PropertyGroup> + <!-- root => tool --> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketRootPath)paket.exe') ">$(PaketRootPath)paket.exe</PaketExePath> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketToolsPath)paket.exe') ">$(PaketToolsPath)paket.exe</PaketExePath> + </PropertyGroup> + + <!-- If paket hasn't be found in standard locations, test for CLI tool usage. --> + <!-- First test: Is CLI configured to be used in "dotnet-tools.json"? - can result in a false negative; only a positive outcome is reliable. --> + <PropertyGroup Condition=" '$(PaketExePath)' == '' "> + <_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json"))</_DotnetToolsJson> + <_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"'))</_ConfigContainsPaket> + <_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false</_ConfigContainsPaket> + </PropertyGroup> + + <!-- Second test: Call 'dotnet paket' and see if it returns without an error. Mute all the output. Only run if previous test failed and the test has not been disabled. --> + <!-- WARNING: This method can lead to processes hanging forever, and should be used as little as possible. See https://github.com/fsprojects/Paket/issues/3705 for details. --> + <Exec Condition=" '$(PaketExePath)' == '' AND !$(PaketDisableCliTest) AND !$(_ConfigContainsPaket)" Command="dotnet paket --version" IgnoreExitCode="true" StandardOutputImportance="low" StandardErrorImportance="low" > + <Output TaskParameter="ExitCode" PropertyName="LocalPaketToolExitCode" /> + </Exec> + + <!-- If paket is installed as CLI use that. Again, only if paket haven't already been found in standard locations. --> + <PropertyGroup Condition=" '$(PaketExePath)' == '' AND ($(_ConfigContainsPaket) OR '$(LocalPaketToolExitCode)' == '0') "> + <_PaketCommand>dotnet paket</_PaketCommand> + </PropertyGroup> + + <!-- If neither local files nor CLI tool can be found, final attempt is searching for boostrapper config before falling back to global path variable. --> + <PropertyGroup Condition=" '$(PaketExePath)' == '' AND '$(_PaketCommand)' == '' "> + <!-- Test for bootstrapper setup --> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND '$(PaketBootstrapperStyle)' == 'proj' ">$(PaketToolsPath)paket</PaketExePath> + <PaketExePath Condition=" '$(PaketExePath)' == '' AND Exists('$(PaketBootStrapperExeDir)') ">$(PaketBootStrapperExeDir)paket</PaketExePath> + + <!-- If all else fails, use global path approach. --> + <PaketExePath Condition=" '$(PaketExePath)' == ''">paket</PaketExePath> + </PropertyGroup> + + <!-- If not using CLI, setup correct execution command. --> + <PropertyGroup Condition=" '$(_PaketCommand)' == '' "> + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)"))</_PaketExeExtension> + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)"</_PaketCommand> + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)"</_PaketCommand> + <_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)"</_PaketCommand> + </PropertyGroup> + + <!-- The way to get a property to be available outside the target is to use this task. --> + <CreateProperty Value="$(_PaketCommand)"> + <Output TaskParameter="Value" PropertyName="PaketCommand"/> + </CreateProperty> + + </Target> + + <Choose> <!-- MyProject.fsproj.paket.references has the highest precedence --> + <When Condition="Exists('$(MSBuildProjectFullPath).paket.references')"> + <PropertyGroup> + <PaketReferences>$(MSBuildProjectFullPath).paket.references</PaketReferences> + </PropertyGroup> + </When> <!-- MyProject.paket.references --> + <When Condition="Exists('$(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references')"> + <PropertyGroup> + <PaketReferences>$(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references</PaketReferences> + </PropertyGroup> + </When> <!-- paket.references --> + <When Condition="Exists('$(MSBuildProjectDirectory)\paket.references')"> + <PropertyGroup> + <PaketReferences>$(MSBuildProjectDirectory)\paket.references</PaketReferences> + </PropertyGroup> + </When> <!-- Set to empty if a reference file isn't found matching one of the 3 format options --> + <Otherwise> + <PropertyGroup> + <PaketReferences></PaketReferences> + </PropertyGroup> + </Otherwise> + </Choose> + + <PropertyGroup> + <!-- We need to ensure packages are restored prior to assembly resolve --> + <BuildDependsOn Condition="$(RestorePackages) == 'true'">RestorePackages; $(BuildDependsOn);</BuildDependsOn> + </PropertyGroup> + + <Target Name="RestorePackages" DependsOnTargets="SetPaketCommand"> + + <PropertyGroup> + <!-- Commands --> + <RestoreCommand>$(PaketCommand) restore --references-file "$(PaketReferences)"</RestoreCommand> + <PaketRestoreRequired>true</PaketRestoreRequired> + </PropertyGroup> + + <PropertyGroup Condition="Exists('$(PaketRestoreCacheFile)') "> + <PaketRestoreCachedHash>$([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))</PaketRestoreCachedHash> + <PaketRestoreLockFileHash>$([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))</PaketRestoreLockFileHash> + <PaketRestoreRequired>true</PaketRestoreRequired> + <PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '$(PaketRestoreCachedHash)' ">false</PaketRestoreRequired> + <PaketRestoreRequired Condition=" '$(PaketRestoreLockFileHash)' == '' ">true</PaketRestoreRequired> + </PropertyGroup> + + <Exec Command="$(RestoreCommand)" + IgnoreStandardErrorWarningFormat="true" + WorkingDirectory="$(PaketRootPath)" + ContinueOnError="false" + Condition=" '$(PaketRestoreRequired)' == 'true' AND Exists('$(PaketReferences)') AND '$(PaketReferences)' != '' " + /> + </Target> +</Project> \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff386a4 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +ObjectTK +====== + + +ObjectTK is an extensible convenience layer for OpenGL. By itself, ObjectTK does not attempt to OO-ify the OpenGL API, but rather provide useful everyday classes which consolidate and simplify OpenGL operations. + +ObjectTK is currently under rapid active development. + +Features +======== + +- Highest possible performance. +- Full interop with "normal" OpenGL. +- Well-defined data types for all GL objects. +- Easy shader compiler. +- Highly extensible object model. +- Zero-overhead abstraction. + +ObjectTK is directly run and managed by [The OpenTK Team](https://opentk.github.io/). + +We'd love you to come and join us on the Discord! +[](https://discord.gg/GZTYR4s) + +## Getting started: + +1. [Install via NuGet](https://www.nuget.org/packages/ObjectTk) +2. Create things you need via `GLFactory`. + +## Build instructions + +Need Help? +========== + +Come chat with us on [Discord](https://discord.gg/6HqD48s). + +We're happy to help with anything from learning OpenGL to advanced OpenTK questions. + +License +======= + +ObjectTK is distributed under the permissive MIT license and is absolutely free. diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..f558d00 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,3 @@ +### 2.0.0-pre.1 + * Start of release notes for v2. + * Initial testing of build automation. \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..0b3d544 --- /dev/null +++ b/build.cmd @@ -0,0 +1,8 @@ +REM Install .NET Core (https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script) + +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) --version 3.1.100" + +SET PATH=%LOCALAPPDATA%\Microsoft\dotnet;%PATH% +.paket\paket.bootstrapper.exe +dotnet tool restore +dotnet fake run build.fsx %* \ No newline at end of file diff --git a/build.fsx b/build.fsx new file mode 100644 index 0000000..e73de2a --- /dev/null +++ b/build.fsx @@ -0,0 +1,294 @@ +open System +open System.IO +open System.Threading +open Fake.Core +open Fake.DotNet +open Fake.DotNet.NuGet +open Fake.IO + +#r "paket: +storage: packages +nuget Fake.IO.FileSystem +nuget Fake.DotNet.MSBuild +nuget Fake.DotNet.Testing.XUnit2 +nuget Fake.DotNet.AssemblyInfoFile +nuget Fake.DotNet.NuGet prerelease +nuget Fake.DotNet.Paket +nuget Fake.DotNet.Cli +nuget Fake.Core.Target +nuget Fake.Net.Http +nuget Fake.Api.Github +nuget xunit.runner.console +nuget NuGet.CommandLine +nuget Fake.Core.ReleaseNotes //" + +#load "./.fake/build.fsx/intellisense.fsx" + +open Fake.IO +open Fake.IO.FileSystemOperators +open Fake.IO.Globbing.Operators + +// --------- +// Configuration +// --------- + +let project = "ObjectTK" + +let authors = [ "Team OpenTK" ] + +let summary = "High-performance, extensible and unopinionated implementation of Data types and utilities for OpenGL & game development. A convenience layer above OpenTK aiming to speed up and simplify common tasks." + +let license = "https://opensource.org/licenses/MIT" + +let projectUrl = "https://github.com/opentk/objecttk" + +let iconUrl = "https://raw.githubusercontent.com/opentk/opentk/master/docs/files/img/logo.png" + +let description = + "High-performance, extensible and unopinionated implementation of Data types and utilities for OpenGL & game development. A convenience layer above OpenTK aiming to speed up and simplify common tasks. + + OpenTK comes with simple and easy to follow tutorials for learning *modern* OpenGL. These are written by the community and represent all of the best practices to get you started. + Learn how to use OpenTK here: + https://opentk.net/learn/index.html + + Sample projects that accompany the tutorial can be found here: + https://github.com/opentk/LearnOpenTK + + We have a very active discord server, if you need help, want to help, or are just curious, come join us! + https://discord.gg/6HqD48s + + " + +let tags = "ObjectTK OpenTK OpenGL OpenGLES GLES OpenAL OpenCL C# F# .NET Mono Vector Math Game Graphics Sound" + +let copyright = "Copyright (c) 2020 The OpenTK Team." + +let solutionFile = "OpenTK.sln" + +let gitOwner = "opentk" + +let gitHome = "https://github.com/" + gitOwner + +// The name of the project on GitHub +let gitName = "objecttk" + +// The url for the raw files hosted +let gitRaw = Environment.environVarOrDefault "gitRaw" "https://raw.github.com/objecttk" + +// Read additional information from the release notes document +let release = ReleaseNotes.load "RELEASE_NOTES.md" + +// --------- +// Properties +// --------- + +let binDir = "./bin/" +let buildDir = binDir </> "build" +let nugetDir = binDir </> "nuget" +let testDir = binDir </> "test" + +// --------- +// Projects & Assemblies +// --------- + +let toolProjects = + !! "src/Generators/**/*.??proj" + +let releaseProjects = + !! "src/**/*.??proj" + -- "src/Generator/**" + -- "src/Generator.Bind/**" + -- "src/Generator.Converter/**" + -- "src/Generator.Rewrite/**" + -- "src/SpecificationOpenGL/**" + -- "src/OpenAL/OpenALGenerator/**" + -- "src/OpenAL/OpenALTest/**" + -- "src/OpenAL/OpenTK.OpenAL.Extensions/**" + + +// Absolutely all test projects. +let allTestProjects = + !! "tests/**/*.??proj" + +// Test projects excluding integration tests (don't run on CI). +let ciTestProjects = + allTestProjects + -- "tests/**/*.Integration.??proj" + +let nugetCommandRunnerPath = + ".fake/build.fsx/packages/NuGet.CommandLine/tools/NuGet.exe" |> Fake.IO.Path.convertWindowsToCurrentPath + +// --------- +// Other Targets +// --------- + +// Lazily install DotNet SDK in the correct version if not available +let install = + lazy + (if (DotNet.getVersion id).StartsWith "3" then id + else DotNet.install (fun options -> { options with Version = DotNet.Version "3.1.100" })) + +// Define general properties across various commands (with arguments) +let inline withWorkDir wd = DotNet.Options.lift install.Value >> DotNet.Options.withWorkingDirectory wd + +// Set general properties without arguments +let inline dotnetSimple arg = DotNet.Options.lift install.Value arg + +module DotNet = + let run optionsFn framework projFile args = + DotNet.exec (dotnetSimple >> optionsFn) "run" (sprintf "-f %s -p \"%s\" %s" framework projFile args) + + let runWithDefaultOptions framework projFile args = run id framework projFile args + +let asArgs args = args |> String.concat " " + +// --------- +// Build Targets +// --------- + +Target.create "Clean" <| fun _ -> + !! ("./src" </> "OpenTK.Graphics" </> "**/*.*") + ++ (nugetDir </> "*.nupkg") + -- ("./src" </> "OpenTK.Graphics" </> "Enums/*.cs") + -- ("./src" </> "OpenTK.Graphics" </> "*.cs") + -- ("./src" </> "OpenTK.Graphics" </> "*.csproj") + -- ("./src" </> "OpenTK.Graphics" </> "ES11/Helper.cs") + -- ("./src" </> "OpenTK.Graphics" </> "ES20/Helper.cs") + -- ("./src" </> "OpenTK.Graphics" </> "ES30/Helper.cs") + -- ("./src" </> "OpenTK.Graphics" </> "OpenGL2/Helper.cs") + -- ("./src" </> "OpenTK.Graphics" </> "OpenGL4/Helper.cs") + -- ("./src" </> "OpenTK.Graphics" </> "paket") + |> Seq.iter(Shell.rm) + +Target.create "Restore" (fun _ -> DotNet.restore dotnetSimple "ObjectTK.sln" |> ignore) + +Target.create "Build"( fun _ -> + let setOptions a = + let customParams = sprintf "/p:DontGenBindings=true/p:PackageVersion=%s/p:ProductVersion=%s" release.AssemblyVersion release.NugetVersion + DotNet.Options.withCustomParams (Some customParams) (dotnetSimple a) + + for proj in releaseProjects do + DotNet.build setOptions proj + ) + +open System.IO + +Target.create "CreateNuGetPackage" (fun _ -> + Directory.CreateDirectory nugetDir |> ignore + let notes = release.Notes |> List.reduce (fun s1 s2 -> s1 + "\n" + s2) + + for proj in releaseProjects do + Trace.logf "Creating nuget package for Project: %s" proj + + let dir = Path.GetDirectoryName proj + let templatePath = Path.Combine(dir, "paket") + let oldTmplCont = File.ReadAllText templatePath + let newTmplCont = oldTmplCont.Insert(oldTmplCont.Length, sprintf "\nversion \n\t%s\nauthors \n\t%s\nowners \n\t%s\n" + release.NugetVersion + (authors |> List.reduce (fun s a -> s + " " + a)) + (authors |> List.reduce (fun s a -> s + " " + a))).Replace("#VERSION#", release.NugetVersion) + File.WriteAllText(templatePath + ".template", newTmplCont) + let setParams (p:Paket.PaketPackParams) = + { p with + ReleaseNotes = notes + OutputPath = Path.GetFullPath(nugetDir) + WorkingDir = dir + Version = release.NugetVersion + } + Paket.pack setParams + ) + +Target.create "CreateMetaPackage" (fun _ -> + let notes = release.Notes |> List.reduce (fun s1 s2 -> s1 + "\n" + s2) + + let deps = + releaseProjects + |> Seq.toList + |> List.map (fun p -> Path.GetFileNameWithoutExtension(p), release.NugetVersion) + + let setParams (p:NuGet.NuGetParams) = + { p with + Version = release.NugetVersion + Authors = authors + Project = project + Dependencies = deps + Summary = summary + Description = description + Copyright = copyright + WorkingDir = binDir + OutputPath = nugetDir +// AccessKey = myAccessKey + Publish = false + ReleaseNotes = notes + Tags = tags + Properties = [ + "Configuration", Environment.environVarOrDefault "buildMode" "Release" + ] + } + Trace.logf "Creating metapackage from objecttk.nuspec" + NuGet.NuGet setParams "objecttk.nuspec" + ) + +// --------- +// Release Targets +// --------- + +open Fake.Api + +Target.create "ReleaseOnGitHub" (fun _ -> + let token = + match Environment.environVarOrDefault "opentk_github_token" "" with + | s when not (System.String.IsNullOrWhiteSpace s) -> s + | _ -> + failwith + "please set the github_token environment variable to a github personal access token with repro access." + + let files = !!"bin/*" |> Seq.toList + + GitHub.createClientWithToken token + |> GitHub.draftNewRelease gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes + //|> GitHub.uploadFiles files + |> GitHub.publishDraft + |> Async.RunSynchronously) + +Target.create "ReleaseOnNuGet" (fun _ -> + let apiKey = + match Environment.environVarOrDefault "opentk_nuget_api_key" "" with + | s when not (System.String.IsNullOrWhiteSpace s) -> s + | _ -> failwith "please set the nuget_api_key environment variable to a nuget access token." + + !! (nugetDir </> "*.nupkg") + |> Seq.iter + (DotNet.nugetPush (fun opts -> + { opts with + PushParams = + { opts.PushParams with + ApiKey = Some apiKey + Source = Some "nuget.org" } }))) + +Target.create "ReleaseOnAll" ignore + +// --------- +// Target relations +// --------- + +Target.create "All" ignore + +open Fake.Core.TargetOperators + +"Clean" + ==> "Restore" + ==> "Build" + ==> "All" + ==> "CreateNuGetPackage" + ==> "CreateMetaPackage" + ==> "ReleaseOnNuGet" + ==> "ReleaseOnGithub" + ==> "ReleaseOnAll" + +// --------- +// Startup +// --------- + +// Run all targets by default. Invoke 'build <Target>' to override +Target.runOrDefault "All" diff --git a/build.fsx.lock b/build.fsx.lock new file mode 100644 index 0000000..e7c4796 --- /dev/null +++ b/build.fsx.lock @@ -0,0 +1,326 @@ +STORAGE: PACKAGES +RESTRICTION: == netstandard2.0 +NUGET + remote: https://api.nuget.org/v3/index.json + BlackFox.VsWhere (1.1) + FSharp.Core (>= 4.2.3) + Microsoft.Win32.Registry (>= 4.7) + Fake.Api.Github (5.20.3) + FSharp.Core (>= 4.7.2) + Octokit (>= 0.48) + Fake.Core.CommandLineParsing (5.20.3) + FParsec (>= 1.1.1) + FSharp.Core (>= 4.7.2) + Fake.Core.Context (5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.Environment (5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.FakeVar (5.20.3) + Fake.Core.Context (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.Process (5.20.3) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.FakeVar (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + FSharp.Core (>= 4.7.2) + System.Collections.Immutable (>= 1.7.1) + Fake.Core.ReleaseNotes (5.20.3) + Fake.Core.SemVer (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.SemVer (5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.String (5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.Target (5.20.3) + Fake.Core.CommandLineParsing (>= 5.20.3) + Fake.Core.Context (>= 5.20.3) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.FakeVar (>= 5.20.3) + Fake.Core.Process (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + FSharp.Control.Reactive (>= 4.4.2) + FSharp.Core (>= 4.7.2) + Fake.Core.Tasks (5.20.3) + Fake.Core.Trace (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.Trace (5.20.3) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.FakeVar (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Core.Xml (5.20.3) + Fake.Core.String (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.DotNet.AssemblyInfoFile (5.20.3) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.DotNet.Cli (5.20.3) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.Process (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.DotNet.MSBuild (>= 5.20.3) + Fake.DotNet.NuGet (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Mono.Posix.NETStandard (>= 1.0) + Newtonsoft.Json (>= 12.0.3) + Fake.DotNet.MSBuild (5.20.3) + BlackFox.VsWhere (>= 1.1) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.Process (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + FSharp.Core (>= 4.7.2) + MSBuild.StructuredLogger (>= 2.1.176) + Fake.DotNet.NuGet (5.20.3) + Fake.Core.Environment (>= 5.20.3) + Fake.Core.Process (>= 5.20.3) + Fake.Core.SemVer (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Tasks (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.Core.Xml (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + Fake.Net.Http (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Newtonsoft.Json (>= 12.0.3) + NuGet.Protocol (>= 5.6) + Fake.DotNet.Paket (5.20.3) + Fake.Core.Process (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.DotNet.Cli (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.DotNet.Testing.XUnit2 (5.20.3) + Fake.Core.Process (>= 5.20.3) + Fake.Core.String (>= 5.20.3) + Fake.Core.Trace (>= 5.20.3) + Fake.IO.FileSystem (>= 5.20.3) + Fake.Testing.Common (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.IO.FileSystem (5.20.3) + Fake.Core.String (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Net.Http (5.20.3) + Fake.Core.Trace (>= 5.20.3) + FSharp.Core (>= 4.7.2) + Fake.Testing.Common (5.20.3) + Fake.Core.Trace (>= 5.20.3) + FSharp.Core (>= 4.7.2) + FParsec (1.1.1) + FSharp.Core (>= 4.3.4) + FSharp.Control.Reactive (4.4.2) + FSharp.Core (>= 4.7.2) + System.Reactive (>= 4.4.1) + FSharp.Core (5.0) + Microsoft.Build (16.7) + Microsoft.Build.Framework (16.7) + System.Security.Permissions (>= 4.7) + Microsoft.Build.Tasks.Core (16.7) + Microsoft.Build.Framework (>= 16.7) + Microsoft.Build.Utilities.Core (>= 16.7) + Microsoft.Win32.Registry (>= 4.3) + System.CodeDom (>= 4.4) + System.Collections.Immutable (>= 1.5) + System.Reflection.Metadata (>= 1.6) + System.Reflection.TypeExtensions (>= 4.1) + System.Resources.Extensions (>= 4.6) + System.Security.Permissions (>= 4.7) + System.Threading.Tasks.Dataflow (>= 4.9) + Microsoft.Build.Utilities.Core (16.7) + Microsoft.Build.Framework (>= 16.7) + Microsoft.Win32.Registry (>= 4.3) + System.Collections.Immutable (>= 1.5) + System.Security.Permissions (>= 4.7) + System.Text.Encoding.CodePages (>= 4.0.1) + Microsoft.NETCore.Platforms (5.0) + Microsoft.NETCore.Targets (5.0) + Microsoft.Win32.Registry (5.0) + System.Buffers (>= 4.5.1) + System.Memory (>= 4.5.4) + System.Security.AccessControl (>= 5.0) + System.Security.Principal.Windows (>= 5.0) + Mono.Posix.NETStandard (1.0) + MSBuild.StructuredLogger (2.1.215) + Microsoft.Build (>= 16.4) + Microsoft.Build.Framework (>= 16.4) + Microsoft.Build.Tasks.Core (>= 16.4) + Microsoft.Build.Utilities.Core (>= 16.4) + Newtonsoft.Json (12.0.3) + NuGet.CommandLine (5.7) + NuGet.Common (5.8) + NuGet.Frameworks (>= 5.8) + NuGet.Configuration (5.8) + NuGet.Common (>= 5.8) + System.Security.Cryptography.ProtectedData (>= 4.4) + NuGet.Frameworks (5.8) + NuGet.Packaging (5.7) + Newtonsoft.Json (>= 9.0.1) + NuGet.Configuration (>= 5.7) + NuGet.Versioning (>= 5.7) + System.Dynamic.Runtime (>= 4.3) + System.Security.Cryptography.Cng (>= 5.0.0-preview.3.20214.6) + System.Security.Cryptography.Pkcs (>= 5.0.0-preview.3.20214.6) + NuGet.Protocol (5.7) + NuGet.Packaging (>= 5.7) + System.Dynamic.Runtime (>= 4.3) + NuGet.Versioning (5.8) + Octokit (0.48) + System.Buffers (4.5.1) + System.CodeDom (5.0) + System.Collections (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.Collections.Immutable (5.0) + System.Memory (>= 4.5.4) + System.Diagnostics.Debug (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.Dynamic.Runtime (4.3) + System.Collections (>= 4.3) + System.Diagnostics.Debug (>= 4.3) + System.Linq (>= 4.3) + System.Linq.Expressions (>= 4.3) + System.ObjectModel (>= 4.3) + System.Reflection (>= 4.3) + System.Reflection.Emit (>= 4.3) + System.Reflection.Emit.ILGeneration (>= 4.3) + System.Reflection.Primitives (>= 4.3) + System.Reflection.TypeExtensions (>= 4.3) + System.Resources.ResourceManager (>= 4.3) + System.Runtime (>= 4.3) + System.Runtime.Extensions (>= 4.3) + System.Threading (>= 4.3) + System.Formats.Asn1 (5.0) + System.Buffers (>= 4.5.1) + System.Memory (>= 4.5.4) + System.Globalization (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.IO (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.Text.Encoding (>= 4.3) + System.Threading.Tasks (>= 4.3) + System.Linq (4.3) + System.Collections (>= 4.3) + System.Diagnostics.Debug (>= 4.3) + System.Resources.ResourceManager (>= 4.3) + System.Runtime (>= 4.3) + System.Runtime.Extensions (>= 4.3) + System.Linq.Expressions (4.3) + System.Collections (>= 4.3) + System.Diagnostics.Debug (>= 4.3) + System.Globalization (>= 4.3) + System.IO (>= 4.3) + System.Linq (>= 4.3) + System.ObjectModel (>= 4.3) + System.Reflection (>= 4.3) + System.Reflection.Emit (>= 4.3) + System.Reflection.Emit.ILGeneration (>= 4.3) + System.Reflection.Emit.Lightweight (>= 4.3) + System.Reflection.Extensions (>= 4.3) + System.Reflection.Primitives (>= 4.3) + System.Reflection.TypeExtensions (>= 4.3) + System.Resources.ResourceManager (>= 4.3) + System.Runtime (>= 4.3) + System.Runtime.Extensions (>= 4.3) + System.Threading (>= 4.3) + System.Memory (4.5.4) + System.Buffers (>= 4.5.1) + System.Numerics.Vectors (>= 4.4) + System.Runtime.CompilerServices.Unsafe (>= 4.5.3) + System.Numerics.Vectors (4.5) + System.ObjectModel (4.3) + System.Collections (>= 4.3) + System.Diagnostics.Debug (>= 4.3) + System.Resources.ResourceManager (>= 4.3) + System.Runtime (>= 4.3) + System.Threading (>= 4.3) + System.Reactive (4.4.1) + System.Runtime.InteropServices.WindowsRuntime (>= 4.3) + System.Threading.Tasks.Extensions (>= 4.5.4) + System.Reflection (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.IO (>= 4.3) + System.Reflection.Primitives (>= 4.3) + System.Runtime (>= 4.3) + System.Reflection.Emit (4.7) + System.Reflection.Emit.ILGeneration (>= 4.7) + System.Reflection.Emit.ILGeneration (4.7) + System.Reflection.Emit.Lightweight (4.7) + System.Reflection.Emit.ILGeneration (>= 4.7) + System.Reflection.Extensions (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Reflection (>= 4.3) + System.Runtime (>= 4.3) + System.Reflection.Metadata (5.0) + System.Collections.Immutable (>= 5.0) + System.Reflection.Primitives (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.Reflection.TypeExtensions (4.7) + System.Resources.Extensions (5.0) + System.Memory (>= 4.5.4) + System.Resources.ResourceManager (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Globalization (>= 4.3) + System.Reflection (>= 4.3) + System.Runtime (>= 4.3) + System.Runtime (4.3.1) + Microsoft.NETCore.Platforms (>= 1.1.1) + Microsoft.NETCore.Targets (>= 1.1.3) + System.Runtime.CompilerServices.Unsafe (5.0) + System.Runtime.Extensions (4.3.1) + Microsoft.NETCore.Platforms (>= 1.1.1) + Microsoft.NETCore.Targets (>= 1.1.3) + System.Runtime (>= 4.3.1) + System.Runtime.InteropServices.WindowsRuntime (4.3) + System.Runtime (>= 4.3) + System.Security.AccessControl (5.0) + System.Security.Principal.Windows (>= 5.0) + System.Security.Cryptography.Cng (5.0) + System.Security.Cryptography.Pkcs (5.0) + System.Buffers (>= 4.5.1) + System.Formats.Asn1 (>= 5.0) + System.Memory (>= 4.5.4) + System.Security.Cryptography.Cng (>= 5.0) + System.Security.Cryptography.ProtectedData (5.0) + System.Memory (>= 4.5.4) + System.Security.Permissions (5.0) + System.Security.AccessControl (>= 5.0) + System.Security.Principal.Windows (5.0) + System.Text.Encoding (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.Text.Encoding.CodePages (5.0) + System.Runtime.CompilerServices.Unsafe (>= 5.0) + System.Threading (4.3) + System.Runtime (>= 4.3) + System.Threading.Tasks (>= 4.3) + System.Threading.Tasks (4.3) + Microsoft.NETCore.Platforms (>= 1.1) + Microsoft.NETCore.Targets (>= 1.1) + System.Runtime (>= 4.3) + System.Threading.Tasks.Dataflow (5.0) + System.Threading.Tasks.Extensions (4.5.4) + System.Runtime.CompilerServices.Unsafe (>= 4.5.3) + xunit.runner.console (2.4.1) diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..8e0c9e2 --- /dev/null +++ b/build.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -e -o + +function version_compare() { + ver1=(${1//./ }) + ver2=(${2//./ }) + + len1=${#ver1[@]} + len2=${#ver2[@]} + + vlen=$(($len1 < $len2 ? $len1 : $len2)) + + for ((i=0;i<vlen;i++)) + do + if [ ${ver1[$i]} -gt ${ver2[$i]} ]; then + return 1 + fi + done + return 0 +} + +MINIMAL_DOTNET_VERSION=3.1.100 + +EXIT_CODE=0 + +CURRENT_DOTNET_VERSION=$(dotnet --version 2> /dev/null) || EXIT_CODE=$? + +if (($EXIT_CODE == 0)) && version_compare "$MINIMAL_DOTNET_VERSION" "$CURRENT_DOTNET_VERSION"; then + echo "dotnet command already installed" +else + # Install .NET Core (https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script) + curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --version 3.1.100 + + PATH="~/.dotnet:$PATH" +fi + +dotnet tool restore +dotnet fake run build.fsx $@ \ No newline at end of file From b1f42b0cf53db42764088b2bf81f473424489058 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Tue, 10 Nov 2020 18:25:51 +0200 Subject: [PATCH 25/52] Working one-step build --- .gitignore | 5 +++- build.fsx | 13 ++-------- objectTK.nuspec | 16 ++++++++++++ paket.dependencies | 7 +++++ paket.lock | 36 ++++++++++++++++++++++++++ src/ObjectTK.2D/ObjectTK.2D.csproj | 4 +++ src/ObjectTK.2D/paket | 8 ++++++ src/ObjectTK.Core/ObjectTK.Core.csproj | 4 +++ src/ObjectTK.Core/paket | 8 ++++++ 9 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 objectTK.nuspec create mode 100644 paket.dependencies create mode 100644 paket.lock create mode 100644 src/ObjectTK.2D/paket create mode 100644 src/ObjectTK.Core/paket diff --git a/.gitignore b/.gitignore index 259653e..f7b314d 100644 --- a/.gitignore +++ b/.gitignore @@ -360,4 +360,7 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd -.idea +.idea + +# packet.template files are autogenerated +paket.template diff --git a/build.fsx b/build.fsx index e73de2a..ca657b3 100644 --- a/build.fsx +++ b/build.fsx @@ -91,19 +91,10 @@ let testDir = binDir </> "test" // Projects & Assemblies // --------- -let toolProjects = - !! "src/Generators/**/*.??proj" let releaseProjects = - !! "src/**/*.??proj" - -- "src/Generator/**" - -- "src/Generator.Bind/**" - -- "src/Generator.Converter/**" - -- "src/Generator.Rewrite/**" - -- "src/SpecificationOpenGL/**" - -- "src/OpenAL/OpenALGenerator/**" - -- "src/OpenAL/OpenALTest/**" - -- "src/OpenAL/OpenTK.OpenAL.Extensions/**" + !! "src/ObjectTK.Core/*.??proj" + ++ "src/ObjectTK.2D/*.??proj" // Absolutely all test projects. diff --git a/objectTK.nuspec b/objectTK.nuspec new file mode 100644 index 0000000..580e9aa --- /dev/null +++ b/objectTK.nuspec @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> + <metadata> + <id>ObjectTK</id> + <version>1</version> + <copyright>@copyright@</copyright> + <tags>@tags@</tags> + <description>@description@</description> + <authors>@authors@</authors> + <releaseNotes>@releaseNotes@</releaseNotes> + <projectUrl>https://github.com/opentk/opentk</projectUrl> + <license type="expression">MIT</license> + <iconUrl>https://api.nuget.org/v3-flatcontainer/opentk/3.1.0/icon</iconUrl> + @dependencies@ + </metadata> +</package> diff --git a/paket.dependencies b/paket.dependencies new file mode 100644 index 0000000..8843b6a --- /dev/null +++ b/paket.dependencies @@ -0,0 +1,7 @@ +framework: netcoreapp3.1 + +source https://api.nuget.org/v3/index.json + +// open packages +nuget FAKE ~> 4.62 +nuget OpenTK >= 4.1 \ No newline at end of file diff --git a/paket.lock b/paket.lock new file mode 100644 index 0000000..1db978f --- /dev/null +++ b/paket.lock @@ -0,0 +1,36 @@ +RESTRICTION: == netcoreapp3.1 +NUGET + remote: https://api.nuget.org/v3/index.json + FAKE (4.64.18) + OpenTK (4.1) + OpenTK.Compute (>= 4.1) + OpenTK.Core (>= 4.1) + OpenTK.Graphics (>= 4.1) + OpenTK.Input (>= 4.1) + OpenTK.Mathematics (>= 4.1) + OpenTK.OpenAL (>= 4.1) + OpenTK.Windowing.Common (>= 4.1) + OpenTK.Windowing.Desktop (>= 4.1) + OpenTK.Windowing.GraphicsLibraryFramework (>= 4.1) + OpenTK.Compute (4.1) + OpenTK.Core (4.1) + OpenTK.Graphics (4.1) + OpenTK.Core (>= 4.1 < 4.2) + OpenTK.Mathematics (>= 4.1 < 4.2) + OpenTK.Input (4.1) + OpenTK.Mathematics (4.1) + OpenTK.OpenAL (4.1) + OpenTK.Core (>= 4.1 < 4.2) + OpenTK.Mathematics (>= 4.1 < 4.2) + OpenTK.redist.glfw (3.3.0-pre20200830200122) + OpenTK.Windowing.Common (4.1) + OpenTK.Core (>= 4.1 < 4.2) + OpenTK.Mathematics (>= 4.1 < 4.2) + OpenTK.Windowing.Desktop (4.1) + OpenTK.Core (>= 4.1 < 4.2) + OpenTK.Mathematics (>= 4.1 < 4.2) + OpenTK.Windowing.Common (>= 4.1 < 4.2) + OpenTK.Windowing.GraphicsLibraryFramework (>= 4.1 < 4.2) + OpenTK.Windowing.GraphicsLibraryFramework (4.1) + OpenTK.Core (>= 4.1 < 4.2) + OpenTK.redist.glfw (>= 3.3.0-pre20200830200122 < 3.4.0-pre) diff --git a/src/ObjectTK.2D/ObjectTK.2D.csproj b/src/ObjectTK.2D/ObjectTK.2D.csproj index a7966fa..b5f7d45 100644 --- a/src/ObjectTK.2D/ObjectTK.2D.csproj +++ b/src/ObjectTK.2D/ObjectTK.2D.csproj @@ -5,6 +5,10 @@ <RootNamespace>ObjectTK._2D</RootNamespace> </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> + <DocumentationFile>bin\Release\ObjectTK.2D.xml</DocumentationFile> + </PropertyGroup> + <ItemGroup> <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> <PackageReference Include="OpenTK" Version="4.1.0" /> diff --git a/src/ObjectTK.2D/paket b/src/ObjectTK.2D/paket new file mode 100644 index 0000000..9481fae --- /dev/null +++ b/src/ObjectTK.2D/paket @@ -0,0 +1,8 @@ +type file +id ObjectTK.2D +description + Holds 2D specific parts of ObjectTK. +files + bin\Release\netcoreapp3.1\ObjectTK.2D.dll ==> lib\netcoreapp3.1 + bin\Release\netcoreapp3.1\ObjectTK.2D.xml ==> lib\netcoreapp3.1 + bin\Release\netcoreapp3.1\ObjectTK.2D.pdb ==> lib\netcoreapp3.1 \ No newline at end of file diff --git a/src/ObjectTK.Core/ObjectTK.Core.csproj b/src/ObjectTK.Core/ObjectTK.Core.csproj index a846987..5ec1c2c 100644 --- a/src/ObjectTK.Core/ObjectTK.Core.csproj +++ b/src/ObjectTK.Core/ObjectTK.Core.csproj @@ -6,6 +6,10 @@ <RootNamespace>ObjectTK</RootNamespace> </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> + <DocumentationFile>bin\Release\ObjectTK.Core.xml</DocumentationFile> + </PropertyGroup> + <ItemGroup> <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> <PackageReference Include="OpenTK" Version="4.1.0" /> diff --git a/src/ObjectTK.Core/paket b/src/ObjectTK.Core/paket new file mode 100644 index 0000000..8f61eae --- /dev/null +++ b/src/ObjectTK.Core/paket @@ -0,0 +1,8 @@ +type file +id ObjectTK.2D +description + Holds 2D specific parts of ObjectTK. +files + bin\Release\netcoreapp3.1\ObjectTK.Core.dll ==> lib\netcoreapp3.1 + bin\Release\netcoreapp3.1\ObjectTK.Core.xml ==> lib\netcoreapp3.1 + bin\Release\netcoreapp3.1\ObjectTK.Core.pdb ==> lib\netcoreapp3.1 \ No newline at end of file From 745063c86be4bc199093370d28d28b741ed90c00 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Thu, 12 Nov 2020 13:25:54 +0200 Subject: [PATCH 26/52] simplifications & API tweaks --- src/Examples/Examples/HelloTriangle.cs | 2 +- src/ObjectTK.Core/GLFactory.cs | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/Examples/Examples/HelloTriangle.cs b/src/Examples/Examples/HelloTriangle.cs index 6f2858e..e7c39c0 100644 --- a/src/Examples/Examples/HelloTriangle.cs +++ b/src/Examples/Examples/HelloTriangle.cs @@ -68,10 +68,10 @@ protected override void OnLoad() { // create the triangle to draw var positions = new[] {new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(0, 1, 0)}; var colors = new[] {Color4.Cornsilk, Color4.OrangeRed, Color4.DarkOliveGreen}; + _positionsVbo = GLFactory.Buffer.ArrayBuffer("Positions", positions); _colorsVbo = GLFactory.Buffer.ArrayBuffer("Colors", colors); _vao = GLFactory.VertexArray.FromBuffers("Triangle", _positionsVbo, _colorsVbo); - } protected override void OnRenderFrame(FrameEventArgs e) { diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 92d4a40..a4ad0e5 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -108,9 +108,9 @@ public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsage [EditorBrowsable(EditorBrowsableState.Advanced)] - public sealed class GLVertexArrayObjectFactory { - public static GLVertexArrayObjectFactory Instance { get; } = new GLVertexArrayObjectFactory(); - private GLVertexArrayObjectFactory() { } + public sealed class GLVertexArrayFactory { + public static GLVertexArrayFactory Instance { get; } = new GLVertexArrayFactory(); + private GLVertexArrayFactory() { } // Hide the default members of this object for a cleaner API. @@ -186,10 +186,7 @@ public static class GLFactory { public static readonly GLShaderFactory Shader = GLShaderFactory.Instance; public static readonly GLBufferFactory Buffer = GLBufferFactory.Instance; - public static readonly GLVertexArrayObjectFactory VertexArrayObject = GLVertexArrayObjectFactory.Instance; - /// Alias for VertexArrayObject - // ReSharper disable once InconsistentNaming - public static readonly GLVertexArrayObjectFactory VertexArray = VertexArrayObject; + public static readonly GLVertexArrayFactory VertexArray = GLVertexArrayFactory.Instance; } From f570f69fa7ad4e17f0218abfbbfe91941875dede Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:04:38 +0200 Subject: [PATCH 27/52] Update package id --- src/ObjectTK.Core/paket | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ObjectTK.Core/paket b/src/ObjectTK.Core/paket index 8f61eae..0cf12d8 100644 --- a/src/ObjectTK.Core/paket +++ b/src/ObjectTK.Core/paket @@ -1,7 +1,7 @@ type file -id ObjectTK.2D +id ObjectTK.Core description - Holds 2D specific parts of ObjectTK. + Holds fundamental abstractions of OpenGL and core components of ObjectTK. files bin\Release\netcoreapp3.1\ObjectTK.Core.dll ==> lib\netcoreapp3.1 bin\Release\netcoreapp3.1\ObjectTK.Core.xml ==> lib\netcoreapp3.1 From 384a2ecf7768a5cddf06657384dc58a3fd1adc19 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:04:49 +0200 Subject: [PATCH 28/52] fix shader compiler bug --- src/ObjectTK.Core/Shaders/ShaderCompiler.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ObjectTK.Core/Shaders/ShaderCompiler.cs b/src/ObjectTK.Core/Shaders/ShaderCompiler.cs index 472abbf..32b70be 100644 --- a/src/ObjectTK.Core/Shaders/ShaderCompiler.cs +++ b/src/ObjectTK.Core/Shaders/ShaderCompiler.cs @@ -46,7 +46,6 @@ public static ShaderProgram Introspect(int prog, ShaderStage[] stages) { Size = count, ActiveAttribType = attrType, }; - GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); } // inspect the uniforms From 40b6db0f43fe8b16985898795480a3d144effc35 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:07:13 +0200 Subject: [PATCH 29/52] API additions & fixes --- src/ObjectTK.Core/GLFactory.cs | 16 ++++++++++++++-- src/ObjectTK.Core/GLObjects/VertexArray.cs | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index a4ad0e5..824d11d 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -104,6 +104,7 @@ public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsage GL.BindBuffer(BufferTarget.ArrayBuffer, 0); return new Buffer<T>(name, vbo, vertices.Length); } + } @@ -174,9 +175,20 @@ public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] return new VertexArray(name, vao, length); } - + + + /// Loads a vertex and fragment shader from an embedded resource in the executing assembly. + [Pure] + [NotNull] + public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> indexBuffer, params Buffer[] vertexBuffers) { + var b = FromBuffers(name, vertexBuffers); + GL.BindVertexArray(b.Handle); + GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer.Handle); + GL.BindVertexArray(0); + b.ElementCount = indexBuffer.ElementCount; + return b; + } } - } /// Top-level class responsible for creating all OpenGL objects. diff --git a/src/ObjectTK.Core/GLObjects/VertexArray.cs b/src/ObjectTK.Core/GLObjects/VertexArray.cs index 749c55e..bb4c6e2 100644 --- a/src/ObjectTK.Core/GLObjects/VertexArray.cs +++ b/src/ObjectTK.Core/GLObjects/VertexArray.cs @@ -8,7 +8,7 @@ public class VertexArray { /// The OpenGL handle. Use this to interact with OpenGL. public int Handle { get; } /// The number of elements in this VAO. - public int ElementCount { get; } + public int ElementCount { get; set; } public VertexArray(string name, int handle, int elementCount) { Name = name; From 9ee63c89a6443db1771b13676f5e4668b11b7ad6 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:08:55 +0200 Subject: [PATCH 30/52] add new API for element array buffers --- src/ObjectTK.Core/GLFactory.cs | 6 +++--- src/ObjectTK.Core/GLObjects/VertexArray.cs | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 824d11d..3ac1249 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -173,11 +173,10 @@ public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindVertexArray(0); - return new VertexArray(name, vao, length); + return new VertexArray(name, vao, length, false); } - - /// Loads a vertex and fragment shader from an embedded resource in the executing assembly. + /// Creates a vertex array from the [Pure] [NotNull] public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> indexBuffer, params Buffer[] vertexBuffers) { @@ -186,6 +185,7 @@ public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> inde GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer.Handle); GL.BindVertexArray(0); b.ElementCount = indexBuffer.ElementCount; + b.HasElementArrayBuffer = true; return b; } } diff --git a/src/ObjectTK.Core/GLObjects/VertexArray.cs b/src/ObjectTK.Core/GLObjects/VertexArray.cs index bb4c6e2..d0498f8 100644 --- a/src/ObjectTK.Core/GLObjects/VertexArray.cs +++ b/src/ObjectTK.Core/GLObjects/VertexArray.cs @@ -9,11 +9,15 @@ public class VertexArray { public int Handle { get; } /// The number of elements in this VAO. public int ElementCount { get; set; } + + /// If this vertex array has an element array buffer (i.e. should be displayed using indexed drawing). + public bool HasElementArrayBuffer { get; set; } - public VertexArray(string name, int handle, int elementCount) { + public VertexArray(string name, int handle, int elementCount, int hasElementArrayBuffer) { Name = name; Handle = handle; ElementCount = elementCount; + HasElementArrayBuffer = hasElementArrayBuffer; } } } From 03b65757148ef12c22e2beb886446aec1391868f Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:09:41 +0200 Subject: [PATCH 31/52] Release 2.0.0-pre.2 --- RELEASE_NOTES.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index f558d00..c1f8a11 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,8 @@ +### 2.0.0-pre.2 + * Fix error in shader compiler. + * Add support for indexed vertex arrays. + + ### 2.0.0-pre.1 * Start of release notes for v2. - * Initial testing of build automation. \ No newline at end of file + * Initial testing of build automation. From 0a08a72d5245b7819a96d11c33af9101709f547d Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:13:00 +0200 Subject: [PATCH 32/52] Fix build --- src/Examples/Examples/HelloTriangleWithExtensions.cs | 2 +- src/ObjectTK.Core/GLObjects/VertexArray.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Examples/Examples/HelloTriangleWithExtensions.cs b/src/Examples/Examples/HelloTriangleWithExtensions.cs index 6c49b48..e8754dd 100644 --- a/src/Examples/Examples/HelloTriangleWithExtensions.cs +++ b/src/Examples/Examples/HelloTriangleWithExtensions.cs @@ -29,7 +29,7 @@ protected override void OnLoad() { VBO = new Buffer<Vector3>("Positions", GL.GenBuffer(), 0); VBO.BufferData(BufferTarget.ArrayBuffer, Vertices); - VAO = new VertexArray("Triangle", GL.GenVertexArray(), Vertices.Length); + VAO = new VertexArray("Triangle", GL.GenVertexArray(), Vertices.Length,false); VAO.BindVertexAttribute(ShaderProgram.Variables.InPosition, VBO); ActiveCamera.Position = new Vector3(0, 0, 3); diff --git a/src/ObjectTK.Core/GLObjects/VertexArray.cs b/src/ObjectTK.Core/GLObjects/VertexArray.cs index d0498f8..961cea0 100644 --- a/src/ObjectTK.Core/GLObjects/VertexArray.cs +++ b/src/ObjectTK.Core/GLObjects/VertexArray.cs @@ -13,7 +13,7 @@ public class VertexArray { /// If this vertex array has an element array buffer (i.e. should be displayed using indexed drawing). public bool HasElementArrayBuffer { get; set; } - public VertexArray(string name, int handle, int elementCount, int hasElementArrayBuffer) { + public VertexArray(string name, int handle, int elementCount, bool hasElementArrayBuffer) { Name = name; Handle = handle; ElementCount = elementCount; From 4db61a6eed18a5828393d0451021bc656dd57303 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:24:34 +0200 Subject: [PATCH 33/52] Adjust labelling --- src/ObjectTK.Core/GLFactory.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 3ac1249..c152d3d 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -94,8 +94,8 @@ public override string ToString() public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T: unmanaged { var vbo = GL.GenBuffer(); var label = $"Buffer: {name}"; - GL.ObjectLabel(ObjectLabelIdentifier.Buffer, vbo,label.Length, label); GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); + GL.ObjectLabel(ObjectLabelIdentifier.Buffer, vbo,label.Length, label); int elemSize; unsafe { elemSize = sizeof(T); @@ -161,8 +161,8 @@ public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] var vao = GL.GenVertexArray(); var label = $"VertexArray: {name}"; - GL.ObjectLabel(ObjectLabelIdentifier.VertexArray,vao, name.Length, label); GL.BindVertexArray(vao); + GL.ObjectLabel(ObjectLabelIdentifier.VertexArray,vao, name.Length, label); for (int i = 0; i < buffers.Length; i++) { var buffer = buffers[i]; GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Handle); From f408d56a32625fb10b80058593861aeed140b5a3 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 10:25:20 +0200 Subject: [PATCH 34/52] Release 2.0.0-pre.3 --- RELEASE_NOTES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index c1f8a11..8709b1a 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,5 @@ +### 2.0.0-pre.3 + * Fix labelling error. ### 2.0.0-pre.2 * Fix error in shader compiler. * Add support for indexed vertex arrays. From 36ecd880c411fe8594fe4db540ff412ed121656b Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 11:54:57 +0200 Subject: [PATCH 35/52] Fix component count in buffers --- src/ObjectTK.Core/GLObjects/Buffer.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ObjectTK.Core/GLObjects/Buffer.cs b/src/ObjectTK.Core/GLObjects/Buffer.cs index 28ebfcd..82a25d7 100644 --- a/src/ObjectTK.Core/GLObjects/Buffer.cs +++ b/src/ObjectTK.Core/GLObjects/Buffer.cs @@ -46,10 +46,9 @@ public TypeToGLInfoCache(VertexAttribPointerType attribPointerType, int componen private static readonly Dictionary<Type, TypeToGLInfoCache> InfoCache = new Dictionary<Type, TypeToGLInfoCache>(); private static void Add<T2>(VertexAttribPointerType vapt, int componentCount) { - InfoCache[typeof(T2)] = new TypeToGLInfoCache(VertexAttribPointerType.Float, 3); + InfoCache[typeof(T2)] = new TypeToGLInfoCache(vapt, componentCount); } - static BufferHelper() { Add<byte>(VertexAttribPointerType.Byte, 1); Add<sbyte>(VertexAttribPointerType.UnsignedByte, 1); From 9c6b1df75a3ffcc05c2e97fc53089dca847e971c Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Fri, 13 Nov 2020 11:55:49 +0200 Subject: [PATCH 36/52] Release 2.0.0-pre.4 --- RELEASE_NOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 8709b1a..1a7cc5e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,9 @@ +### 2.0.0-pre.4 + * Fix component count error in buffers. + ### 2.0.0-pre.3 * Fix labelling error. + ### 2.0.0-pre.2 * Fix error in shader compiler. * Add support for indexed vertex arrays. From 8036c46aa04dc90f6b5145c665736e75d3dbab64 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:01:47 +0200 Subject: [PATCH 37/52] Add texture config --- src/ObjectTK.Core/TextureConfig.cs | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/ObjectTK.Core/TextureConfig.cs diff --git a/src/ObjectTK.Core/TextureConfig.cs b/src/ObjectTK.Core/TextureConfig.cs new file mode 100644 index 0000000..894f4bd --- /dev/null +++ b/src/ObjectTK.Core/TextureConfig.cs @@ -0,0 +1,54 @@ +using System; +using System.ComponentModel; +using JetBrains.Annotations; +using OpenTK.Graphics.OpenGL; + +namespace ObjectTK { + + public class TextureConfig { + + public TextureMagFilter MagFilter { get; set; } = TextureMagFilter.Linear; + public TextureMinFilter MinFilter { get; set; } = TextureMinFilter.LinearMipmapNearest; + + /// The format the OpenGL stores this texture data in, internally. + /// By default, this is an RGBA 8BPP (8 bits per pixel) format. + public PixelInternalFormat InternalFormat { get; set; } = PixelInternalFormat.Rgba; + + /// The format of the data used to create this texture. + public PixelFormat PixelFormat { get; set; } = PixelFormat.Bgra; + /// The data type of each pixel's channel used to create this texture. + public PixelType PixelType { get; set; } = PixelType.UnsignedByte; + + /// If mipmaps should be generated for this texture (if applicable). + public bool GenerateMipmaps { get; set; } = true; + + // Hide the default members of this object for a cleaner API. + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + public new Type GetType() { + return base.GetType(); + } + } + +} From ed5e448d028eca87bf865bdf0b0db6107b1f6d21 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:01:59 +0200 Subject: [PATCH 38/52] Add texture factory --- src/ObjectTK.Core/GLFactory.cs | 57 +++++++++++++++++++++--- src/ObjectTK.Core/GLObjects/Textures.cs | 58 ++++++++++++------------- 2 files changed, 78 insertions(+), 37 deletions(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index c152d3d..0fe21ac 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -23,7 +23,6 @@ public ShaderProgram VertexFrag(string name, string vertexSource, string fragSou } // Hide the default members of this object for a cleaner API. - [EditorBrowsable(EditorBrowsableState.Never)] public override bool Equals(object obj) { @@ -50,7 +49,56 @@ public override string ToString() public new Type GetType() { return base.GetType(); } + } + + + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLTextureFactory { + public static GLTextureFactory Instance { get; } = new GLTextureFactory(); + private GLTextureFactory() { } + + /// Creates a texture from a raw pointer. + /// This is typically used for creation from a bitmap. + [NotNull] + [MustUseReturnValue] + public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, int height, IntPtr data) { + var t = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2D, t); + GL.TexImage2D(TextureTarget.Texture2D, 0,cfg.InternalFormat, width, height, 0, cfg.PixelFormat, cfg.PixelType, data); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) cfg.MagFilter); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) cfg.MinFilter); + GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, name.Length, name); + GL.BindTexture(TextureTarget.Texture2D, 0); + return new Texture2D(t, name, cfg.InternalFormat, width, height); + } + + // Hide the default members of this object for a cleaner API. + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + public new Type GetType() { + return base.GetType(); + } } [EditorBrowsable(EditorBrowsableState.Advanced)] @@ -104,10 +152,8 @@ public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsage GL.BindBuffer(BufferTarget.ArrayBuffer, 0); return new Buffer<T>(name, vbo, vertices.Length); } - } - [EditorBrowsable(EditorBrowsableState.Advanced)] public sealed class GLVertexArrayFactory { public static GLVertexArrayFactory Instance { get; } = new GLVertexArrayFactory(); @@ -157,8 +203,6 @@ public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] } #endif - - var vao = GL.GenVertexArray(); var label = $"VertexArray: {name}"; GL.BindVertexArray(vao); @@ -199,8 +243,7 @@ public static class GLFactory { public static readonly GLShaderFactory Shader = GLShaderFactory.Instance; public static readonly GLBufferFactory Buffer = GLBufferFactory.Instance; public static readonly GLVertexArrayFactory VertexArray = GLVertexArrayFactory.Instance; - + public static readonly GLTextureFactory Texture = GLTextureFactory.Instance; } - } diff --git a/src/ObjectTK.Core/GLObjects/Textures.cs b/src/ObjectTK.Core/GLObjects/Textures.cs index e743368..2015524 100644 --- a/src/ObjectTK.Core/GLObjects/Textures.cs +++ b/src/ObjectTK.Core/GLObjects/Textures.cs @@ -5,17 +5,17 @@ public interface ITexture { int Handle { get; } string Name { get; set; } TextureTarget TextureTarget { get; } - SizedInternalFormat InternalFormat { get; set; } + PixelInternalFormat InternalFormat { get; set; } } public sealed class Texture1D : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture1D; public int Width { get; set; } public int MipLevels { get; set; } - public Texture1D(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int MipLevels) { + public Texture1D(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int MipLevels) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -28,30 +28,28 @@ public Texture1D(int Handle, string Name, SizedInternalFormat InternalFormat, in public sealed class Texture2D : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2D; + public PixelInternalFormat InternalFormat { get; set; } public int Width { get; set; } public int Height { get; set; } - public int MipLevels { get; set; } - public Texture2D(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Height = Height; - this.MipLevels = MipLevels; + public Texture2D(int handle, string name, PixelInternalFormat internalFormat, int width, int height) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + Height = height; } } public sealed class Texture1DArray : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture1DArray; public int Width { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture1DArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Layers, int MipLevels) { + public Texture1DArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Layers, int MipLevels) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -64,13 +62,13 @@ public Texture1DArray(int Handle, string Name, SizedInternalFormat InternalForma public sealed class Texture2DArray : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2DArray; public int Width { get; set; } public int Height { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture2DArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { + public Texture2DArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -84,13 +82,13 @@ public Texture2DArray(int Handle, string Name, SizedInternalFormat InternalForma public sealed class Texture2DMultisample : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2DMultisample; public int Width { get; set; } public int Height { get; set; } public int Samples { get; set; } public bool FixedSampleLocations { get; set; } - public Texture2DMultisample(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) { + public Texture2DMultisample(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -104,14 +102,14 @@ public Texture2DMultisample(int Handle, string Name, SizedInternalFormat Interna public sealed class Texture2DMultisampleArray : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2DMultisampleArray; public int Width { get; set; } public int Height { get; set; } public int Samples { get; set; } public bool FixedSampleLocations { get; set; } public int Layers { get; set; } - public Texture2DMultisampleArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int Samples, bool FixedSampleLocations) { + public Texture2DMultisampleArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Layers, int Samples, bool FixedSampleLocations) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -126,11 +124,11 @@ public Texture2DMultisampleArray(int Handle, string Name, SizedInternalFormat In public sealed class TextureRectangle : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureRectangle; public int Width { get; set; } public int Height { get; set; } - public TextureRectangle(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height) { + public TextureRectangle(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -142,11 +140,11 @@ public TextureRectangle(int Handle, string Name, SizedInternalFormat InternalFor public sealed class TextureCubeMap : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureCubeMap; public int Size { get; set; } public int MipLevels { get; set; } - public TextureCubeMap(int Handle, string Name, SizedInternalFormat InternalFormat, int Size, int MipLevels) { + public TextureCubeMap(int Handle, string Name, PixelInternalFormat InternalFormat, int Size, int MipLevels) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -158,12 +156,12 @@ public TextureCubeMap(int Handle, string Name, SizedInternalFormat InternalForma public sealed class TextureCubeMapArray : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureCubeMapArray; public int Size { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public TextureCubeMapArray(int Handle, string Name, SizedInternalFormat InternalFormat, int Size, int Layers, int MipLevels) { + public TextureCubeMapArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Size, int Layers, int MipLevels) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; @@ -176,10 +174,10 @@ public TextureCubeMapArray(int Handle, string Name, SizedInternalFormat Internal public sealed class TextureBuffer : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureBuffer; //TODO: I don't know much about this texture type - public TextureBuffer(int Handle, string Name, SizedInternalFormat InternalFormat) { + public TextureBuffer(int Handle, string Name, PixelInternalFormat InternalFormat) { this.Handle = Handle; this.InternalFormat = InternalFormat; } @@ -188,13 +186,13 @@ public TextureBuffer(int Handle, string Name, SizedInternalFormat InternalFormat public sealed class Texture3D : ITexture { public int Handle { get; } public string Name { get; set; } - public SizedInternalFormat InternalFormat { get; set; } + public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture3D; public int Width { get; set; } public int Height { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture3D(int Handle, string Name, SizedInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { + public Texture3D(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { this.Handle = Handle; this.Name = Name; this.InternalFormat = InternalFormat; From abcdc9f7e5e5983ec2f3a2d37c79ede241f9af7c Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:02:06 +0200 Subject: [PATCH 39/52] Add zoom to camera --- src/ObjectTK.2D/Camera2D.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ObjectTK.2D/Camera2D.cs b/src/ObjectTK.2D/Camera2D.cs index 5eaa40a..9d24c1f 100644 --- a/src/ObjectTK.2D/Camera2D.cs +++ b/src/ObjectTK.2D/Camera2D.cs @@ -1,3 +1,4 @@ +using JetBrains.Annotations; using OpenTK.Mathematics; namespace ObjectTK._2D { @@ -37,5 +38,13 @@ public float Rotation { public Matrix4 View => Matrix4.CreateRotationZ(Rotation) * Matrix4.CreateTranslation(Position.X, Position.Y, -10); public Matrix4 ViewProjection => View * Projection; + + /// 'Zooms in' the camera by a percentage by manipulating the VerticalSize relative to its current value. + /// Zoom delta is expressed in percent: + /// 1.0 = 1%. + /// 100.0 = 100% Zoom. + public void ZoomIn([NotNull] float zoomDelta) { + VerticalSize += zoomDelta * VerticalSize / 100.0f; + } } } From b5164d6bee7eb83c5b18b069fa9ed8d3c15bdfcc Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:02:50 +0200 Subject: [PATCH 40/52] Release 2.0.0-pre.5 --- RELEASE_NOTES.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 1a7cc5e..6dff633 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,8 @@ +### 2.0.0-pre.5 + * Add textures to GLFactory + TextureConfig + * Add Zoom functionality to Camera2D + + ### 2.0.0-pre.4 * Fix component count error in buffers. From 5c32c3927380501ade35dfdce0e3eb7bf7bf548e Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:04:38 +0200 Subject: [PATCH 41/52] Add aspectRatio to texture --- src/ObjectTK.Core/GLObjects/Textures.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ObjectTK.Core/GLObjects/Textures.cs b/src/ObjectTK.Core/GLObjects/Textures.cs index 2015524..fb45d49 100644 --- a/src/ObjectTK.Core/GLObjects/Textures.cs +++ b/src/ObjectTK.Core/GLObjects/Textures.cs @@ -32,6 +32,10 @@ public sealed class Texture2D : ITexture { public PixelInternalFormat InternalFormat { get; set; } public int Width { get; set; } public int Height { get; set; } + + /// The ratio of Width/Height + public float AspectRatio => (float) Width / Height; + public Texture2D(int handle, string name, PixelInternalFormat internalFormat, int width, int height) { Handle = handle; Name = name; From 62e10dca4141ab5d1bc972029de0c9d1ed7d62f5 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:27:53 +0200 Subject: [PATCH 42/52] Add copy/default API to texture config --- src/ObjectTK.Core/TextureConfig.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ObjectTK.Core/TextureConfig.cs b/src/ObjectTK.Core/TextureConfig.cs index 894f4bd..574cbaf 100644 --- a/src/ObjectTK.Core/TextureConfig.cs +++ b/src/ObjectTK.Core/TextureConfig.cs @@ -5,7 +5,7 @@ namespace ObjectTK { - public class TextureConfig { + public sealed class TextureConfig { public TextureMagFilter MagFilter { get; set; } = TextureMagFilter.Linear; public TextureMinFilter MinFilter { get; set; } = TextureMinFilter.LinearMipmapNearest; @@ -21,6 +21,24 @@ public class TextureConfig { /// If mipmaps should be generated for this texture (if applicable). public bool GenerateMipmaps { get; set; } = true; + + /// The default texture configuration. Should be good for most cases. + [NotNull] + public static TextureConfig Default => new TextureConfig(); + + /// Creates a copy of this <see cref="TextureConfig"/> + [Pure] + [NotNull] + public TextureConfig Copy() { + return new TextureConfig { + GenerateMipmaps = GenerateMipmaps, + InternalFormat = InternalFormat, + MagFilter = MagFilter, + MinFilter = MinFilter, + PixelFormat = PixelFormat, + PixelType = PixelType + }; + } // Hide the default members of this object for a cleaner API. [EditorBrowsable(EditorBrowsableState.Never)] From 282db6a80927f4ca724e2b6da2b88ac09695dd7d Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:28:37 +0200 Subject: [PATCH 43/52] Release 2.0.0-pre.6 --- RELEASE_NOTES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 6dff633..d9362fb 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,6 @@ +### 2.0.0-pre.6 + * Add texture config default object + copy method. + ### 2.0.0-pre.5 * Add textures to GLFactory + TextureConfig * Add Zoom functionality to Camera2D From ccab76002ef784ef8ddbc09a578d84f174f777c8 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:31:42 +0200 Subject: [PATCH 44/52] Fix texture labelling --- src/ObjectTK.Core/GLFactory.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 0fe21ac..6ab2038 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -63,11 +63,12 @@ private GLTextureFactory() { } [MustUseReturnValue] public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, int height, IntPtr data) { var t = GL.GenTexture(); + var label = $"Texture2D: {name}"; GL.BindTexture(TextureTarget.Texture2D, t); GL.TexImage2D(TextureTarget.Texture2D, 0,cfg.InternalFormat, width, height, 0, cfg.PixelFormat, cfg.PixelType, data); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) cfg.MagFilter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) cfg.MinFilter); - GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, name.Length, name); + GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, label.Length, label); GL.BindTexture(TextureTarget.Texture2D, 0); return new Texture2D(t, name, cfg.InternalFormat, width, height); } From 5ab330bb230136da4e06ee07ab2ed3e3b9269689 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 15:32:20 +0200 Subject: [PATCH 45/52] Release 2.0.0-pre.7 --- RELEASE_NOTES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index d9362fb..aac8b9e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,6 @@ +### 2.0.0-pre.7 + * Fix texture labelling + ### 2.0.0-pre.6 * Add texture config default object + copy method. From 4cdf28dcbea7ac3a7b6656411d4f0595edd418cd Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 16:23:50 +0200 Subject: [PATCH 46/52] fix mipmap gen --- src/ObjectTK.Core/GLFactory.cs | 4 ++++ src/ObjectTK.Core/TextureConfig.cs | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 6ab2038..4882ee4 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -69,6 +69,10 @@ public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, i GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) cfg.MagFilter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) cfg.MinFilter); GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, label.Length, label); + if (cfg.GenerateMipmaps) { + GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); + } + GL.BindTexture(TextureTarget.Texture2D, 0); return new Texture2D(t, name, cfg.InternalFormat, width, height); } diff --git a/src/ObjectTK.Core/TextureConfig.cs b/src/ObjectTK.Core/TextureConfig.cs index 574cbaf..a43cf8f 100644 --- a/src/ObjectTK.Core/TextureConfig.cs +++ b/src/ObjectTK.Core/TextureConfig.cs @@ -19,7 +19,8 @@ public sealed class TextureConfig { /// The data type of each pixel's channel used to create this texture. public PixelType PixelType { get; set; } = PixelType.UnsignedByte; - /// If mipmaps should be generated for this texture (if applicable). + /// If mipmaps should be generated for this texture. + /// You almost certainly want this to be on. public bool GenerateMipmaps { get; set; } = true; /// The default texture configuration. Should be good for most cases. From 2b099ba18c2e2782c76466ca09f241144847ea6c Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 21 Nov 2020 16:24:18 +0200 Subject: [PATCH 47/52] Release 2.0.0-pre.8 --- RELEASE_NOTES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index aac8b9e..cceaf6a 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,6 @@ +### 2.0.0-pre.8 + * Fix mipmap generation + ### 2.0.0-pre.7 * Fix texture labelling From 87023a62c0bb906248927451cd9ffad84419aebc Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 28 Nov 2020 20:05:21 +0200 Subject: [PATCH 48/52] Formatting + convenience --- src/Examples/Examples/HelloTriangle.cs | 1 + src/ObjectTK.Core/GLFactory.cs | 16 +- src/ObjectTK.Core/GLObjects/ShaderProgram.cs | 1 - src/ObjectTK.Core/GLObjects/Textures.cs | 157 +++++++++--------- src/ObjectTK.Core/ObjectTK.Core.csproj | 1 + src/ObjectTK.Core/TextureConfig.cs | 4 + .../Buffers/VertexArrayExtensions.cs | 12 +- 7 files changed, 108 insertions(+), 84 deletions(-) diff --git a/src/Examples/Examples/HelloTriangle.cs b/src/Examples/Examples/HelloTriangle.cs index e7c39c0..d2ec1b5 100644 --- a/src/Examples/Examples/HelloTriangle.cs +++ b/src/Examples/Examples/HelloTriangle.cs @@ -72,6 +72,7 @@ protected override void OnLoad() { _positionsVbo = GLFactory.Buffer.ArrayBuffer("Positions", positions); _colorsVbo = GLFactory.Buffer.ArrayBuffer("Colors", colors); _vao = GLFactory.VertexArray.FromBuffers("Triangle", _positionsVbo, _colorsVbo); + } protected override void OnRenderFrame(FrameEventArgs e) { diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 4882ee4..8427e00 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -1,5 +1,7 @@ using System; using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; using JetBrains.Annotations; using ObjectTK.GLObjects; using ObjectTK.Internal; @@ -65,9 +67,11 @@ public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, i var t = GL.GenTexture(); var label = $"Texture2D: {name}"; GL.BindTexture(TextureTarget.Texture2D, t); - GL.TexImage2D(TextureTarget.Texture2D, 0,cfg.InternalFormat, width, height, 0, cfg.PixelFormat, cfg.PixelType, data); + GL.TexImage2D(TextureTarget.Texture2D, 0, cfg.InternalFormat, width, height, 0, cfg.PixelFormat, cfg.PixelType, data); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) cfg.MagFilter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) cfg.MinFilter); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) cfg.WrapS); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) cfg.WrapS); GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, label.Length, label); if (cfg.GenerateMipmaps) { GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); @@ -76,6 +80,16 @@ public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, i GL.BindTexture(TextureTarget.Texture2D, 0); return new Texture2D(t, name, cfg.InternalFormat, width, height); } + + /// Creates a 2D texture from a bitmap. + [NotNull] + [MustUseReturnValue] + public Texture2D FromBitmap([NotNull] string name, [NotNull] TextureConfig cfg, [NotNull] Bitmap bmp) { + var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); + var bitmapData = bmp.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + return Create2D(name, cfg, bmp.Width, bmp.Height, bitmapData.Scan0); + } + // Hide the default members of this object for a cleaner API. [EditorBrowsable(EditorBrowsableState.Never)] diff --git a/src/ObjectTK.Core/GLObjects/ShaderProgram.cs b/src/ObjectTK.Core/GLObjects/ShaderProgram.cs index 00485ef..5ac8c5c 100644 --- a/src/ObjectTK.Core/GLObjects/ShaderProgram.cs +++ b/src/ObjectTK.Core/GLObjects/ShaderProgram.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using ObjectTK.Shaders; namespace ObjectTK.GLObjects { diff --git a/src/ObjectTK.Core/GLObjects/Textures.cs b/src/ObjectTK.Core/GLObjects/Textures.cs index fb45d49..10d7cae 100644 --- a/src/ObjectTK.Core/GLObjects/Textures.cs +++ b/src/ObjectTK.Core/GLObjects/Textures.cs @@ -8,24 +8,23 @@ public interface ITexture { PixelInternalFormat InternalFormat { get; set; } } - public sealed class Texture1D : ITexture { + public class Texture1D : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture1D; public int Width { get; set; } public int MipLevels { get; set; } - public Texture1D(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.MipLevels = MipLevels; + public Texture1D(int handle, string name, PixelInternalFormat internalFormat, int width, int mipLevels) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + MipLevels = mipLevels; } - } - public sealed class Texture2D : ITexture { + public class Texture2D : ITexture { public int Handle { get; } public string Name { get; set; } public TextureTarget TextureTarget => TextureTarget.Texture2D; @@ -45,7 +44,7 @@ public Texture2D(int handle, string name, PixelInternalFormat internalFormat, in } } - public sealed class Texture1DArray : ITexture { + public class Texture1DArray : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } @@ -53,17 +52,17 @@ public sealed class Texture1DArray : ITexture { public int Width { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture1DArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Layers, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Layers = Layers; - this.MipLevels = MipLevels; + public Texture1DArray(int handle, string name, PixelInternalFormat internalFormat, int width, int layers, int mipLevels) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + Layers = layers; + MipLevels = mipLevels; } } - public sealed class Texture2DArray : ITexture { + public class Texture2DArray : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } @@ -72,18 +71,18 @@ public sealed class Texture2DArray : ITexture { public int Height { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture2DArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Height = Height; - this.Layers = Layers; - this.MipLevels = MipLevels; + public Texture2DArray(int handle, string name, PixelInternalFormat internalFormat, int width, int height, int layers, int mipLevels) { + this.Handle = handle; + this.Name = name; + this.InternalFormat = internalFormat; + this.Width = width; + this.Height = height; + this.Layers = layers; + this.MipLevels = mipLevels; } } - public sealed class Texture2DMultisample : ITexture { + public class Texture2DMultisample : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } @@ -92,18 +91,18 @@ public sealed class Texture2DMultisample : ITexture { public int Height { get; set; } public int Samples { get; set; } public bool FixedSampleLocations { get; set; } - public Texture2DMultisample(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Samples, bool FixedSampleLocations) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Height = Height; - this.Samples = Samples; - this.FixedSampleLocations = FixedSampleLocations; + public Texture2DMultisample(int handle, string name, PixelInternalFormat internalFormat, int width, int height, int samples, bool fixedSampleLocations) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + Height = height; + Samples = samples; + FixedSampleLocations = fixedSampleLocations; } } - public sealed class Texture2DMultisampleArray : ITexture { + public class Texture2DMultisampleArray : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } @@ -113,47 +112,47 @@ public sealed class Texture2DMultisampleArray : ITexture { public int Samples { get; set; } public bool FixedSampleLocations { get; set; } public int Layers { get; set; } - public Texture2DMultisampleArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Layers, int Samples, bool FixedSampleLocations) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Height = Height; - this.Layers = Layers; - this.Samples = Samples; - this.FixedSampleLocations = FixedSampleLocations; + public Texture2DMultisampleArray(int handle, string name, PixelInternalFormat internalFormat, int width, int height, int layers, int samples, bool fixedSampleLocations) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + Height = height; + Layers = layers; + Samples = samples; + FixedSampleLocations = fixedSampleLocations; } } - public sealed class TextureRectangle : ITexture { + public class TextureRectangle : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureRectangle; public int Width { get; set; } public int Height { get; set; } - public TextureRectangle(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Height = Height; + public TextureRectangle(int handle, string name, PixelInternalFormat internalFormat, int width, int height) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + Height = height; } } - public sealed class TextureCubeMap : ITexture { + public class TextureCubeMap : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureCubeMap; public int Size { get; set; } public int MipLevels { get; set; } - public TextureCubeMap(int Handle, string Name, PixelInternalFormat InternalFormat, int Size, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Size = Size; - this.MipLevels = MipLevels; + public TextureCubeMap(int handle, string name, PixelInternalFormat internalFormat, int size, int mipLevels) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Size = size; + MipLevels = mipLevels; } } @@ -165,29 +164,29 @@ public sealed class TextureCubeMapArray : ITexture { public int Size { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public TextureCubeMapArray(int Handle, string Name, PixelInternalFormat InternalFormat, int Size, int Layers, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Size = Size; - this.Layers = Layers; - this.MipLevels = MipLevels; + public TextureCubeMapArray(int handle, string name, PixelInternalFormat internalFormat, int size, int layers, int mipLevels) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Size = size; + Layers = layers; + MipLevels = mipLevels; } } - public sealed class TextureBuffer : ITexture { + public class TextureBuffer : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } public TextureTarget TextureTarget => TextureTarget.TextureBuffer; //TODO: I don't know much about this texture type - public TextureBuffer(int Handle, string Name, PixelInternalFormat InternalFormat) { - this.Handle = Handle; - this.InternalFormat = InternalFormat; + public TextureBuffer(int handle, string name, PixelInternalFormat internalFormat) { + Handle = handle; + InternalFormat = internalFormat; } } - public sealed class Texture3D : ITexture { + public class Texture3D : ITexture { public int Handle { get; } public string Name { get; set; } public PixelInternalFormat InternalFormat { get; set; } @@ -196,14 +195,14 @@ public sealed class Texture3D : ITexture { public int Height { get; set; } public int Layers { get; set; } public int MipLevels { get; set; } - public Texture3D(int Handle, string Name, PixelInternalFormat InternalFormat, int Width, int Height, int Layers, int MipLevels) { - this.Handle = Handle; - this.Name = Name; - this.InternalFormat = InternalFormat; - this.Width = Width; - this.Height = Height; - this.Layers = Layers; - this.MipLevels = MipLevels; + public Texture3D(int handle, string name, PixelInternalFormat internalFormat, int width, int height, int layers, int mipLevels) { + Handle = handle; + Name = name; + InternalFormat = internalFormat; + Width = width; + Height = height; + Layers = layers; + MipLevels = mipLevels; } } } diff --git a/src/ObjectTK.Core/ObjectTK.Core.csproj b/src/ObjectTK.Core/ObjectTK.Core.csproj index 5ec1c2c..13e5277 100644 --- a/src/ObjectTK.Core/ObjectTK.Core.csproj +++ b/src/ObjectTK.Core/ObjectTK.Core.csproj @@ -13,6 +13,7 @@ <ItemGroup> <PackageReference Include="JetBrains.Annotations" Version="2020.1.0" /> <PackageReference Include="OpenTK" Version="4.1.0" /> + <PackageReference Include="System.Drawing.Common" Version="5.0.0" /> </ItemGroup> </Project> diff --git a/src/ObjectTK.Core/TextureConfig.cs b/src/ObjectTK.Core/TextureConfig.cs index a43cf8f..c1b2ccf 100644 --- a/src/ObjectTK.Core/TextureConfig.cs +++ b/src/ObjectTK.Core/TextureConfig.cs @@ -10,6 +10,10 @@ public sealed class TextureConfig { public TextureMagFilter MagFilter { get; set; } = TextureMagFilter.Linear; public TextureMinFilter MinFilter { get; set; } = TextureMinFilter.LinearMipmapNearest; + public TextureWrapMode WrapS { get; set; } = TextureWrapMode.Repeat; + public TextureWrapMode WrapT { get; set; } = TextureWrapMode.Repeat; + public TextureWrapMode WrapR { get; set; } = TextureWrapMode.Repeat; + /// The format the OpenGL stores this texture data in, internally. /// By default, this is an RGBA 8BPP (8 bits per pixel) format. public PixelInternalFormat InternalFormat { get; set; } = PixelInternalFormat.Rgba; diff --git a/src/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs b/src/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs index ec51720..535f6d4 100644 --- a/src/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs +++ b/src/ObjectTK.Extensions/Buffers/VertexArrayExtensions.cs @@ -1,12 +1,18 @@ -using ObjectTK.GLObjects; +using JetBrains.Annotations; +using ObjectTK.GLObjects; using OpenTK.Graphics.OpenGL; namespace ObjectTK.Extensions.Buffers { public static class VertexArrayExtensions { - - public static void Bind(this VertexArray vertexArray) { + + + public static void Bind([NotNull] this VertexArray vertexArray) { GL.BindVertexArray(vertexArray.Handle); } + + public static void Unbind([NotNull] this VertexArray vertexArray) { + GL.BindVertexArray(0); + } public static void BindVertexAttribute<T>(this VertexArray vertexArray, ShaderAttributeInfo shaderAttributeInfo, Buffer<T> Buffer) where T : unmanaged { vertexArray.Bind(); From 9ef36c398e6e96b35feaee438b450f5208d1134f Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 28 Nov 2020 20:07:55 +0200 Subject: [PATCH 49/52] Add docs on extension --- src/ObjectTK.Core/GLFactory.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 8427e00..86bbc83 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -254,9 +254,12 @@ public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> inde } } - /// Top-level class responsible for creating all OpenGL objects. - /// ------ - /// Usage: GLFactory.Shader.VertexFrag() + /// Extensible, top-level class responsible for creating all OpenGL objects.<br></br> + /// ------<br></br> + /// Usage: GLFactory.Shader.VertexFrag()<br></br> + /// <br></br> + /// To extend this class, add extension methods to the GLxFactory types, where 'x' is one of the field names.<br></br> + /// e.g. <see cref="GLShaderFactory"/> or <see cref="GLVertexArrayFactory"/> public static class GLFactory { public static readonly GLShaderFactory Shader = GLShaderFactory.Instance; From 58a57a8ed82d34073015784789954a10942dfcaa Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 28 Nov 2020 20:13:17 +0200 Subject: [PATCH 50/52] Factory improvements --- .../Factories/GLBufferFactory.cs | 97 +++++++ .../Factories/GLShaderFactory.cs | 48 ++++ .../Factories/GLTextureFactory.cs | 76 ++++++ .../Factories/GLVertexArrayFactory.cs | 89 ++++++ src/ObjectTK.Core/GLFactory.cs | 255 ------------------ src/ObjectTK.Core/Internal/ListExtensions.cs | 29 ++ 6 files changed, 339 insertions(+), 255 deletions(-) create mode 100644 src/ObjectTK.Core/Factories/GLBufferFactory.cs create mode 100644 src/ObjectTK.Core/Factories/GLShaderFactory.cs create mode 100644 src/ObjectTK.Core/Factories/GLTextureFactory.cs create mode 100644 src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs create mode 100644 src/ObjectTK.Core/Internal/ListExtensions.cs diff --git a/src/ObjectTK.Core/Factories/GLBufferFactory.cs b/src/ObjectTK.Core/Factories/GLBufferFactory.cs new file mode 100644 index 0000000..2098788 --- /dev/null +++ b/src/ObjectTK.Core/Factories/GLBufferFactory.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using JetBrains.Annotations; +using ObjectTK.GLObjects; +using ObjectTK.Internal; +using OpenTK.Graphics.OpenGL; + +// ReSharper disable once CheckNamespace +namespace ObjectTK { + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLBufferFactory { + public static GLBufferFactory Instance { get; } = new GLBufferFactory(); + private GLBufferFactory() { } + + // Hide the default members of this object for a cleaner API. + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + // ReSharper disable once UnusedMember.Global + public new Type GetType() { + return base.GetType(); + } + + + [NotNull] + [MustUseReturnValue] + public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T: unmanaged { + var vbo = GL.GenBuffer(); + var label = $"Buffer: {name}"; + GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); + GL.ObjectLabel(ObjectLabelIdentifier.Buffer, vbo,label.Length, label); + int elemSize; + unsafe { + elemSize = sizeof(T); + } + GL.BufferData(BufferTarget.ArrayBuffer, elemSize * vertices.Length, vertices, usageHint); + GL.BindBuffer(BufferTarget.ArrayBuffer, 0); + return new Buffer<T>(name, vbo, vertices.Length); + } + + /// Creates an array buffer from a List. + /// This does not perform any memory copy or allocation, as this directly accesses the internal array used by the list. + /// This has identical performance to the T[] overloads. + [Pure] + [MustUseReturnValue] + public Buffer<T> ArrayBuffer<T>(string name, List<T> list, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T : unmanaged { + var arr = list.GetInternalArray(); + return ArrayBuffer(name, arr, usageHint); + } + + /// Creates an array buffer from a List. This matches against the type, trying to find a number of fast-path options.<br></br> + /// If those fast-paths are found, then this does not perform any memory copy or allocation as this directly accesses the internal array used by the list. + /// In this case, this has identical performance to the T[] overloads.<br></br> + /// Supported fast-paths are:<br></br> + /// T[]<br></br> + /// List<T><br></br> + [NotNull] + [MustUseReturnValue] + public Buffer<T> ArrayBuffer<T>(string name, IReadOnlyList<T> list, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T : unmanaged { + if (list is T[] arr) { + return ArrayBuffer(name, arr, usageHint); + } + + if (list is List<T> resizeArr) { + return ArrayBuffer(name, resizeArr, usageHint); + } + // slow path, but whatever: + var copy = new T[list.Count]; + for (var i = 0; i < list.Count; i++) { + copy[i] = list[i]; + } + return ArrayBuffer(name, copy, usageHint); + } + } +} diff --git a/src/ObjectTK.Core/Factories/GLShaderFactory.cs b/src/ObjectTK.Core/Factories/GLShaderFactory.cs new file mode 100644 index 0000000..3ecab4f --- /dev/null +++ b/src/ObjectTK.Core/Factories/GLShaderFactory.cs @@ -0,0 +1,48 @@ +using System; +using System.ComponentModel; +using JetBrains.Annotations; +using ObjectTK.GLObjects; +using ObjectTK.Shaders; + +// ReSharper disable once CheckNamespace +namespace ObjectTK { + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLShaderFactory { + public static GLShaderFactory Instance { get; } = new GLShaderFactory(); + private GLShaderFactory() { } + + [MustUseReturnValue] + [NotNull] + public ShaderProgram VertexFrag(string name, string vertexSource, string fragSource) { + return ShaderCompiler.VertexFrag(name, vertexSource, fragSource); + } + + // Hide the default members of this object for a cleaner API. + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + public new Type GetType() { + return base.GetType(); + } + } +} diff --git a/src/ObjectTK.Core/Factories/GLTextureFactory.cs b/src/ObjectTK.Core/Factories/GLTextureFactory.cs new file mode 100644 index 0000000..fb10e9d --- /dev/null +++ b/src/ObjectTK.Core/Factories/GLTextureFactory.cs @@ -0,0 +1,76 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using JetBrains.Annotations; +using ObjectTK.GLObjects; +using OpenTK.Graphics.OpenGL; + +// ReSharper disable once CheckNamespace +namespace ObjectTK { + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLTextureFactory { + public static GLTextureFactory Instance { get; } = new GLTextureFactory(); + private GLTextureFactory() { } + + /// Creates a texture from a raw pointer. + /// This is typically used for creation from a bitmap. + [NotNull] + [MustUseReturnValue] + public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, int height, IntPtr data) { + var t = GL.GenTexture(); + var label = $"Texture2D: {name}"; + GL.BindTexture(TextureTarget.Texture2D, t); + GL.TexImage2D(TextureTarget.Texture2D, 0, cfg.InternalFormat, width, height, 0, cfg.PixelFormat, cfg.PixelType, data); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) cfg.MagFilter); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) cfg.MinFilter); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) cfg.WrapS); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) cfg.WrapS); + GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, label.Length, label); + if (cfg.GenerateMipmaps) { + GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); + } + + GL.BindTexture(TextureTarget.Texture2D, 0); + return new Texture2D(t, name, cfg.InternalFormat, width, height); + } + + /// Creates a 2D texture from a bitmap. + [NotNull] + [MustUseReturnValue] + public Texture2D FromBitmap([NotNull] string name, [NotNull] TextureConfig cfg, [NotNull] Bitmap bmp) { + var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); + var bitmapData = bmp.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + return Create2D(name, cfg, bmp.Width, bmp.Height, bitmapData.Scan0); + } + + + // Hide the default members of this object for a cleaner API. + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + public new Type GetType() { + return base.GetType(); + } + } +} diff --git a/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs b/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs new file mode 100644 index 0000000..b2b47e7 --- /dev/null +++ b/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs @@ -0,0 +1,89 @@ +using System; +using System.ComponentModel; +using JetBrains.Annotations; +using ObjectTK.GLObjects; +using OpenTK.Graphics.OpenGL; +using Buffer = ObjectTK.GLObjects.Buffer; + +// ReSharper disable once CheckNamespace +namespace ObjectTK { + [EditorBrowsable(EditorBrowsableState.Advanced)] + public sealed class GLVertexArrayFactory { + public static GLVertexArrayFactory Instance { get; } = new GLVertexArrayFactory(); + private GLVertexArrayFactory() { } + + // Hide the default members of this object for a cleaner API. + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) + { + // ReSharper disable once BaseObjectEqualsIsObjectEquals + return base.Equals(obj); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() + { + // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode + return base.GetHashCode(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + // ReSharper disable once AnnotateCanBeNullTypeMember + public override string ToString() + { + return base.ToString(); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + [NotNull] + // ReSharper disable once UnusedMember.Global + public new Type GetType() { + return base.GetType(); + } + + [NotNull] + [MustUseReturnValue] + public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] buffers) { + var length = buffers[0].ElementCount; + #if DEBUG + for (int i = 0; i < buffers.Length; i++) { + var b = buffers[i]; + if (b.ElementCount != length) { + throw new ArgumentException($"The provided buffers must have the same number of elements.\n" + + $"The buffer {b.Name} with length {b.ElementCount} did not match the expected length of {length}"); + } + } + #endif + + var vao = GL.GenVertexArray(); + var label = $"VertexArray: {name}"; + GL.BindVertexArray(vao); + GL.ObjectLabel(ObjectLabelIdentifier.VertexArray,vao, name.Length, label); + for (int i = 0; i < buffers.Length; i++) { + var buffer = buffers[i]; + GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Handle); + GL.EnableVertexAttribArray(i); + GL.VertexAttribPointer(i, buffer.ComponentCount, buffer.AttribType, false, buffer.ElementSize,0); + } + // clean up: + GL.BindBuffer(BufferTarget.ArrayBuffer, 0); + GL.BindVertexArray(0); + + return new VertexArray(name, vao, length, false); + } + + /// Creates a vertex array from the + [Pure] + [NotNull] + public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> indexBuffer, params Buffer[] vertexBuffers) { + var b = FromBuffers(name, vertexBuffers); + GL.BindVertexArray(b.Handle); + GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer.Handle); + GL.BindVertexArray(0); + b.ElementCount = indexBuffer.ElementCount; + b.HasElementArrayBuffer = true; + return b; + } + } +} diff --git a/src/ObjectTK.Core/GLFactory.cs b/src/ObjectTK.Core/GLFactory.cs index 86bbc83..1921689 100644 --- a/src/ObjectTK.Core/GLFactory.cs +++ b/src/ObjectTK.Core/GLFactory.cs @@ -1,259 +1,4 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Imaging; -using JetBrains.Annotations; -using ObjectTK.GLObjects; -using ObjectTK.Internal; -using ObjectTK.Shaders; -using OpenTK.Graphics.OpenGL; -using Buffer = ObjectTK.GLObjects.Buffer; - namespace ObjectTK { - - namespace Internal { - - [EditorBrowsable(EditorBrowsableState.Advanced)] - public sealed class GLShaderFactory { - public static GLShaderFactory Instance { get; } = new GLShaderFactory(); - private GLShaderFactory() { } - - [MustUseReturnValue] - [NotNull] - public ShaderProgram VertexFrag(string name, string vertexSource, string fragSource) { - return ShaderCompiler.VertexFrag(name, vertexSource, fragSource); - } - - // Hide the default members of this object for a cleaner API. - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) - { - // ReSharper disable once BaseObjectEqualsIsObjectEquals - return base.Equals(obj); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() - { - // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode - return base.GetHashCode(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - // ReSharper disable once AnnotateCanBeNullTypeMember - public override string ToString() - { - return base.ToString(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - [NotNull] - public new Type GetType() { - return base.GetType(); - } - } - - - [EditorBrowsable(EditorBrowsableState.Advanced)] - public sealed class GLTextureFactory { - public static GLTextureFactory Instance { get; } = new GLTextureFactory(); - private GLTextureFactory() { } - - /// Creates a texture from a raw pointer. - /// This is typically used for creation from a bitmap. - [NotNull] - [MustUseReturnValue] - public Texture2D Create2D(string name, [NotNull] TextureConfig cfg, int width, int height, IntPtr data) { - var t = GL.GenTexture(); - var label = $"Texture2D: {name}"; - GL.BindTexture(TextureTarget.Texture2D, t); - GL.TexImage2D(TextureTarget.Texture2D, 0, cfg.InternalFormat, width, height, 0, cfg.PixelFormat, cfg.PixelType, data); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) cfg.MagFilter); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) cfg.MinFilter); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) cfg.WrapS); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) cfg.WrapS); - GL.ObjectLabel(ObjectLabelIdentifier.Texture, t, label.Length, label); - if (cfg.GenerateMipmaps) { - GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); - } - - GL.BindTexture(TextureTarget.Texture2D, 0); - return new Texture2D(t, name, cfg.InternalFormat, width, height); - } - - /// Creates a 2D texture from a bitmap. - [NotNull] - [MustUseReturnValue] - public Texture2D FromBitmap([NotNull] string name, [NotNull] TextureConfig cfg, [NotNull] Bitmap bmp) { - var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); - var bitmapData = bmp.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - return Create2D(name, cfg, bmp.Width, bmp.Height, bitmapData.Scan0); - } - - - // Hide the default members of this object for a cleaner API. - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) - { - // ReSharper disable once BaseObjectEqualsIsObjectEquals - return base.Equals(obj); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() - { - // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode - return base.GetHashCode(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - // ReSharper disable once AnnotateCanBeNullTypeMember - public override string ToString() - { - return base.ToString(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - [NotNull] - public new Type GetType() { - return base.GetType(); - } - } - - [EditorBrowsable(EditorBrowsableState.Advanced)] - public sealed class GLBufferFactory { - public static GLBufferFactory Instance { get; } = new GLBufferFactory(); - private GLBufferFactory() { } - - // Hide the default members of this object for a cleaner API. - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) - { - // ReSharper disable once BaseObjectEqualsIsObjectEquals - return base.Equals(obj); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() - { - // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode - return base.GetHashCode(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - // ReSharper disable once AnnotateCanBeNullTypeMember - public override string ToString() - { - return base.ToString(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - [NotNull] - // ReSharper disable once UnusedMember.Global - public new Type GetType() { - return base.GetType(); - } - - - [NotNull] - [MustUseReturnValue] - public Buffer<T> ArrayBuffer<T>(string name, [NotNull] T[] vertices, BufferUsageHint usageHint = BufferUsageHint.StaticDraw) where T: unmanaged { - var vbo = GL.GenBuffer(); - var label = $"Buffer: {name}"; - GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); - GL.ObjectLabel(ObjectLabelIdentifier.Buffer, vbo,label.Length, label); - int elemSize; - unsafe { - elemSize = sizeof(T); - } - GL.BufferData(BufferTarget.ArrayBuffer, elemSize * vertices.Length, vertices, usageHint); - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - return new Buffer<T>(name, vbo, vertices.Length); - } - } - - [EditorBrowsable(EditorBrowsableState.Advanced)] - public sealed class GLVertexArrayFactory { - public static GLVertexArrayFactory Instance { get; } = new GLVertexArrayFactory(); - private GLVertexArrayFactory() { } - - // Hide the default members of this object for a cleaner API. - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) - { - // ReSharper disable once BaseObjectEqualsIsObjectEquals - return base.Equals(obj); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() - { - // ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode - return base.GetHashCode(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - // ReSharper disable once AnnotateCanBeNullTypeMember - public override string ToString() - { - return base.ToString(); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - [NotNull] - // ReSharper disable once UnusedMember.Global - public new Type GetType() { - return base.GetType(); - } - - [NotNull] - [MustUseReturnValue] - public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] buffers) { - var length = buffers[0].ElementCount; - #if DEBUG - for (int i = 0; i < buffers.Length; i++) { - var b = buffers[i]; - if (b.ElementCount != length) { - throw new ArgumentException($"The provided buffers must have the same number of elements.\n" + - $"The buffer {b.Name} with length {b.ElementCount} did not match the expected length of {length}"); - } - } - #endif - - var vao = GL.GenVertexArray(); - var label = $"VertexArray: {name}"; - GL.BindVertexArray(vao); - GL.ObjectLabel(ObjectLabelIdentifier.VertexArray,vao, name.Length, label); - for (int i = 0; i < buffers.Length; i++) { - var buffer = buffers[i]; - GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Handle); - GL.EnableVertexAttribArray(i); - GL.VertexAttribPointer(i, buffer.ComponentCount, buffer.AttribType, false, buffer.ElementSize,0); - } - // clean up: - GL.BindBuffer(BufferTarget.ArrayBuffer, 0); - GL.BindVertexArray(0); - - return new VertexArray(name, vao, length, false); - } - - /// Creates a vertex array from the - [Pure] - [NotNull] - public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> indexBuffer, params Buffer[] vertexBuffers) { - var b = FromBuffers(name, vertexBuffers); - GL.BindVertexArray(b.Handle); - GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer.Handle); - GL.BindVertexArray(0); - b.ElementCount = indexBuffer.ElementCount; - b.HasElementArrayBuffer = true; - return b; - } - } - } - /// Extensible, top-level class responsible for creating all OpenGL objects.<br></br> /// ------<br></br> /// Usage: GLFactory.Shader.VertexFrag()<br></br> diff --git a/src/ObjectTK.Core/Internal/ListExtensions.cs b/src/ObjectTK.Core/Internal/ListExtensions.cs new file mode 100644 index 0000000..54ef20c --- /dev/null +++ b/src/ObjectTK.Core/Internal/ListExtensions.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Reflection.Emit; + +namespace ObjectTK.Internal { + internal static class UnsafeListExtensions { + private static class ArrayAccessor<T> + { + internal static readonly Func<List<T>, T[]> GetUnderlyingArray; + + static ArrayAccessor() + { + var dm = new DynamicMethod("get", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(T[]), new[] { typeof(List<T>) }, typeof(ArrayAccessor<T>), true); + var il = dm.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); // Load List<T> argument + il.Emit(OpCodes.Ldfld, typeof(List<T>).GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance)!); // Replace argument by field + il.Emit(OpCodes.Ret); // Return field + GetUnderlyingArray = (Func<List<T>, T[]>)dm.CreateDelegate(typeof(Func<List<T>, T[]>)); + } + } + + // ReSharper disable once ReturnTypeCanBeEnumerable.Global + internal static T[] GetInternalArray<T>(this List<T> list) + { + return ArrayAccessor<T>.GetUnderlyingArray(list); + } + } +} From 4f1d1ed3b171b36c65b4cc8762f45d4453441924 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 28 Nov 2020 20:19:38 +0200 Subject: [PATCH 51/52] Add buffers to vertex array --- .../Factories/GLVertexArrayFactory.cs | 7 ++-- src/ObjectTK.Core/GLObjects/VertexArray.cs | 39 +++++++++++++++---- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs b/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs index b2b47e7..38d10a7 100644 --- a/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs +++ b/src/ObjectTK.Core/Factories/GLVertexArrayFactory.cs @@ -70,10 +70,10 @@ public VertexArray FromBuffers([NotNull] string name, [NotNull] params Buffer[] GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindVertexArray(0); - return new VertexArray(name, vao, length, false); + return new VertexArray(name, vao, buffers, null); } - /// Creates a vertex array from the + /// Creates a vertex array from the provided index and vertex buffers. [Pure] [NotNull] public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> indexBuffer, params Buffer[] vertexBuffers) { @@ -81,8 +81,7 @@ public VertexArray IndexAndVertexBuffers([NotNull] string name, Buffer<int> inde GL.BindVertexArray(b.Handle); GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer.Handle); GL.BindVertexArray(0); - b.ElementCount = indexBuffer.ElementCount; - b.HasElementArrayBuffer = true; + b.IndexBuffer = indexBuffer; return b; } } diff --git a/src/ObjectTK.Core/GLObjects/VertexArray.cs b/src/ObjectTK.Core/GLObjects/VertexArray.cs index 961cea0..c014335 100644 --- a/src/ObjectTK.Core/GLObjects/VertexArray.cs +++ b/src/ObjectTK.Core/GLObjects/VertexArray.cs @@ -1,23 +1,46 @@ -namespace ObjectTK.GLObjects { +using JetBrains.Annotations; + +namespace ObjectTK.GLObjects { /// An OpenGL Vertex array object. public class VertexArray { /// The name of this object. public string Name { get; } + /// The OpenGL handle. Use this to interact with OpenGL. public int Handle { get; } - /// The number of elements in this VAO. - public int ElementCount { get; set; } + + /// The buffers associated with this vertex array. + [NotNull] + [ItemNotNull] + public Buffer[] Buffers { get; set; } + - /// If this vertex array has an element array buffer (i.e. should be displayed using indexed drawing). - public bool HasElementArrayBuffer { get; set; } + /// The element array buffer for this object. + /// If this is present, the vertex array should be displayed using indexed drawing. + [CanBeNull] + public Buffer IndexBuffer { get; set; } + + + /// The number of elements to draw. If there is an element buffer, this is the length. + /// If there is no element buffer, this is the length of the first buffer in the <see cref="Buffers"/> array. + public int ElementCount { + get + { + if (IndexBuffer != null) { + return IndexBuffer.ElementCount; + } + + return Buffers[0].ElementCount; + } + } - public VertexArray(string name, int handle, int elementCount, bool hasElementArrayBuffer) { + public VertexArray(string name, int handle, [NotNull] Buffer[] buffers, [CanBeNull] Buffer indexBuffer) { Name = name; Handle = handle; - ElementCount = elementCount; - HasElementArrayBuffer = hasElementArrayBuffer; + Buffers = buffers; + IndexBuffer = indexBuffer; } } } From 48232754ce41c3ebd67a73399cae4a2b5b70a5c1 Mon Sep 17 00:00:00 2001 From: varon <varon-github@outlook.com> Date: Sat, 28 Nov 2020 20:21:04 +0200 Subject: [PATCH 52/52] Release 2.0.0-pre.9 --- RELEASE_NOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index cceaf6a..5b9fe34 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,7 @@ +### 2.0.0-pre.9 + * Vertex buffer improvements + * New fast GLFactory.Buffer methods on lists. + ### 2.0.0-pre.8 * Fix mipmap generation