From 4ab3de3bab13c18bc0eed6bac565be3b80ebac10 Mon Sep 17 00:00:00 2001 From: hecks <42101236+hecktest@users.noreply.github.com> Date: Fri, 23 Jul 2021 16:23:44 +0200 Subject: [PATCH] Delete lots of unused features (#48) --- examples/01.HelloWorld/HelloWorld.cbp | 58 - examples/01.HelloWorld/HelloWorld.vcproj | 163 - .../HelloWorld.xcodeproj/project.pbxproj | 290 - .../xcschemes/01.HelloWorld.xcscheme | 91 - .../01.HelloWorld/HelloWorld_vc10.vcxproj | 233 - .../01.HelloWorld/HelloWorld_vc11.vcxproj | 235 - .../01.HelloWorld/HelloWorld_vc12.vcxproj | 235 - .../01.HelloWorld/HelloWorld_vc14.vcxproj | 235 - examples/01.HelloWorld/Makefile | 56 - examples/01.HelloWorld/main.cpp | 269 - examples/01.HelloWorld/tutorial.html | 394 - .../01.HelloWorld_Android/AndroidManifest.xml | 21 - .../01.HelloWorld_Android/android_tools.cpp | 184 - .../01.HelloWorld_Android/android_tools.h | 33 - examples/01.HelloWorld_Android/build.xml | 17 - examples/01.HelloWorld_Android/jni/Android.mk | 50 - .../01.HelloWorld_Android/jni/Application.mk | 2 - examples/01.HelloWorld_Android/main.cpp | 387 - .../01.HelloWorld_Android/project.properties | 1 - examples/01.HelloWorld_Android/readme.txt | 95 - .../res/drawable-hdpi/irr_icon.png | Bin 8103 -> 0 bytes .../res/drawable-ldpi/irr_icon.png | Bin 2890 -> 0 bytes .../res/drawable-mdpi/irr_icon.png | Bin 4678 -> 0 bytes .../res/drawable-xhdpi/irr_icon.png | Bin 13099 -> 0 bytes examples/01.HelloWorld_emscripten/Makefile | 98 - examples/01.HelloWorld_emscripten/main.cpp | 240 - examples/01.HelloWorld_emscripten/readme.txt | 24 - .../shell_minimal.html | 180 - .../AppIcon.appiconset/Contents.json | 68 - .../HelloWorld_iOS.xcodeproj/project.pbxproj | 302 - .../xcschemes/28.HelloWorld_iOS.xcscheme | 91 - examples/01.HelloWorld_iOS/main.cpp | 62 - examples/02.Quake3Map/Makefile | 56 - examples/02.Quake3Map/Quake3Map.cbp | 58 - examples/02.Quake3Map/Quake3Map.vcproj | 162 - .../Quake3Map.xcodeproj/project.pbxproj | 326 - .../xcschemes/02.Quake3Map.xcscheme | 91 - examples/02.Quake3Map/Quake3Map_vc10.vcxproj | 235 - examples/02.Quake3Map/Quake3Map_vc11.vcxproj | 235 - examples/02.Quake3Map/Quake3Map_vc12.vcxproj | 235 - examples/02.Quake3Map/Quake3Map_vc14.vcxproj | 235 - examples/02.Quake3Map/main.cpp | 185 - examples/02.Quake3Map/tutorial.html | 181 - .../03.CustomSceneNode/CustomSceneNode.cbp | 58 - .../03.CustomSceneNode/CustomSceneNode.vcproj | 163 - .../CustomSceneNode.xcodeproj/project.pbxproj | 324 - .../xcschemes/03.CustomSceneNode.xcscheme | 91 - .../CustomSceneNode_vc10.vcxproj | 247 - .../CustomSceneNode_vc11.vcxproj | 247 - .../CustomSceneNode_vc12.vcxproj | 247 - .../CustomSceneNode_vc14.vcxproj | 247 - examples/03.CustomSceneNode/Makefile | 56 - examples/03.CustomSceneNode/main.cpp | 268 - examples/03.CustomSceneNode/tutorial.html | 222 - examples/04.Movement/Makefile | 56 - examples/04.Movement/Movement.cbp | 55 - examples/04.Movement/Movement.vcproj | 163 - .../Movement.xcodeproj/project.pbxproj | 324 - .../xcschemes/04.Movement.xcscheme | 91 - examples/04.Movement/Movement_vc10.vcxproj | 235 - examples/04.Movement/Movement_vc11.vcxproj | 235 - examples/04.Movement/Movement_vc12.vcxproj | 235 - examples/04.Movement/Movement_vc14.vcxproj | 235 - examples/04.Movement/main.cpp | 265 - examples/04.Movement/tutorial.html | 188 - examples/05.UserInterface/Makefile | 56 - examples/05.UserInterface/UserInterface.cbp | 55 - .../05.UserInterface/UserInterface.vcproj | 163 - .../UserInterface.xcodeproj/project.pbxproj | 324 - .../xcschemes/05.UserInterface.xcscheme | 91 - .../UserInterface_vc10.vcxproj | 235 - .../UserInterface_vc11.vcxproj | 235 - .../UserInterface_vc12.vcxproj | 235 - .../UserInterface_vc14.vcxproj | 235 - examples/05.UserInterface/main.cpp | 293 - examples/05.UserInterface/tutorial.html | 225 - examples/06.2DGraphics/2DGraphics.cbp | 55 - examples/06.2DGraphics/2DGraphics.vcproj | 163 - .../2DGraphics.xcodeproj/project.pbxproj | 324 - .../xcschemes/06.2DGraphics.xcscheme | 91 - .../06.2DGraphics/2DGraphics_vc10.vcxproj | 235 - .../06.2DGraphics/2DGraphics_vc11.vcxproj | 235 - .../06.2DGraphics/2DGraphics_vc12.vcxproj | 235 - .../06.2DGraphics/2DGraphics_vc14.vcxproj | 235 - examples/06.2DGraphics/Makefile | 56 - examples/06.2DGraphics/main.cpp | 168 - examples/06.2DGraphics/tutorial.html | 163 - examples/07.Collision/Collision.cbp | 55 - examples/07.Collision/Collision.vcproj | 163 - .../Collision.xcodeproj/project.pbxproj | 324 - .../xcschemes/07.Collision.xcscheme | 91 - examples/07.Collision/Collision_vc10.vcxproj | 235 - examples/07.Collision/Collision_vc11.vcxproj | 235 - examples/07.Collision/Collision_vc12.vcxproj | 235 - examples/07.Collision/Collision_vc14.vcxproj | 235 - examples/07.Collision/Makefile | 56 - examples/07.Collision/main.cpp | 375 - examples/07.Collision/tutorial.html | 308 - examples/08.SpecialFX/Makefile | 56 - examples/08.SpecialFX/SpecialFX.cbp | 54 - examples/08.SpecialFX/SpecialFX.vcproj | 163 - .../SpecialFX.xcodeproj/project.pbxproj | 324 - .../xcschemes/08.SpecialFX.xcscheme | 91 - examples/08.SpecialFX/SpecialFX_vc10.vcxproj | 235 - examples/08.SpecialFX/SpecialFX_vc11.vcxproj | 235 - examples/08.SpecialFX/SpecialFX_vc12.vcxproj | 235 - examples/08.SpecialFX/SpecialFX_vc14.vcxproj | 235 - examples/08.SpecialFX/main.cpp | 326 - examples/08.SpecialFX/project.properties | 14 - examples/08.SpecialFX/tutorial.html | 278 - examples/09.Meshviewer/9.Meshviewer.rc | 84 - examples/09.Meshviewer/Makefile | 56 - examples/09.Meshviewer/Meshviewer.cbp | 55 - examples/09.Meshviewer/Meshviewer.vcproj | 163 - .../Meshviewer.xcodeproj/project.pbxproj | 324 - .../xcschemes/09.Meshviewer.xcscheme | 91 - .../09.Meshviewer/Meshviewer_vc10.vcxproj | 235 - .../09.Meshviewer/Meshviewer_vc11.vcxproj | 235 - .../09.Meshviewer/Meshviewer_vc12.vcxproj | 235 - .../09.Meshviewer/Meshviewer_vc14.vcxproj | 235 - examples/09.Meshviewer/icon.ico | Bin 2238 -> 0 bytes examples/09.Meshviewer/main.cpp | 994 - examples/09.Meshviewer/resource.h | 16 - examples/09.Meshviewer/tutorial.html | 182 - examples/10.Shaders/Makefile | 56 - examples/10.Shaders/Shaders.cbp | 56 - examples/10.Shaders/Shaders.vcproj | 163 - .../Shaders.xcodeproj/project.pbxproj | 324 - .../xcschemes/10.Shaders.xcscheme | 91 - examples/10.Shaders/Shaders_vc10.vcxproj | 235 - examples/10.Shaders/Shaders_vc11.vcxproj | 235 - examples/10.Shaders/Shaders_vc12.vcxproj | 235 - examples/10.Shaders/Shaders_vc14.vcxproj | 235 - examples/10.Shaders/main.cpp | 466 - examples/10.Shaders/tutorial.html | 566 - examples/11.PerPixelLighting/Makefile | 56 - .../11.PerPixelLighting/PerPixelLighting.cbp | 56 - .../PerPixelLighting.vcproj | 163 - .../project.pbxproj | 324 - .../xcschemes/11.PerPixelLighting.xcscheme | 91 - .../PerPixelLighting_vc10.vcxproj | 235 - .../PerPixelLighting_vc11.vcxproj | 235 - .../PerPixelLighting_vc12.vcxproj | 235 - .../PerPixelLighting_vc14.vcxproj | 235 - examples/11.PerPixelLighting/main.cpp | 483 - examples/11.PerPixelLighting/tutorial.html | 502 - examples/12.TerrainRendering/Makefile | 56 - .../12.TerrainRendering/TerrainRendering.cbp | 56 - .../TerrainRendering.vcproj | 163 - .../project.pbxproj | 324 - .../xcschemes/12.TerrainRendering.xcscheme | 91 - .../TerrainRendering_vc10.vcxproj | 235 - .../TerrainRendering_vc11.vcxproj | 235 - .../TerrainRendering_vc12.vcxproj | 235 - .../TerrainRendering_vc14.vcxproj | 235 - examples/12.TerrainRendering/main.cpp | 287 - examples/12.TerrainRendering/tutorial.html | 122 - examples/13.RenderToTexture/Makefile | 56 - .../13.RenderToTexture/RenderToTexture.cbp | 55 - .../13.RenderToTexture/RenderToTexture.vcproj | 163 - .../RenderToTexture.xcodeproj/project.pbxproj | 324 - .../xcschemes/13.RenderToTexture.xcscheme | 91 - .../RenderToTexture_vc10.vcxproj | 235 - .../RenderToTexture_vc11.vcxproj | 235 - .../RenderToTexture_vc12.vcxproj | 235 - .../RenderToTexture_vc14.vcxproj | 235 - examples/13.RenderToTexture/main.cpp | 229 - examples/13.RenderToTexture/tutorial.html | 244 - .../13.RenderToTexture_emscripten/Makefile | 74 - .../13.RenderToTexture_emscripten/main.cpp | 172 - examples/14.Win32Window/Makefile | 56 - examples/14.Win32Window/Win32Window.cbp | 43 - examples/14.Win32Window/Win32Window.vcproj | 165 - .../14.Win32Window/Win32Window_vc10.vcxproj | 239 - .../14.Win32Window/Win32Window_vc11.vcxproj | 239 - .../14.Win32Window/Win32Window_vc12.vcxproj | 239 - .../14.Win32Window/Win32Window_vc14.vcxproj | 239 - examples/14.Win32Window/main.cpp | 263 - examples/14.Win32Window/tutorial.html | 247 - examples/16.Quake3MapShader/Makefile | 56 - .../16.Quake3MapShader/Quake3MapShader.cbp | 56 - .../16.Quake3MapShader/Quake3MapShader.vcproj | 133 - .../Quake3MapShader.xcodeproj/project.pbxproj | 324 - .../xcschemes/16.Quake3MapShader.xcscheme | 91 - .../Quake3MapShader_vc10.vcxproj | 194 - .../Quake3MapShader_vc11.vcxproj | 194 - .../Quake3MapShader_vc12.vcxproj | 194 - .../Quake3MapShader_vc14.vcxproj | 194 - examples/16.Quake3MapShader/main.cpp | 393 - ...loWorld for Windows Mobile on PC_v8.vcproj | 185 - ...loWorld for Windows Mobile on PC_v9.vcproj | 184 - ...orld for Windows Mobile on PC_vc10.vcxproj | 180 - ...orld for Windows Mobile on PC_vc11.vcxproj | 180 - ...orld for Windows Mobile on PC_vc12.vcxproj | 180 - .../HelloWorld_mobile.sln | 33 - .../HelloWorld_mobile.vcproj | 198 - examples/17.HelloWorld_Mobile/Makefile | 39 - examples/17.HelloWorld_Mobile/main.cpp | 497 - examples/18.SplitScreen/Makefile | 56 - examples/18.SplitScreen/SplitScreen.cbp | 55 - examples/18.SplitScreen/SplitScreen.vcproj | 132 - .../SplitScreen.xcodeproj/project.pbxproj | 324 - .../xcschemes/18.SplitScreen.xcscheme | 91 - .../18.SplitScreen/SplitScreen_vc10.vcxproj | 193 - .../18.SplitScreen/SplitScreen_vc11.vcxproj | 194 - .../18.SplitScreen/SplitScreen_vc12.vcxproj | 194 - .../18.SplitScreen/SplitScreen_vc14.vcxproj | 194 - examples/18.SplitScreen/main.cpp | 247 - examples/19.MouseAndJoystick/Makefile | 56 - .../19.MouseAndJoystick/MouseAndJoystick.cbp | 56 - .../MouseAndJoystick.vcproj | 162 - .../project.pbxproj | 324 - .../xcschemes/19.MouseAndJoystick.xcscheme | 91 - .../MouseAndJoystick_vc10.vcxproj | 231 - .../MouseAndJoystick_vc11.vcxproj | 231 - .../MouseAndJoystick_vc12.vcxproj | 231 - .../MouseAndJoystick_vc14.vcxproj | 231 - examples/19.MouseAndJoystick/main.cpp | 285 - examples/20.ManagedLights/Makefile | 56 - examples/20.ManagedLights/ManagedLights.cbp | 57 - .../20.ManagedLights/ManagedLights.vcproj | 163 - .../ManagedLights.xcodeproj/project.pbxproj | 324 - .../xcschemes/20.ManagedLights.xcscheme | 91 - .../ManagedLights_vc10.vcxproj | 234 - .../ManagedLights_vc11.vcxproj | 234 - .../ManagedLights_vc12.vcxproj | 234 - .../ManagedLights_vc14.vcxproj | 234 - examples/20.ManagedLights/main.cpp | 389 - examples/21.Quake3Explorer/Makefile | 56 - examples/21.Quake3Explorer/Quake3Explorer.cbp | 78 - .../21.Quake3Explorer/Quake3Explorer.vcproj | 132 - .../Quake3Explorer.xcodeproj/project.pbxproj | 336 - .../xcschemes/21.Quake3Explorer.xcscheme | 91 - .../Quake3Explorer_vc10.vcxproj | 199 - .../Quake3Explorer_vc11.vcxproj | 200 - .../Quake3Explorer_vc12.vcxproj | 200 - .../Quake3Explorer_vc14.vcxproj | 200 - examples/21.Quake3Explorer/main.cpp | 2189 -- examples/21.Quake3Explorer/q3factory.cpp | 825 - examples/21.Quake3Explorer/q3factory.h | 149 - examples/21.Quake3Explorer/sound.cpp | 98 - examples/21.Quake3Explorer/sound.h | 18 - examples/22.MaterialViewer/Makefile | 56 - examples/22.MaterialViewer/MaterialViewer.cbp | 74 - .../22.MaterialViewer/MaterialViewer.vcproj | 229 - .../MaterialViewer.xcodeproj/project.pbxproj | 324 - .../xcschemes/22.MaterialViewer.xcscheme | 91 - .../MaterialViewer_vc10.vcxproj | 234 - .../MaterialViewer_vc11.vcxproj | 235 - .../MaterialViewer_vc12.vcxproj | 235 - .../MaterialViewer_vc14.vcxproj | 235 - examples/22.MaterialViewer/main.cpp | 1047 - examples/22.MaterialViewer/main.h | 319 - examples/23.SMeshHandling/Makefile | 56 - examples/23.SMeshHandling/SMeshHandling.cbp | 44 - .../23.SMeshHandling/SMeshHandling.vcproj | 132 - .../SMeshHandling.xcodeproj/project.pbxproj | 324 - .../xcschemes/23.SMeshHandling.xcscheme | 91 - .../SMeshHandling_vc10.vcxproj | 191 - .../SMeshHandling_vc11.vcxproj | 192 - .../SMeshHandling_vc12.vcxproj | 192 - .../SMeshHandling_vc14.vcxproj | 192 - examples/23.SMeshHandling/main.cpp | 426 - examples/24.CursorControl/CursorControl.cbp | 57 - .../24.CursorControl/CursorControl.vcproj | 132 - .../CursorControl.xcodeproj/project.pbxproj | 324 - .../xcschemes/24.CursorControl.xcscheme | 91 - .../CursorControl_vc10.vcxproj | 187 - .../CursorControl_vc11.vcxproj | 188 - .../CursorControl_vc12.vcxproj | 188 - .../CursorControl_vc14.vcxproj | 188 - examples/24.CursorControl/Makefile | 56 - examples/24.CursorControl/main.cpp | 566 - examples/26.OcclusionQuery/Makefile | 56 - examples/26.OcclusionQuery/OcclusionQuery.cbp | 55 - .../26.OcclusionQuery/OcclusionQuery.vcproj | 163 - .../OcclusionQuery.xcodeproj/project.pbxproj | 324 - .../xcschemes/26.OcclusionQuery.xcscheme | 91 - .../OcclusionQuery_vc10.vcxproj | 235 - .../OcclusionQuery_vc11.vcxproj | 235 - .../OcclusionQuery_vc12.vcxproj | 235 - .../OcclusionQuery_vc14.vcxproj | 235 - examples/26.OcclusionQuery/main.cpp | 216 - examples/27.PostProcessing/Makefile | 38 - examples/27.PostProcessing/PostProcessing.cbp | 56 - .../PostProcessing_vc10.vcxproj | 231 - .../PostProcessing_vc11.vcxproj | 235 - .../PostProcessing_vc12.vcxproj | 235 - .../PostProcessing_vc14.vcxproj | 235 - examples/27.PostProcessing/main.cpp | 417 - examples/28.CubeMapping/CubeMapping.cbp | 56 - .../28.CubeMapping/CubeMapping_vc10.vcxproj | 231 - .../28.CubeMapping/CubeMapping_vc11.vcxproj | 235 - .../28.CubeMapping/CubeMapping_vc12.vcxproj | 235 - .../28.CubeMapping/CubeMapping_vc14.vcxproj | 235 - examples/28.CubeMapping/Makefile | 38 - examples/28.CubeMapping/main.cpp | 770 - examples/29.HardwareSkinning/where_is_it.txt | 2 - examples/30.Profiling/Makefile | 56 - examples/30.Profiling/Profiling.cbp | 55 - examples/30.Profiling/Profiling.vcproj | 132 - .../Profiling.xcodeproj/project.pbxproj | 324 - .../xcschemes/30.Profiling.xcscheme | 91 - examples/30.Profiling/Profiling_vc10.vcxproj | 184 - examples/30.Profiling/Profiling_vc11.vcxproj | 188 - examples/30.Profiling/Profiling_vc12.vcxproj | 188 - examples/30.Profiling/Profiling_vc14.vcxproj | 188 - examples/30.Profiling/main.cpp | 507 - examples/AutomatedTest/main.cpp | 9 +- examples/BuildAllExamples.workspace | 38 - .../contents.xcworkspacedata | 88 - examples/BuildAllExamples_vc10.sln | 437 - examples/BuildAllExamples_vc11.sln | 440 - examples/BuildAllExamples_vc12.sln | 1132 - examples/BuildAllExamples_vc14.sln | 1099 - examples/CMakeLists.txt | 30 +- examples/Demo/CDemo.cpp | 833 - examples/Demo/CDemo.h | 110 - examples/Demo/CMainMenu.cpp | 393 - examples/Demo/CMainMenu.h | 56 - examples/Demo/Demo.vcproj | 223 - examples/Demo/Demo.xcodeproj/project.pbxproj | 336 - .../xcshareddata/xcschemes/Demo.xcscheme | 91 - examples/Demo/Demo_vc10.vcxproj | 283 - examples/Demo/Demo_vc11.vcxproj | 283 - examples/Demo/Demo_vc12.vcxproj | 283 - examples/Demo/Demo_vc14.vcxproj | 283 - examples/Demo/Makefile | 61 - examples/Demo/demo.cbp | 68 - examples/Demo/icon.ico | Bin 2238 -> 0 bytes examples/Demo/main.cpp | 40 - examples/Demo/resource.h | 16 - examples/Demo/resscript.rc | 72 - examples/buildAllExamples.sh | 8 - examples/whereAreTheBinaries.txt | 7 - include/ESceneNodeAnimatorTypes.h | 58 - include/ESceneNodeTypes.h | 53 - include/IAnimatedMeshMD2.h | 79 - include/IAnimatedMeshMD3.h | 278 - include/IAnimatedMeshSceneNode.h | 58 +- include/IBillboardTextSceneNode.h | 78 - include/IGeometryCreator.h | 209 - include/ILightManager.h | 62 - include/ILightSceneNode.h | 87 - include/IMeshLoader.h | 38 +- include/IMeshSceneNode.h | 26 - include/IMeshTextureLoader.h | 65 - include/IMetaTriangleSelector.h | 43 - include/IOctreeSceneNode.h | 83 - include/IParticleAffector.h | 72 - .../IParticleAnimatedMeshSceneNodeEmitter.h | 54 - include/IParticleAttractionAffector.h | 65 - include/IParticleBoxEmitter.h | 36 - include/IParticleCylinderEmitter.h | 59 - include/IParticleEmitter.h | 128 - include/IParticleFadeOutAffector.h | 41 - include/IParticleGravityAffector.h | 42 - include/IParticleMeshEmitter.h | 54 - include/IParticleRingEmitter.h | 47 - include/IParticleRotationAffector.h | 41 - include/IParticleSphereEmitter.h | 41 - include/IParticleSystemSceneNode.h | 572 - include/IQ3LevelMesh.h | 46 - include/IQ3Shader.h | 875 - include/ISceneCollisionManager.h | 284 - include/ISceneManager.h | 865 +- include/ISceneNode.h | 142 +- include/ISceneNodeAnimator.h | 170 - include/ISceneNodeAnimatorCameraFPS.h | 75 - include/ISceneNodeAnimatorCameraMaya.h | 65 - include/ISceneNodeAnimatorCollisionResponse.h | 171 - include/ISceneNodeAnimatorFactory.h | 69 - include/IShadowVolumeSceneNode.h | 65 - include/ITerrainSceneNode.h | 190 - include/ITextSceneNode.h | 55 - include/ITriangleSelector.h | 195 - include/IVolumeLightSceneNode.h | 60 - include/IrrCompileConfig.h | 294 - include/SMaterial.h | 15 +- include/irrlicht.h | 24 +- media/2ddemo.png | Bin 44217 -> 0 bytes media/Faerie5.BMP | Bin 43538 -> 0 bytes media/IrrlichtTheme.ogg | Bin 1300197 -> 0 bytes media/Particle.tga | Bin 12827 -> 0 bytes media/axe.jpg | Bin 65192 -> 0 bytes media/ball.wav | Bin 4870 -> 0 bytes media/bigfont.png | Bin 21272 -> 0 bytes media/burninglogo.png | Bin 14035 -> 0 bytes media/config.xml | 29 - media/coolguy_opt.x | 2 + media/cooltexture.png | Bin 0 -> 4828 bytes media/cubeMapReflection.frag | 12 - media/cubeMapReflection.vert | 27 - media/cubeMapReflectionPS.hlsl | 10 - media/cubeMapReflectionVS.hlsl | 38 - media/cubemap_license.txt | 18 - media/cubemap_negx.jpg | Bin 133410 -> 0 bytes media/cubemap_negy.jpg | Bin 110698 -> 0 bytes media/cubemap_negz.jpg | Bin 113952 -> 0 bytes media/cubemap_posx.jpg | Bin 131101 -> 0 bytes media/cubemap_posy.jpg | Bin 65739 -> 0 bytes media/cubemap_posz.jpg | Bin 104681 -> 0 bytes media/d3d9.hlsl | 84 - media/d3d9.psh | 11 - media/d3d9.vsh | 42 - media/demoback.jpg | Bin 97262 -> 0 bytes media/detailmap3.jpg | Bin 92466 -> 0 bytes media/directxlogo.png | Bin 9932 -> 0 bytes media/dotnetback.jpg | Bin 49559 -> 0 bytes media/dwarf-Read-Me.txt | 51 - media/dwarf.jpg | Bin 84160 -> 0 bytes media/dwarf.x | 18468 -------------- media/earth.jpg | Bin 24107 -> 0 bytes media/earth.x | 20711 ---------------- media/earthbump.jpg | Bin 24419 -> 0 bytes media/enano.jpg | Bin 19890 -> 0 bytes media/example.irr | Bin 30080 -> 0 bytes media/example_screenshots/001shot.jpg | Bin 6126 -> 0 bytes media/example_screenshots/002shot.jpg | Bin 19218 -> 0 bytes media/example_screenshots/003shot.jpg | Bin 5925 -> 0 bytes media/example_screenshots/004shot.jpg | Bin 8132 -> 0 bytes media/example_screenshots/005shot.jpg | Bin 11356 -> 0 bytes media/example_screenshots/006shot.jpg | Bin 10657 -> 0 bytes media/example_screenshots/007shot.jpg | Bin 24825 -> 0 bytes media/example_screenshots/008shot.jpg | Bin 26977 -> 0 bytes media/example_screenshots/009shot.jpg | Bin 20331 -> 0 bytes media/example_screenshots/010shot.jpg | Bin 18563 -> 0 bytes media/example_screenshots/011shot.jpg | Bin 19423 -> 0 bytes media/example_screenshots/012shot.jpg | Bin 20291 -> 0 bytes media/example_screenshots/013shot.jpg | Bin 8782 -> 0 bytes media/example_screenshots/014shot.jpg | Bin 19953 -> 0 bytes media/example_screenshots/015shot.jpg | Bin 21671 -> 0 bytes media/example_screenshots/016shot.jpg | Bin 12038 -> 0 bytes media/example_screenshots/017shot.jpg | Bin 9051 -> 0 bytes media/example_screenshots/018shot.jpg | Bin 26137 -> 0 bytes media/example_screenshots/019shot.jpg | Bin 4554 -> 0 bytes media/example_screenshots/020shot.jpg | Bin 11126 -> 0 bytes media/example_screenshots/021shot.jpg | Bin 25032 -> 0 bytes media/example_screenshots/022shot.jpg | Bin 15370 -> 0 bytes media/example_screenshots/023shot.jpg | Bin 12668 -> 0 bytes media/example_screenshots/024shot.jpg | Bin 15988 -> 0 bytes media/example_screenshots/025shot.jpg | Bin 9279 -> 0 bytes media/example_screenshots/026shot.jpg | Bin 11142 -> 0 bytes media/example_screenshots/027shot.jpg | Bin 18390 -> 0 bytes media/example_screenshots/028shot.jpg | Bin 26021 -> 0 bytes media/faerie.md2 | Bin 320996 -> 0 bytes media/faerie2.bmp | Bin 43538 -> 0 bytes media/fire.bmp | Bin 24078 -> 0 bytes media/fireball.bmp | Bin 5174 -> 0 bytes media/fontcourier.bmp | Bin 196662 -> 0 bytes media/fonthaettenschweiler.bmp | Bin 196730 -> 0 bytes media/fontlucida.png | Bin 19727 -> 0 bytes media/gun.jpg | Bin 25863 -> 0 bytes media/gun.md2 | Bin 55500 -> 0 bytes media/help.png | Bin 881 -> 0 bytes media/icon_crosshairs16x16bw1.png | Bin 203 -> 0 bytes media/icon_crosshairs16x16bw2.png | Bin 192 -> 0 bytes media/icon_crosshairs16x16bw3.png | Bin 208 -> 0 bytes media/icon_crosshairs16x16col.png | Bin 560 -> 0 bytes media/iconlist.png | Bin 30951 -> 0 bytes media/impact.wav | Bin 3942 -> 0 bytes media/info_ios.plist | 46 - media/info_osx.plist | 30 - media/irr.ico | Bin 2238 -> 0 bytes media/irrlicht.dat | Bin 8702 -> 0 bytes media/irrlicht2_bk.jpg | Bin 37467 -> 0 bytes media/irrlicht2_dn.jpg | Bin 62215 -> 0 bytes media/irrlicht2_ft.jpg | Bin 38701 -> 0 bytes media/irrlicht2_lf.jpg | Bin 46020 -> 0 bytes media/irrlicht2_rt.jpg | Bin 36551 -> 0 bytes media/irrlicht2_up.jpg | Bin 12208 -> 0 bytes media/irrlichtlogo.BMP | Bin 3806 -> 0 bytes media/irrlichtlogo.jpg | Bin 2593 -> 0 bytes media/irrlichtlogo2.png | Bin 15109 -> 0 bytes media/irrlichtlogo3.png | Bin 8225 -> 0 bytes media/irrlichtlogoaligned.jpg | Bin 2643 -> 0 bytes media/irrlichtlogoalpha.tga | Bin 16923 -> 0 bytes media/irrlichtlogoalpha2.tga | Bin 30634 -> 0 bytes media/lightFalloff.png | Bin 43385 -> 0 bytes media/lucida.xml | Bin 155900 -> 0 bytes media/lucida0.png | Bin 23853 -> 0 bytes media/map-20kdm2.pk3 | Bin 2086107 -> 0 bytes media/map-20kdm2.txt | 50 - media/ninja animation ranges.txt | 36 - media/ninja.b3d | Bin 106407 -> 0 bytes media/nskinbl.jpg | Bin 39906 -> 0 bytes media/nskinrd.jpg | Bin 52173 -> 0 bytes media/ogles2.frag | 13 - media/ogles2.vert | 34 - media/open.png | Bin 904 -> 0 bytes media/opengl.frag | 9 - media/opengl.psh | 22 - media/opengl.vert | 34 - media/opengl.vsh | 60 - media/opengllogo.png | Bin 13339 -> 0 bytes media/particle.bmp | Bin 24078 -> 0 bytes media/particlegreen.jpg | Bin 21777 -> 0 bytes media/particlered.bmp | Bin 49206 -> 0 bytes media/particlewhite.bmp | Bin 49206 -> 0 bytes media/portal1.bmp | Bin 49206 -> 0 bytes media/portal2.bmp | Bin 49206 -> 0 bytes media/portal3.bmp | Bin 49206 -> 0 bytes media/portal4.bmp | Bin 49206 -> 0 bytes media/portal5.bmp | Bin 49206 -> 0 bytes media/portal6.bmp | Bin 49206 -> 0 bytes media/portal7.bmp | Bin 49206 -> 0 bytes media/pp_d3d9.hlsl | 43 - media/pp_opengl.frag | 17 - media/pp_opengl.vert | 24 - media/rockwall.jpg | Bin 89121 -> 0 bytes media/rockwall_height.bmp | Bin 66614 -> 0 bytes media/room.3ds | Bin 5508 -> 0 bytes media/rsptnback.jpg | Bin 33912 -> 0 bytes media/skydome.jpg | Bin 39052 -> 0 bytes media/skydome2.jpg | Bin 62534 -> 0 bytes media/smoke.bmp | Bin 5174 -> 0 bytes media/smoke2.jpg | Bin 22618 -> 0 bytes media/smoke3.jpg | Bin 23083 -> 0 bytes media/spheremap.jpg | Bin 16705 -> 0 bytes media/stones.jpg | Bin 7764 -> 0 bytes media/sydney.bmp | Bin 132150 -> 0 bytes media/sydney.md2 | Bin 302128 -> 0 bytes media/t351sml.jpg | Bin 8515 -> 0 bytes media/terrain-heightmap.bmp | Bin 67962 -> 0 bytes media/terrain-texture.jpg | Bin 184786 -> 0 bytes media/tools.png | Bin 845 -> 0 bytes media/vc6include.jpg | Bin 10722 -> 0 bytes media/vc6optionsdir.jpg | Bin 12147 -> 0 bytes media/vcnetinclude.jpg | Bin 12479 -> 0 bytes media/wall.bmp | Bin 196662 -> 0 bytes media/wall.jpg | Bin 89206 -> 0 bytes media/water.jpg | Bin 19451 -> 0 bytes media/yodan mdl - readme.txt | 53 - media/yodan.mdl | Bin 364704 -> 0 bytes media/zip.png | Bin 833 -> 0 bytes source/Irrlicht/C3DSMeshFileLoader.cpp | 1371 - source/Irrlicht/C3DSMeshFileLoader.h | 166 - source/Irrlicht/CAnimatedMeshHalfLife.cpp | 1679 -- source/Irrlicht/CAnimatedMeshHalfLife.h | 630 - source/Irrlicht/CAnimatedMeshMD2.cpp | 465 - source/Irrlicht/CAnimatedMeshMD2.h | 158 - source/Irrlicht/CAnimatedMeshMD3.cpp | 468 - source/Irrlicht/CAnimatedMeshMD3.h | 135 - source/Irrlicht/CAnimatedMeshSceneNode.cpp | 162 +- source/Irrlicht/CAnimatedMeshSceneNode.h | 32 - source/Irrlicht/CB3DMeshFileLoader.cpp | 48 - source/Irrlicht/CB3DMeshFileLoader.h | 2 - source/Irrlicht/CBSPMeshFileLoader.cpp | 107 - source/Irrlicht/CBSPMeshFileLoader.h | 52 - source/Irrlicht/CBoneSceneNode.cpp | 6 - .../CBurningShader_Raster_Reference.cpp | 1149 - source/Irrlicht/CCSMLoader.cpp | 859 - source/Irrlicht/CCSMLoader.h | 81 - source/Irrlicht/CCameraSceneNode.cpp | 16 +- source/Irrlicht/CCubeSceneNode.cpp | 246 - source/Irrlicht/CCubeSceneNode.h | 93 - source/Irrlicht/CD3D9Driver.cpp | 3826 --- source/Irrlicht/CD3D9Driver.h | 513 - source/Irrlicht/CD3D9HLSLMaterialRenderer.cpp | 424 - source/Irrlicht/CD3D9HLSLMaterialRenderer.h | 87 - source/Irrlicht/CD3D9MaterialRenderer.h | 584 - source/Irrlicht/CD3D9NormalMapRenderer.cpp | 306 - source/Irrlicht/CD3D9NormalMapRenderer.h | 56 - source/Irrlicht/CD3D9ParallaxMapRenderer.cpp | 409 - source/Irrlicht/CD3D9ParallaxMapRenderer.h | 63 - source/Irrlicht/CD3D9RenderTarget.cpp | 281 - source/Irrlicht/CD3D9RenderTarget.h | 60 - .../Irrlicht/CD3D9ShaderMaterialRenderer.cpp | 539 - source/Irrlicht/CD3D9ShaderMaterialRenderer.h | 108 - source/Irrlicht/CD3D9Texture.cpp | 758 - source/Irrlicht/CD3D9Texture.h | 91 - source/Irrlicht/CDMFLoader.cpp | 431 - source/Irrlicht/CDMFLoader.h | 91 - .../CDefaultSceneNodeAnimatorFactory.cpp | 162 - .../CDefaultSceneNodeAnimatorFactory.h | 75 - source/Irrlicht/CDefaultSceneNodeFactory.cpp | 62 - source/Irrlicht/CDepthBuffer.cpp | 186 - source/Irrlicht/CDepthBuffer.h | 92 - source/Irrlicht/CFileSystem.cpp | 4 - source/Irrlicht/CGeometryCreator.cpp | 1084 - source/Irrlicht/CGeometryCreator.h | 67 - source/Irrlicht/CImageLoaderDDS.cpp | 887 - source/Irrlicht/CImageLoaderDDS.h | 215 - source/Irrlicht/CImageLoaderPCX.cpp | 229 - source/Irrlicht/CImageLoaderPCX.h | 82 - source/Irrlicht/CImageLoaderPPM.cpp | 274 - source/Irrlicht/CImageLoaderPPM.h | 55 - source/Irrlicht/CImageLoaderPSD.cpp | 375 - source/Irrlicht/CImageLoaderPSD.h | 72 - source/Irrlicht/CImageLoaderPVR.cpp | 266 - source/Irrlicht/CImageLoaderPVR.h | 55 - source/Irrlicht/CImageLoaderRGB.cpp | 651 - source/Irrlicht/CImageLoaderRGB.h | 164 - source/Irrlicht/CImageLoaderTGA.cpp | 237 - source/Irrlicht/CImageLoaderTGA.h | 82 - source/Irrlicht/CImageLoaderWAL.cpp | 282 - source/Irrlicht/CImageLoaderWAL.h | 100 - source/Irrlicht/CImageWriterBMP.cpp | 137 - source/Irrlicht/CImageWriterBMP.h | 37 - source/Irrlicht/CImageWriterPCX.cpp | 162 - source/Irrlicht/CImageWriterPCX.h | 37 - source/Irrlicht/CImageWriterPPM.cpp | 113 - source/Irrlicht/CImageWriterPPM.h | 37 - source/Irrlicht/CImageWriterPSD.cpp | 46 - source/Irrlicht/CImageWriterPSD.h | 37 - source/Irrlicht/CImageWriterTGA.cpp | 145 - source/Irrlicht/CImageWriterTGA.h | 37 - source/Irrlicht/CLMTSMeshFileLoader.cpp | 380 - source/Irrlicht/CLMTSMeshFileLoader.h | 109 - source/Irrlicht/CLWOMeshFileLoader.cpp | 2115 -- source/Irrlicht/CLWOMeshFileLoader.h | 87 - source/Irrlicht/CLightSceneNode.cpp | 281 - source/Irrlicht/CLightSceneNode.h | 109 - source/Irrlicht/CMD2MeshFileLoader.cpp | 363 - source/Irrlicht/CMD2MeshFileLoader.h | 45 - source/Irrlicht/CMD3MeshFileLoader.cpp | 53 - source/Irrlicht/CMD3MeshFileLoader.h | 49 - source/Irrlicht/CMS3DMeshFileLoader.cpp | 872 - source/Irrlicht/CMS3DMeshFileLoader.h | 49 - source/Irrlicht/CMY3DHelper.h | 445 - source/Irrlicht/CMY3DMeshFileLoader.cpp | 886 - source/Irrlicht/CMY3DMeshFileLoader.h | 131 - source/Irrlicht/CMakeLists.txt | 145 +- source/Irrlicht/CMeshSceneNode.cpp | 44 +- source/Irrlicht/CMeshSceneNode.h | 6 - source/Irrlicht/CMeshTextureLoader.cpp | 130 - source/Irrlicht/CMeshTextureLoader.h | 81 - source/Irrlicht/CMetaTriangleSelector.cpp | 225 - source/Irrlicht/CMetaTriangleSelector.h | 79 - source/Irrlicht/CNPKReader.cpp | 277 - source/Irrlicht/CNPKReader.h | 125 - source/Irrlicht/COBJMeshFileLoader.cpp | 353 - source/Irrlicht/COBJMeshFileLoader.h | 6 - source/Irrlicht/COBJMeshWriter.cpp | 282 - source/Irrlicht/COBJMeshWriter.h | 58 - source/Irrlicht/COCTLoader.cpp | 335 - source/Irrlicht/COCTLoader.h | 141 - source/Irrlicht/COctreeSceneNode.cpp | 677 - source/Irrlicht/COctreeSceneNode.h | 132 - source/Irrlicht/COctreeTriangleSelector.cpp | 327 - source/Irrlicht/COctreeTriangleSelector.h | 85 - source/Irrlicht/COgreMeshFileLoader.cpp | 1607 -- source/Irrlicht/COgreMeshFileLoader.h | 269 - source/Irrlicht/CPLYMeshFileLoader.cpp | 821 - source/Irrlicht/CPLYMeshFileLoader.h | 148 - source/Irrlicht/CPLYMeshWriter.cpp | 220 - source/Irrlicht/CPLYMeshWriter.h | 35 - source/Irrlicht/CPakReader.cpp | 196 - source/Irrlicht/CPakReader.h | 122 - .../CParticleAnimatedMeshSceneNodeEmitter.cpp | 200 - .../CParticleAnimatedMeshSceneNodeEmitter.h | 160 - .../Irrlicht/CParticleAttractionAffector.cpp | 88 - source/Irrlicht/CParticleAttractionAffector.h | 90 - source/Irrlicht/CParticleBoxEmitter.cpp | 192 - source/Irrlicht/CParticleBoxEmitter.h | 136 - source/Irrlicht/CParticleCylinderEmitter.cpp | 193 - source/Irrlicht/CParticleCylinderEmitter.h | 167 - source/Irrlicht/CParticleFadeOutAffector.cpp | 74 - source/Irrlicht/CParticleFadeOutAffector.h | 68 - source/Irrlicht/CParticleGravityAffector.cpp | 68 - source/Irrlicht/CParticleGravityAffector.h | 68 - source/Irrlicht/CParticleMeshEmitter.cpp | 194 - source/Irrlicht/CParticleMeshEmitter.h | 163 - source/Irrlicht/CParticlePointEmitter.cpp | 151 - source/Irrlicht/CParticlePointEmitter.h | 125 - source/Irrlicht/CParticleRingEmitter.cpp | 181 - source/Irrlicht/CParticleRingEmitter.h | 151 - source/Irrlicht/CParticleRotationAffector.cpp | 72 - source/Irrlicht/CParticleRotationAffector.h | 59 - source/Irrlicht/CParticleScaleAffector.cpp | 57 - source/Irrlicht/CParticleScaleAffector.h | 48 - source/Irrlicht/CParticleSphereEmitter.cpp | 178 - source/Irrlicht/CParticleSphereEmitter.h | 144 - source/Irrlicht/CParticleSystemSceneNode.cpp | 786 - source/Irrlicht/CParticleSystemSceneNode.h | 249 - source/Irrlicht/CQ3LevelMesh.cpp | 2082 -- source/Irrlicht/CQ3LevelMesh.h | 488 - source/Irrlicht/CQuake3ShaderSceneNode.cpp | 1385 -- source/Irrlicht/CQuake3ShaderSceneNode.h | 118 - source/Irrlicht/CSMFMeshFileLoader.cpp | 242 - source/Irrlicht/CSMFMeshFileLoader.h | 69 - source/Irrlicht/CSTLMeshFileLoader.cpp | 253 - source/Irrlicht/CSTLMeshFileLoader.h | 49 - source/Irrlicht/CSTLMeshWriter.cpp | 187 - source/Irrlicht/CSTLMeshWriter.h | 55 - source/Irrlicht/CSceneCollisionManager.cpp | 983 - source/Irrlicht/CSceneCollisionManager.h | 153 - source/Irrlicht/CSceneManager.cpp | 1250 +- source/Irrlicht/CSceneManager.h | 298 - .../Irrlicht/CSceneNodeAnimatorCameraFPS.cpp | 425 - source/Irrlicht/CSceneNodeAnimatorCameraFPS.h | 145 - .../Irrlicht/CSceneNodeAnimatorCameraMaya.cpp | 362 - .../Irrlicht/CSceneNodeAnimatorCameraMaya.h | 130 - .../CSceneNodeAnimatorCollisionResponse.cpp | 310 - .../CSceneNodeAnimatorCollisionResponse.h | 157 - source/Irrlicht/CSceneNodeAnimatorDelete.cpp | 55 - source/Irrlicht/CSceneNodeAnimatorDelete.h | 46 - .../Irrlicht/CSceneNodeAnimatorFlyCircle.cpp | 107 - source/Irrlicht/CSceneNodeAnimatorFlyCircle.h | 63 - .../CSceneNodeAnimatorFlyStraight.cpp | 119 - .../Irrlicht/CSceneNodeAnimatorFlyStraight.h | 58 - .../CSceneNodeAnimatorFollowSpline.cpp | 168 - .../Irrlicht/CSceneNodeAnimatorFollowSpline.h | 62 - .../Irrlicht/CSceneNodeAnimatorRotation.cpp | 80 - source/Irrlicht/CSceneNodeAnimatorRotation.h | 48 - source/Irrlicht/CSceneNodeAnimatorTexture.cpp | 146 - source/Irrlicht/CSceneNodeAnimatorTexture.h | 59 - source/Irrlicht/CShadowVolumeSceneNode.cpp | 531 - source/Irrlicht/CShadowVolumeSceneNode.h | 99 - source/Irrlicht/CSkyBoxSceneNode.cpp | 260 - source/Irrlicht/CSkyBoxSceneNode.h | 62 - source/Irrlicht/CSkyDomeSceneNode.cpp | 264 - source/Irrlicht/CSkyDomeSceneNode.h | 50 - source/Irrlicht/CSoftware2MaterialRenderer.h | 90 - source/Irrlicht/CSoftwareDriver.cpp | 976 - source/Irrlicht/CSoftwareDriver.h | 180 - source/Irrlicht/CSoftwareDriver2.cpp | 3821 --- source/Irrlicht/CSoftwareDriver2.h | 450 - source/Irrlicht/CSoftwareTexture.cpp | 170 - source/Irrlicht/CSoftwareTexture.h | 73 - source/Irrlicht/CSphereSceneNode.cpp | 206 - source/Irrlicht/CSphereSceneNode.h | 96 - source/Irrlicht/CTRFlat.cpp | 299 - source/Irrlicht/CTRFlatWire.cpp | 280 - source/Irrlicht/CTRGouraud.cpp | 357 - source/Irrlicht/CTRGouraud2.cpp | 646 - source/Irrlicht/CTRGouraudAlpha2.cpp | 651 - source/Irrlicht/CTRGouraudAlphaNoZ2.cpp | 651 - source/Irrlicht/CTRGouraudNoZ2.cpp | 643 - source/Irrlicht/CTRGouraudWire.cpp | 325 - source/Irrlicht/CTRNormalMap.cpp | 925 - source/Irrlicht/CTRStencilShadow.cpp | 705 - source/Irrlicht/CTRTextureBlend.cpp | 2567 -- source/Irrlicht/CTRTextureDetailMap2.cpp | 652 - source/Irrlicht/CTRTextureFlat.cpp | 336 - source/Irrlicht/CTRTextureFlatWire.cpp | 310 - source/Irrlicht/CTRTextureGouraud.cpp | 466 - source/Irrlicht/CTRTextureGouraud.h | 85 - source/Irrlicht/CTRTextureGouraud2.cpp | 912 - source/Irrlicht/CTRTextureGouraudAdd.cpp | 417 - source/Irrlicht/CTRTextureGouraudAdd2.cpp | 660 - source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp | 667 - source/Irrlicht/CTRTextureGouraudAlpha.cpp | 718 - source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp | 1249 - source/Irrlicht/CTRTextureGouraudNoZ.cpp | 364 - source/Irrlicht/CTRTextureGouraudNoZ2.cpp | 811 - .../CTRTextureGouraudVertexAlpha2.cpp | 762 - source/Irrlicht/CTRTextureGouraudWire.cpp | 362 - source/Irrlicht/CTRTextureLightMap2_Add.cpp | 657 - source/Irrlicht/CTRTextureLightMap2_M1.cpp | 640 - source/Irrlicht/CTRTextureLightMap2_M2.cpp | 638 - source/Irrlicht/CTRTextureLightMap2_M4.cpp | 1154 - .../CTRTextureLightMapGouraud2_M4.cpp | 669 - source/Irrlicht/CTRTextureWire2.cpp | 346 - .../CTR_transparent_reflection_2_layer.cpp | 731 - source/Irrlicht/CTarReader.cpp | 256 - source/Irrlicht/CTarReader.h | 136 - source/Irrlicht/CTerrainSceneNode.cpp | 1518 -- source/Irrlicht/CTerrainSceneNode.h | 336 - source/Irrlicht/CTerrainTriangleSelector.cpp | 271 - source/Irrlicht/CTerrainTriangleSelector.h | 103 - source/Irrlicht/CTextSceneNode.cpp | 521 - source/Irrlicht/CTextSceneNode.h | 180 - source/Irrlicht/CTriangleBBSelector.cpp | 89 - source/Irrlicht/CTriangleBBSelector.h | 49 - source/Irrlicht/CTriangleSelector.cpp | 508 - source/Irrlicht/CTriangleSelector.h | 109 - source/Irrlicht/CVolumeLightSceneNode.cpp | 196 - source/Irrlicht/CVolumeLightSceneNode.h | 95 - source/Irrlicht/CWADReader.cpp | 263 - source/Irrlicht/CWADReader.h | 176 - source/Irrlicht/CWaterSurfaceSceneNode.cpp | 140 - source/Irrlicht/CWaterSurfaceSceneNode.h | 61 - source/Irrlicht/CXMeshFileLoader.cpp | 102 - source/Irrlicht/CXMeshFileLoader.h | 2 - source/Irrlicht/IBurningShader.cpp | 418 - source/Irrlicht/IBurningShader.h | 443 - source/Irrlicht/IDepthBuffer.h | 82 - source/Irrlicht/ISceneNodeAnimatorFinishing.h | 36 - source/Irrlicht/Octree.h | 389 - .../Irrlicht/SoftwareDriver2_compile_config.h | 88 - source/Irrlicht/burning_shader_color.cpp | 95 - source/Irrlicht/burning_shader_color_fraq.h | 24 - .../burning_shader_compile_fragment_default.h | 164 - .../burning_shader_compile_fragment_end.h | 20 - .../burning_shader_compile_fragment_start.h | 119 - .../Irrlicht/burning_shader_compile_start.h | 24 - .../burning_shader_compile_triangle.h | 373 - .../Irrlicht/burning_shader_compile_verify.h | 43 - source/Irrlicht/dmfsupport.h | 732 - tests/2dmaterial.cpp | 912 - tests/Makefile | 53 - tests/anti-aliasing.cpp | 74 - tests/archiveReader.cpp | 469 - tests/b3dAnimation.cpp | 87 - tests/billboards.cpp | 156 - tests/burningsVideo.cpp | 40 - tests/collisionResponseAnimator.cpp | 198 - tests/color.cpp | 21 - tests/coreutil.cpp | 59 - tests/createImage.cpp | 94 - tests/cursorSetVisible.cpp | 70 - tests/disambiguateTextures.cpp | 84 - tests/draw2DImage.cpp | 196 - tests/drawPixel.cpp | 191 - tests/drawRectOutline.cpp | 54 - tests/drawVertexPrimitive.cpp | 104 - tests/empty/empty/Direct3D 9.0.png | Bin 11330 -> 0 bytes .../empty/Irrlicht Software Device 1.0.png | Bin 6569 -> 0 bytes tests/empty/empty/OpenGL 2.1.2.png | Bin 10387 -> 0 bytes tests/empty/empty/burnings video 0.39b.png | Bin 11908 -> 0 bytes tests/enumerateImageManipulators.cpp | 133 - tests/exports.cpp | 17 - tests/fast_atof.cpp | 290 - tests/filesystem.cpp | 183 - tests/flyCircleAnimator.cpp | 60 - tests/guiDisabledMenu.cpp | 58 - tests/ioScene.cpp | 132 - tests/irrArray.cpp | 184 - tests/irrCoreEquals.cpp | 132 - tests/irrList.cpp | 76 - tests/irrMap.cpp | 64 - tests/irrString.cpp | 415 - tests/lightMaps.cpp | 73 - tests/lights.cpp | 70 - tests/line2d.cpp | 79 - tests/loadTextures.cpp | 97 - tests/main.cpp | 260 - tests/makeColorKeyTexture.cpp | 74 - tests/material.cpp | 79 - tests/matrixOps.cpp | 465 - tests/md2Animation.cpp | 128 - tests/media/Burning's Video-2dmatFilter.png | Bin 18757 -> 0 bytes tests/media/Burning's Video-addBlend2D.png | Bin 5896 -> 0 bytes .../Burning's Video-ambient-lighting.png | Bin 392 -> 0 bytes tests/media/Burning's Video-b3dAnimation.png | Bin 5879 -> 0 bytes .../Burning's Video-b3dJointPosition.png | Bin 2982 -> 0 bytes tests/media/Burning's Video-billboard.png | Bin 4577 -> 0 bytes .../Burning's Video-billboardOrientation.png | Bin 10488 -> 0 bytes .../Burning's Video-draw2DImage4cFilter.png | Bin 23716 -> 0 bytes .../media/Burning's Video-draw2DImageRTT.png | Bin 2471 -> 0 bytes .../media/Burning's Video-draw2DImageRect.png | Bin 4832 -> 0 bytes tests/media/Burning's Video-drawLine.png | Bin 1069 -> 0 bytes tests/media/Burning's Video-drawPixel.png | Bin 27966 -> 0 bytes .../media/Burning's Video-drawRectOutline.png | Bin 492 -> 0 bytes tests/media/Burning's Video-drawVPL_a.png | Bin 359 -> 0 bytes tests/media/Burning's Video-drawVPL_b.png | Bin 359 -> 0 bytes tests/media/Burning's Video-drawVPL_c.png | Bin 359 -> 0 bytes tests/media/Burning's Video-drawVPL_d.png | Bin 359 -> 0 bytes tests/media/Burning's Video-drawVPL_e.png | Bin 16056 -> 0 bytes tests/media/Burning's Video-drawVPL_f.png | Bin 359 -> 0 bytes tests/media/Burning's Video-drawVPL_g.png | Bin 14337 -> 0 bytes tests/media/Burning's Video-drawVPL_h.png | Bin 13300 -> 0 bytes tests/media/Burning's Video-drawVPL_i.png | Bin 13181 -> 0 bytes tests/media/Burning's Video-drawVPL_j.png | Bin 359 -> 0 bytes tests/media/Burning's Video-drawVPL_k.png | Bin 359 -> 0 bytes .../Burning's Video-flyCircleAnimator.png | Bin 2567 -> 0 bytes .../media/Burning's Video-guiDisabledMenu.png | Bin 740 -> 0 bytes tests/media/Burning's Video-lightType.png | Bin 5471 -> 0 bytes tests/media/Burning's Video-lightmaps.png | Bin 33502 -> 0 bytes tests/media/Burning's Video-loadScene.png | Bin 24949 -> 0 bytes ...urning's Video-makeColorKeyTexture-new.png | Bin 19696 -> 0 bytes ...urning's Video-makeColorKeyTexture-old.png | Bin 20940 -> 0 bytes tests/media/Burning's Video-md2Animation.png | Bin 5077 -> 0 bytes tests/media/Burning's Video-md2Normals.png | Bin 6457 -> 0 bytes tests/media/Burning's Video-meshTransform.png | Bin 1851 -> 0 bytes tests/media/Burning's Video-multiTexture.png | Bin 7646 -> 0 bytes tests/media/Burning's Video-orthoCam.png | Bin 4542 -> 0 bytes tests/media/Burning's Video-pixelAccuracy.png | Bin 728 -> 0 bytes ...Burning's Video-planeMatrix-scaledClip.png | Bin 40447 -> 0 bytes tests/media/Burning's Video-projMat.png | Bin 814 -> 0 bytes tests/media/Burning's Video-renderMipmap.png | Bin 814 -> 0 bytes .../media/Burning's Video-rttAndAntiAlias.png | Bin 2099 -> 0 bytes tests/media/Burning's Video-rttAndText.png | Bin 6789 -> 0 bytes .../media/Burning's Video-rttWith2DImage.png | Bin 14596 -> 0 bytes .../Burning's Video-stencilSelfShadow.png | Bin 14841 -> 0 bytes tests/media/Burning's Video-stencilShadow.png | Bin 3495 -> 0 bytes tests/media/Burning's Video-terrainGap.png | Bin 3898 -> 0 bytes .../Burning's Video-terrainSceneNode-1.png | Bin 39271 -> 0 bytes .../Burning's Video-terrainSceneNode-2.png | Bin 41628 -> 0 bytes .../Burning's Video-testGeometryCreator.png | Bin 8407 -> 0 bytes .../Burning's Video-testImageFormats.png | Bin 11134 -> 0 bytes .../media/Burning's Video-testTerrainMesh.png | Bin 33283 -> 0 bytes tests/media/Burning's Video-textureMatrix.png | Bin 15212 -> 0 bytes .../media/Burning's Video-textureMatrix2.png | Bin 15190 -> 0 bytes ...ing's Video-textureMatrixInMixedScenes.png | Bin 1187 -> 0 bytes .../Burning's Video-textureRenderStates.png | Bin 30344 -> 0 bytes .../Burning's Video-transparentAddColor.png | Bin 29747 -> 0 bytes ...urning's Video-transparentAlphaChannel.png | Bin 29346 -> 0 bytes ...ing's Video-transparentAlphaChannelRef.png | Bin 30009 -> 0 bytes ...ng's Video-transparentReflection2Layer.png | Bin 32288 -> 0 bytes ...Burning's Video-transparentVertexAlpha.png | Bin 29855 -> 0 bytes ...ideo-transparentVertexAlphaChannelMore.png | Bin 4719 -> 0 bytes tests/media/Burning's Video-viewPortText.png | Bin 8955 -> 0 bytes .../Burning's Video-writeImageToFile.png | Bin 27966 -> 0 bytes tests/media/Direct3D 9.0-2dmatFilter.png | Bin 13137 -> 0 bytes tests/media/Direct3D 9.0-addBlend2D.png | Bin 5960 -> 0 bytes .../Direct3D 9.0-draw2DImage4cFilter.png | Bin 32938 -> 0 bytes tests/media/Direct3D 9.0-draw2DImagePNG.png | Bin 23799 -> 0 bytes tests/media/Direct3D 9.0-draw2DImageRTT.png | Bin 2471 -> 0 bytes tests/media/Direct3D 9.0-draw2DImageRect.png | Bin 4827 -> 0 bytes tests/media/Direct3D 9.0-drawLine.png | Bin 1069 -> 0 bytes tests/media/Direct3D 9.0-drawPixel.png | Bin 24320 -> 0 bytes tests/media/Direct3D 9.0-drawRectOutline.png | Bin 561 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_a.png | Bin 2832 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_b.png | Bin 25555 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_c.png | Bin 25549 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_d.png | Bin 19848 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_e.png | Bin 15987 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_f.png | Bin 15022 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_g.png | Bin 14127 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_h.png | Bin 359 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_i.png | Bin 359 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_j.png | Bin 359 -> 0 bytes tests/media/Direct3D 9.0-drawVPL_k.png | Bin 2832 -> 0 bytes tests/media/Direct3D 9.0-lightType.png | Bin 2744 -> 0 bytes tests/media/Direct3D 9.0-lightmaps.png | Bin 33502 -> 0 bytes tests/media/Direct3D 9.0-lineAntiAliasing.png | Bin 4517 -> 0 bytes tests/media/Direct3D 9.0-mrt.png | Bin 287 -> 0 bytes tests/media/Direct3D 9.0-mrt2.png | Bin 250 -> 0 bytes tests/media/Direct3D 9.0-multiTexture.png | Bin 7880 -> 0 bytes tests/media/Direct3D 9.0-orthoCam.png | Bin 4415 -> 0 bytes tests/media/Direct3D 9.0-orthoStencil.png | Bin 2109 -> 0 bytes tests/media/Direct3D 9.0-pixelAccuracy.png | Bin 728 -> 0 bytes tests/media/Direct3D 9.0-polygonBack.png | Bin 8592 -> 0 bytes tests/media/Direct3D 9.0-polygonFront.png | Bin 8592 -> 0 bytes tests/media/Direct3D 9.0-projMat.png | Bin 409 -> 0 bytes tests/media/Direct3D 9.0-renderMipmap.png | Bin 917 -> 0 bytes tests/media/Direct3D 9.0-rttAndAntiAlias.png | Bin 3011 -> 0 bytes tests/media/Direct3D 9.0-rttAndText.png | Bin 6860 -> 0 bytes tests/media/Direct3D 9.0-rttWith2DImage.png | Bin 14555 -> 0 bytes .../media/Direct3D 9.0-stencilSelfShadow.png | Bin 12782 -> 0 bytes tests/media/Direct3D 9.0-stencilShadow.png | Bin 3312 -> 0 bytes tests/media/Direct3D 9.0-textureMatrix.png | Bin 13194 -> 0 bytes tests/media/Direct3D 9.0-textureMatrix2.png | Bin 13187 -> 0 bytes ...irect3D 9.0-textureMatrixInMixedScenes.png | Bin 1107 -> 0 bytes .../Direct3D 9.0-textureRenderStates.png | Bin 30383 -> 0 bytes .../Direct3D 9.0-transparentAddColor.png | Bin 29772 -> 0 bytes .../Direct3D 9.0-transparentAlphaChannel.png | Bin 29615 -> 0 bytes ...irect3D 9.0-transparentAlphaChannelRef.png | Bin 30225 -> 0 bytes ...rect3D 9.0-transparentReflection2Layer.png | Bin 28192 -> 0 bytes .../Direct3D 9.0-transparentVertexAlpha.png | Bin 23605 -> 0 bytes ... 9.0-transparentVertexAlphaChannelMore.png | Bin 4397 -> 0 bytes tests/media/Direct3D 9.0-ucpsphere.png | Bin 2013 -> 0 bytes tests/media/Direct3D 9.0-viewPortText.png | Bin 8175 -> 0 bytes ...rlicht Software Driver 1.0-createImage.png | Bin 1913 -> 0 bytes ...cht Software Driver 1.0-draw2DImageRTT.png | Bin 1753 -> 0 bytes ...ht Software Driver 1.0-draw2DImageRect.png | Bin 4061 -> 0 bytes .../Irrlicht Software Driver 1.0-drawLine.png | Bin 1041 -> 0 bytes ...Irrlicht Software Driver 1.0-drawPixel.png | Bin 20898 -> 0 bytes ...ht Software Driver 1.0-drawRectOutline.png | Bin 538 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_a.png | Bin 358 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_b.png | Bin 10021 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_c.png | Bin 9991 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_d.png | Bin 6133 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_e.png | Bin 358 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_f.png | Bin 11269 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_g.png | Bin 9761 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_h.png | Bin 358 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_i.png | Bin 358 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_j.png | Bin 358 -> 0 bytes ...Irrlicht Software Driver 1.0-drawVPL_k.png | Bin 358 -> 0 bytes ...are Driver 1.0-makeColorKeyTexture-new.png | Bin 13284 -> 0 bytes ...are Driver 1.0-makeColorKeyTexture-old.png | Bin 14949 -> 0 bytes ...licht Software Driver 1.0-multiTexture.png | Bin 2959 -> 0 bytes ...icht Software Driver 1.0-pixelAccuracy.png | Bin 728 -> 0 bytes .../Irrlicht Software Driver 1.0-projMat.png | Bin 333 -> 0 bytes ...rrlicht Software Driver 1.0-rttAndText.png | Bin 1364 -> 0 bytes ...cht Software Driver 1.0-rttWith2DImage.png | Bin 5859 -> 0 bytes ... Driver 1.0-softwareDevice-rotatedClip.png | Bin 1230 -> 0 bytes ...oftware Driver 1.0-textureRenderStates.png | Bin 21298 -> 0 bytes ...licht Software Driver 1.0-viewPortText.png | Bin 5251 -> 0 bytes tests/media/Monty.zip | Bin 1060 -> 0 bytes tests/media/OpenGL-2dmatFilter.png | Bin 12844 -> 0 bytes tests/media/OpenGL-addBlend2D.png | Bin 6331 -> 0 bytes tests/media/OpenGL-draw2DImage4cFilter.png | Bin 36266 -> 0 bytes tests/media/OpenGL-draw2DImagePNG.png | Bin 23838 -> 0 bytes tests/media/OpenGL-draw2DImageRTT.png | Bin 2471 -> 0 bytes tests/media/OpenGL-draw2DImageRect.png | Bin 4827 -> 0 bytes tests/media/OpenGL-drawLine.png | Bin 1069 -> 0 bytes tests/media/OpenGL-drawPixel.png | Bin 24368 -> 0 bytes tests/media/OpenGL-drawRectOutline.png | Bin 608 -> 0 bytes tests/media/OpenGL-drawVPL_a.png | Bin 2876 -> 0 bytes tests/media/OpenGL-drawVPL_b.png | Bin 25667 -> 0 bytes tests/media/OpenGL-drawVPL_c.png | Bin 25667 -> 0 bytes tests/media/OpenGL-drawVPL_d.png | Bin 19931 -> 0 bytes tests/media/OpenGL-drawVPL_e.png | Bin 15945 -> 0 bytes tests/media/OpenGL-drawVPL_f.png | Bin 15085 -> 0 bytes tests/media/OpenGL-drawVPL_g.png | Bin 13967 -> 0 bytes tests/media/OpenGL-drawVPL_h.png | Bin 14183 -> 0 bytes tests/media/OpenGL-drawVPL_i.png | Bin 15349 -> 0 bytes tests/media/OpenGL-drawVPL_j.png | Bin 15179 -> 0 bytes tests/media/OpenGL-drawVPL_k.png | Bin 2876 -> 0 bytes tests/media/OpenGL-lightType.png | Bin 5526 -> 0 bytes tests/media/OpenGL-lightmaps.png | Bin 33502 -> 0 bytes tests/media/OpenGL-lineAntiAliasing.png | Bin 4639 -> 0 bytes tests/media/OpenGL-mrt.png | Bin 287 -> 0 bytes tests/media/OpenGL-mrt2.png | Bin 250 -> 0 bytes tests/media/OpenGL-multiTexture.png | Bin 7604 -> 0 bytes tests/media/OpenGL-octree_select1.png | Bin 13234 -> 0 bytes tests/media/OpenGL-octree_select2.png | Bin 28124 -> 0 bytes tests/media/OpenGL-orthoCam.png | Bin 4574 -> 0 bytes tests/media/OpenGL-orthoStencil.png | Bin 2075 -> 0 bytes tests/media/OpenGL-pixelAccuracy.png | Bin 728 -> 0 bytes tests/media/OpenGL-polygonBack.png | Bin 8166 -> 0 bytes tests/media/OpenGL-polygonFront.png | Bin 8181 -> 0 bytes tests/media/OpenGL-projMat.png | Bin 408 -> 0 bytes tests/media/OpenGL-renderMipmap.png | Bin 1098 -> 0 bytes tests/media/OpenGL-rttAndAntiAlias.png | Bin 2103 -> 0 bytes tests/media/OpenGL-rttAndText.png | Bin 6857 -> 0 bytes tests/media/OpenGL-rttWith2DImage.png | Bin 14555 -> 0 bytes tests/media/OpenGL-stencilSelfShadow.png | Bin 12917 -> 0 bytes tests/media/OpenGL-stencilShadow.png | Bin 3346 -> 0 bytes tests/media/OpenGL-textureMatrix.png | Bin 13470 -> 0 bytes tests/media/OpenGL-textureMatrix2.png | Bin 13470 -> 0 bytes .../OpenGL-textureMatrixInMixedScenes.png | Bin 1104 -> 0 bytes tests/media/OpenGL-texturePointer.png | Bin 5162 -> 0 bytes tests/media/OpenGL-textureRenderStates.png | Bin 30383 -> 0 bytes tests/media/OpenGL-transparentAddColor.png | Bin 29675 -> 0 bytes .../media/OpenGL-transparentAlphaChannel.png | Bin 29533 -> 0 bytes .../OpenGL-transparentAlphaChannelRef.png | Bin 30159 -> 0 bytes .../OpenGL-transparentReflection2Layer.png | Bin 28714 -> 0 bytes tests/media/OpenGL-transparentVertexAlpha.png | Bin 29717 -> 0 bytes ...enGL-transparentVertexAlphaChannelMore.png | Bin 4929 -> 0 bytes tests/media/OpenGL-tri_select1.png | Bin 1127 -> 0 bytes tests/media/OpenGL-tri_select2.png | Bin 1294 -> 0 bytes tests/media/OpenGL-tri_select3.png | Bin 2177 -> 0 bytes tests/media/OpenGL-ucpsphere.png | Bin 2393 -> 0 bytes tests/media/OpenGL-viewPortText.png | Bin 8172 -> 0 bytes tests/media/RedbrushAlpha-0.25.png | Bin 35945 -> 0 bytes tests/media/attributes.xml | 4 - tests/media/cdata.xml | 14 - tests/media/enc.zip | Bin 18108 -> 0 bytes tests/media/file_with_path.npk | Bin 213 -> 0 bytes tests/media/file_with_path.zip | Bin 660 -> 0 bytes tests/media/file_with_path/mypath/myfile.txt | 1 - .../file_with_path/mypath/mypath/myfile.txt | 1 - tests/media/file_with_path/test/test.txt | 1 - tests/media/fireball.png | Bin 974 -> 0 bytes tests/media/grey.tga | Bin 65580 -> 0 bytes tests/media/licenses.txt | 7 - tests/media/lzmadata.zip | Bin 57623 -> 0 bytes tests/media/sample_pakfile.pak | Bin 226 -> 0 bytes tests/media/scene.irr | Bin 66648 -> 0 bytes tests/media/scene2.irr | Bin 22194 -> 0 bytes tests/media/sydney.bmp | Bin 60522 -> 0 bytes tests/media/sydney.md2 | Bin 302128 -> 0 bytes tests/media/ter1.png | Bin 41095 -> 0 bytes tests/media/test.xml | 5 - tests/media/title_font.png | Bin 190372 -> 0 bytes tests/media/title_font.xml | Bin 21356 -> 0 bytes tests/media/title_font_2.png | Bin 157760 -> 0 bytes tests/media/tools.png | Bin 845 -> 0 bytes tests/meshLoaders.cpp | 37 - tests/meshTransform.cpp | 88 - tests/mrt.cpp | 138 - tests/orthoCam.cpp | 105 - tests/planeMatrix.cpp | 244 - tests/projectionMatrix.cpp | 86 - tests/removeCustomAnimator.cpp | 52 - tests/renderTargetTexture.cpp | 604 - tests/sceneCollisionManager.cpp | 471 - tests/sceneNodeAnimator.cpp | 117 - tests/screenshot.cpp | 83 - tests/serializeAttributes.cpp | 378 - tests/skinnedMesh.cpp | 75 - tests/softwareDevice.cpp | 56 - tests/stencilshadow.cpp | 108 - tests/terrainSceneNode.cpp | 128 - tests/testDimension2d.cpp | 36 - tests/testGeometryCreator.cpp | 127 - tests/testLine2d.cpp | 301 - tests/testQuaternion.cpp | 329 - tests/testS3DVertex.cpp | 47 - tests/testUtils.cpp | 523 - tests/testUtils.h | 110 - tests/testVector2d.cpp | 221 - tests/testVector3d.cpp | 312 - tests/testXML.cpp | 169 - tests/testaabbox.cpp | 405 - tests/tests-last-passed-at.txt | 4 - tests/tests-readme.txt | 227 - tests/tests.cbp | 159 - tests/tests.workspace | 7 - tests/tests_vc10.sln | 76 - tests/tests_vc10.vcxproj | 239 - tests/tests_vc11.sln | 76 - tests/tests_vc11.vcxproj | 239 - tests/tests_vc12.sln | 88 - tests/tests_vc12.vcxproj | 239 - tests/tests_vc14.sln | 88 - tests/tests_vc14.vcxproj | 239 - tests/textureFeatures.cpp | 454 - tests/textureRenderStates.cpp | 362 - tests/timer.cpp | 66 - tests/transparentMaterials.cpp | 371 - tests/triangle3d.cpp | 281 - tests/triangleSelector.cpp | 300 - tests/userClipPlane.cpp | 69 - tests/vectorPositionDimension2d.cpp | 93 - tests/videoDriver.cpp | 44 - tests/viewPort.cpp | 79 - tests/writeImageToFile.cpp | 137 - 1103 files changed, 41 insertions(+), 216490 deletions(-) delete mode 100644 examples/01.HelloWorld/HelloWorld.cbp delete mode 100644 examples/01.HelloWorld/HelloWorld.vcproj delete mode 100644 examples/01.HelloWorld/HelloWorld.xcodeproj/project.pbxproj delete mode 100644 examples/01.HelloWorld/HelloWorld.xcodeproj/xcshareddata/xcschemes/01.HelloWorld.xcscheme delete mode 100644 examples/01.HelloWorld/HelloWorld_vc10.vcxproj delete mode 100644 examples/01.HelloWorld/HelloWorld_vc11.vcxproj delete mode 100644 examples/01.HelloWorld/HelloWorld_vc12.vcxproj delete mode 100644 examples/01.HelloWorld/HelloWorld_vc14.vcxproj delete mode 100644 examples/01.HelloWorld/Makefile delete mode 100644 examples/01.HelloWorld/main.cpp delete mode 100644 examples/01.HelloWorld/tutorial.html delete mode 100755 examples/01.HelloWorld_Android/AndroidManifest.xml delete mode 100644 examples/01.HelloWorld_Android/android_tools.cpp delete mode 100644 examples/01.HelloWorld_Android/android_tools.h delete mode 100755 examples/01.HelloWorld_Android/build.xml delete mode 100755 examples/01.HelloWorld_Android/jni/Android.mk delete mode 100755 examples/01.HelloWorld_Android/jni/Application.mk delete mode 100644 examples/01.HelloWorld_Android/main.cpp delete mode 100755 examples/01.HelloWorld_Android/project.properties delete mode 100644 examples/01.HelloWorld_Android/readme.txt delete mode 100755 examples/01.HelloWorld_Android/res/drawable-hdpi/irr_icon.png delete mode 100755 examples/01.HelloWorld_Android/res/drawable-ldpi/irr_icon.png delete mode 100755 examples/01.HelloWorld_Android/res/drawable-mdpi/irr_icon.png delete mode 100755 examples/01.HelloWorld_Android/res/drawable-xhdpi/irr_icon.png delete mode 100644 examples/01.HelloWorld_emscripten/Makefile delete mode 100644 examples/01.HelloWorld_emscripten/main.cpp delete mode 100644 examples/01.HelloWorld_emscripten/readme.txt delete mode 100644 examples/01.HelloWorld_emscripten/shell_minimal.html delete mode 100644 examples/01.HelloWorld_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/project.pbxproj delete mode 100644 examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/xcshareddata/xcschemes/28.HelloWorld_iOS.xcscheme delete mode 100644 examples/01.HelloWorld_iOS/main.cpp delete mode 100644 examples/02.Quake3Map/Makefile delete mode 100644 examples/02.Quake3Map/Quake3Map.cbp delete mode 100644 examples/02.Quake3Map/Quake3Map.vcproj delete mode 100644 examples/02.Quake3Map/Quake3Map.xcodeproj/project.pbxproj delete mode 100644 examples/02.Quake3Map/Quake3Map.xcodeproj/xcshareddata/xcschemes/02.Quake3Map.xcscheme delete mode 100644 examples/02.Quake3Map/Quake3Map_vc10.vcxproj delete mode 100644 examples/02.Quake3Map/Quake3Map_vc11.vcxproj delete mode 100644 examples/02.Quake3Map/Quake3Map_vc12.vcxproj delete mode 100644 examples/02.Quake3Map/Quake3Map_vc14.vcxproj delete mode 100644 examples/02.Quake3Map/main.cpp delete mode 100644 examples/02.Quake3Map/tutorial.html delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode.cbp delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode.vcproj delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/project.pbxproj delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/xcshareddata/xcschemes/03.CustomSceneNode.xcscheme delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode_vc10.vcxproj delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode_vc11.vcxproj delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode_vc12.vcxproj delete mode 100644 examples/03.CustomSceneNode/CustomSceneNode_vc14.vcxproj delete mode 100644 examples/03.CustomSceneNode/Makefile delete mode 100644 examples/03.CustomSceneNode/main.cpp delete mode 100644 examples/03.CustomSceneNode/tutorial.html delete mode 100644 examples/04.Movement/Makefile delete mode 100644 examples/04.Movement/Movement.cbp delete mode 100644 examples/04.Movement/Movement.vcproj delete mode 100644 examples/04.Movement/Movement.xcodeproj/project.pbxproj delete mode 100644 examples/04.Movement/Movement.xcodeproj/xcshareddata/xcschemes/04.Movement.xcscheme delete mode 100644 examples/04.Movement/Movement_vc10.vcxproj delete mode 100644 examples/04.Movement/Movement_vc11.vcxproj delete mode 100644 examples/04.Movement/Movement_vc12.vcxproj delete mode 100644 examples/04.Movement/Movement_vc14.vcxproj delete mode 100644 examples/04.Movement/main.cpp delete mode 100644 examples/04.Movement/tutorial.html delete mode 100644 examples/05.UserInterface/Makefile delete mode 100644 examples/05.UserInterface/UserInterface.cbp delete mode 100644 examples/05.UserInterface/UserInterface.vcproj delete mode 100644 examples/05.UserInterface/UserInterface.xcodeproj/project.pbxproj delete mode 100644 examples/05.UserInterface/UserInterface.xcodeproj/xcshareddata/xcschemes/05.UserInterface.xcscheme delete mode 100644 examples/05.UserInterface/UserInterface_vc10.vcxproj delete mode 100644 examples/05.UserInterface/UserInterface_vc11.vcxproj delete mode 100644 examples/05.UserInterface/UserInterface_vc12.vcxproj delete mode 100644 examples/05.UserInterface/UserInterface_vc14.vcxproj delete mode 100644 examples/05.UserInterface/main.cpp delete mode 100644 examples/05.UserInterface/tutorial.html delete mode 100644 examples/06.2DGraphics/2DGraphics.cbp delete mode 100644 examples/06.2DGraphics/2DGraphics.vcproj delete mode 100644 examples/06.2DGraphics/2DGraphics.xcodeproj/project.pbxproj delete mode 100644 examples/06.2DGraphics/2DGraphics.xcodeproj/xcshareddata/xcschemes/06.2DGraphics.xcscheme delete mode 100644 examples/06.2DGraphics/2DGraphics_vc10.vcxproj delete mode 100644 examples/06.2DGraphics/2DGraphics_vc11.vcxproj delete mode 100644 examples/06.2DGraphics/2DGraphics_vc12.vcxproj delete mode 100644 examples/06.2DGraphics/2DGraphics_vc14.vcxproj delete mode 100644 examples/06.2DGraphics/Makefile delete mode 100644 examples/06.2DGraphics/main.cpp delete mode 100644 examples/06.2DGraphics/tutorial.html delete mode 100644 examples/07.Collision/Collision.cbp delete mode 100644 examples/07.Collision/Collision.vcproj delete mode 100644 examples/07.Collision/Collision.xcodeproj/project.pbxproj delete mode 100644 examples/07.Collision/Collision.xcodeproj/xcshareddata/xcschemes/07.Collision.xcscheme delete mode 100644 examples/07.Collision/Collision_vc10.vcxproj delete mode 100644 examples/07.Collision/Collision_vc11.vcxproj delete mode 100644 examples/07.Collision/Collision_vc12.vcxproj delete mode 100644 examples/07.Collision/Collision_vc14.vcxproj delete mode 100644 examples/07.Collision/Makefile delete mode 100644 examples/07.Collision/main.cpp delete mode 100644 examples/07.Collision/tutorial.html delete mode 100644 examples/08.SpecialFX/Makefile delete mode 100644 examples/08.SpecialFX/SpecialFX.cbp delete mode 100644 examples/08.SpecialFX/SpecialFX.vcproj delete mode 100644 examples/08.SpecialFX/SpecialFX.xcodeproj/project.pbxproj delete mode 100644 examples/08.SpecialFX/SpecialFX.xcodeproj/xcshareddata/xcschemes/08.SpecialFX.xcscheme delete mode 100644 examples/08.SpecialFX/SpecialFX_vc10.vcxproj delete mode 100644 examples/08.SpecialFX/SpecialFX_vc11.vcxproj delete mode 100644 examples/08.SpecialFX/SpecialFX_vc12.vcxproj delete mode 100644 examples/08.SpecialFX/SpecialFX_vc14.vcxproj delete mode 100644 examples/08.SpecialFX/main.cpp delete mode 100644 examples/08.SpecialFX/project.properties delete mode 100644 examples/08.SpecialFX/tutorial.html delete mode 100644 examples/09.Meshviewer/9.Meshviewer.rc delete mode 100644 examples/09.Meshviewer/Makefile delete mode 100644 examples/09.Meshviewer/Meshviewer.cbp delete mode 100644 examples/09.Meshviewer/Meshviewer.vcproj delete mode 100644 examples/09.Meshviewer/Meshviewer.xcodeproj/project.pbxproj delete mode 100644 examples/09.Meshviewer/Meshviewer.xcodeproj/xcshareddata/xcschemes/09.Meshviewer.xcscheme delete mode 100644 examples/09.Meshviewer/Meshviewer_vc10.vcxproj delete mode 100644 examples/09.Meshviewer/Meshviewer_vc11.vcxproj delete mode 100644 examples/09.Meshviewer/Meshviewer_vc12.vcxproj delete mode 100644 examples/09.Meshviewer/Meshviewer_vc14.vcxproj delete mode 100644 examples/09.Meshviewer/icon.ico delete mode 100644 examples/09.Meshviewer/main.cpp delete mode 100644 examples/09.Meshviewer/resource.h delete mode 100644 examples/09.Meshviewer/tutorial.html delete mode 100644 examples/10.Shaders/Makefile delete mode 100644 examples/10.Shaders/Shaders.cbp delete mode 100644 examples/10.Shaders/Shaders.vcproj delete mode 100644 examples/10.Shaders/Shaders.xcodeproj/project.pbxproj delete mode 100644 examples/10.Shaders/Shaders.xcodeproj/xcshareddata/xcschemes/10.Shaders.xcscheme delete mode 100644 examples/10.Shaders/Shaders_vc10.vcxproj delete mode 100644 examples/10.Shaders/Shaders_vc11.vcxproj delete mode 100644 examples/10.Shaders/Shaders_vc12.vcxproj delete mode 100644 examples/10.Shaders/Shaders_vc14.vcxproj delete mode 100644 examples/10.Shaders/main.cpp delete mode 100644 examples/10.Shaders/tutorial.html delete mode 100644 examples/11.PerPixelLighting/Makefile delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting.cbp delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting.vcproj delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/project.pbxproj delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/xcshareddata/xcschemes/11.PerPixelLighting.xcscheme delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting_vc10.vcxproj delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting_vc11.vcxproj delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting_vc12.vcxproj delete mode 100644 examples/11.PerPixelLighting/PerPixelLighting_vc14.vcxproj delete mode 100644 examples/11.PerPixelLighting/main.cpp delete mode 100644 examples/11.PerPixelLighting/tutorial.html delete mode 100644 examples/12.TerrainRendering/Makefile delete mode 100644 examples/12.TerrainRendering/TerrainRendering.cbp delete mode 100644 examples/12.TerrainRendering/TerrainRendering.vcproj delete mode 100644 examples/12.TerrainRendering/TerrainRendering.xcodeproj/project.pbxproj delete mode 100644 examples/12.TerrainRendering/TerrainRendering.xcodeproj/xcshareddata/xcschemes/12.TerrainRendering.xcscheme delete mode 100644 examples/12.TerrainRendering/TerrainRendering_vc10.vcxproj delete mode 100644 examples/12.TerrainRendering/TerrainRendering_vc11.vcxproj delete mode 100644 examples/12.TerrainRendering/TerrainRendering_vc12.vcxproj delete mode 100644 examples/12.TerrainRendering/TerrainRendering_vc14.vcxproj delete mode 100644 examples/12.TerrainRendering/main.cpp delete mode 100644 examples/12.TerrainRendering/tutorial.html delete mode 100644 examples/13.RenderToTexture/Makefile delete mode 100644 examples/13.RenderToTexture/RenderToTexture.cbp delete mode 100644 examples/13.RenderToTexture/RenderToTexture.vcproj delete mode 100644 examples/13.RenderToTexture/RenderToTexture.xcodeproj/project.pbxproj delete mode 100644 examples/13.RenderToTexture/RenderToTexture.xcodeproj/xcshareddata/xcschemes/13.RenderToTexture.xcscheme delete mode 100644 examples/13.RenderToTexture/RenderToTexture_vc10.vcxproj delete mode 100644 examples/13.RenderToTexture/RenderToTexture_vc11.vcxproj delete mode 100644 examples/13.RenderToTexture/RenderToTexture_vc12.vcxproj delete mode 100644 examples/13.RenderToTexture/RenderToTexture_vc14.vcxproj delete mode 100644 examples/13.RenderToTexture/main.cpp delete mode 100644 examples/13.RenderToTexture/tutorial.html delete mode 100644 examples/13.RenderToTexture_emscripten/Makefile delete mode 100644 examples/13.RenderToTexture_emscripten/main.cpp delete mode 100644 examples/14.Win32Window/Makefile delete mode 100644 examples/14.Win32Window/Win32Window.cbp delete mode 100644 examples/14.Win32Window/Win32Window.vcproj delete mode 100644 examples/14.Win32Window/Win32Window_vc10.vcxproj delete mode 100644 examples/14.Win32Window/Win32Window_vc11.vcxproj delete mode 100644 examples/14.Win32Window/Win32Window_vc12.vcxproj delete mode 100644 examples/14.Win32Window/Win32Window_vc14.vcxproj delete mode 100644 examples/14.Win32Window/main.cpp delete mode 100644 examples/14.Win32Window/tutorial.html delete mode 100644 examples/16.Quake3MapShader/Makefile delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader.cbp delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader.vcproj delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/project.pbxproj delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/xcshareddata/xcschemes/16.Quake3MapShader.xcscheme delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader_vc10.vcxproj delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader_vc11.vcxproj delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader_vc12.vcxproj delete mode 100644 examples/16.Quake3MapShader/Quake3MapShader_vc14.vcxproj delete mode 100644 examples/16.Quake3MapShader/main.cpp delete mode 100644 examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v8.vcproj delete mode 100644 examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v9.vcproj delete mode 100644 examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc10.vcxproj delete mode 100644 examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc11.vcxproj delete mode 100644 examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc12.vcxproj delete mode 100644 examples/17.HelloWorld_Mobile/HelloWorld_mobile.sln delete mode 100644 examples/17.HelloWorld_Mobile/HelloWorld_mobile.vcproj delete mode 100644 examples/17.HelloWorld_Mobile/Makefile delete mode 100644 examples/17.HelloWorld_Mobile/main.cpp delete mode 100644 examples/18.SplitScreen/Makefile delete mode 100644 examples/18.SplitScreen/SplitScreen.cbp delete mode 100644 examples/18.SplitScreen/SplitScreen.vcproj delete mode 100644 examples/18.SplitScreen/SplitScreen.xcodeproj/project.pbxproj delete mode 100644 examples/18.SplitScreen/SplitScreen.xcodeproj/xcshareddata/xcschemes/18.SplitScreen.xcscheme delete mode 100644 examples/18.SplitScreen/SplitScreen_vc10.vcxproj delete mode 100644 examples/18.SplitScreen/SplitScreen_vc11.vcxproj delete mode 100644 examples/18.SplitScreen/SplitScreen_vc12.vcxproj delete mode 100644 examples/18.SplitScreen/SplitScreen_vc14.vcxproj delete mode 100644 examples/18.SplitScreen/main.cpp delete mode 100644 examples/19.MouseAndJoystick/Makefile delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick.cbp delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick.vcproj delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/project.pbxproj delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/xcshareddata/xcschemes/19.MouseAndJoystick.xcscheme delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick_vc10.vcxproj delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick_vc11.vcxproj delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick_vc12.vcxproj delete mode 100644 examples/19.MouseAndJoystick/MouseAndJoystick_vc14.vcxproj delete mode 100644 examples/19.MouseAndJoystick/main.cpp delete mode 100644 examples/20.ManagedLights/Makefile delete mode 100644 examples/20.ManagedLights/ManagedLights.cbp delete mode 100644 examples/20.ManagedLights/ManagedLights.vcproj delete mode 100644 examples/20.ManagedLights/ManagedLights.xcodeproj/project.pbxproj delete mode 100644 examples/20.ManagedLights/ManagedLights.xcodeproj/xcshareddata/xcschemes/20.ManagedLights.xcscheme delete mode 100644 examples/20.ManagedLights/ManagedLights_vc10.vcxproj delete mode 100644 examples/20.ManagedLights/ManagedLights_vc11.vcxproj delete mode 100644 examples/20.ManagedLights/ManagedLights_vc12.vcxproj delete mode 100644 examples/20.ManagedLights/ManagedLights_vc14.vcxproj delete mode 100644 examples/20.ManagedLights/main.cpp delete mode 100644 examples/21.Quake3Explorer/Makefile delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer.cbp delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer.vcproj delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/project.pbxproj delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/xcshareddata/xcschemes/21.Quake3Explorer.xcscheme delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer_vc10.vcxproj delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer_vc11.vcxproj delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer_vc12.vcxproj delete mode 100644 examples/21.Quake3Explorer/Quake3Explorer_vc14.vcxproj delete mode 100644 examples/21.Quake3Explorer/main.cpp delete mode 100644 examples/21.Quake3Explorer/q3factory.cpp delete mode 100644 examples/21.Quake3Explorer/q3factory.h delete mode 100644 examples/21.Quake3Explorer/sound.cpp delete mode 100644 examples/21.Quake3Explorer/sound.h delete mode 100644 examples/22.MaterialViewer/Makefile delete mode 100644 examples/22.MaterialViewer/MaterialViewer.cbp delete mode 100644 examples/22.MaterialViewer/MaterialViewer.vcproj delete mode 100644 examples/22.MaterialViewer/MaterialViewer.xcodeproj/project.pbxproj delete mode 100644 examples/22.MaterialViewer/MaterialViewer.xcodeproj/xcshareddata/xcschemes/22.MaterialViewer.xcscheme delete mode 100644 examples/22.MaterialViewer/MaterialViewer_vc10.vcxproj delete mode 100644 examples/22.MaterialViewer/MaterialViewer_vc11.vcxproj delete mode 100644 examples/22.MaterialViewer/MaterialViewer_vc12.vcxproj delete mode 100644 examples/22.MaterialViewer/MaterialViewer_vc14.vcxproj delete mode 100755 examples/22.MaterialViewer/main.cpp delete mode 100644 examples/22.MaterialViewer/main.h delete mode 100644 examples/23.SMeshHandling/Makefile delete mode 100644 examples/23.SMeshHandling/SMeshHandling.cbp delete mode 100644 examples/23.SMeshHandling/SMeshHandling.vcproj delete mode 100644 examples/23.SMeshHandling/SMeshHandling.xcodeproj/project.pbxproj delete mode 100644 examples/23.SMeshHandling/SMeshHandling.xcodeproj/xcshareddata/xcschemes/23.SMeshHandling.xcscheme delete mode 100644 examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj delete mode 100644 examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj delete mode 100644 examples/23.SMeshHandling/SMeshHandling_vc12.vcxproj delete mode 100644 examples/23.SMeshHandling/SMeshHandling_vc14.vcxproj delete mode 100644 examples/23.SMeshHandling/main.cpp delete mode 100644 examples/24.CursorControl/CursorControl.cbp delete mode 100644 examples/24.CursorControl/CursorControl.vcproj delete mode 100644 examples/24.CursorControl/CursorControl.xcodeproj/project.pbxproj delete mode 100644 examples/24.CursorControl/CursorControl.xcodeproj/xcshareddata/xcschemes/24.CursorControl.xcscheme delete mode 100644 examples/24.CursorControl/CursorControl_vc10.vcxproj delete mode 100644 examples/24.CursorControl/CursorControl_vc11.vcxproj delete mode 100644 examples/24.CursorControl/CursorControl_vc12.vcxproj delete mode 100644 examples/24.CursorControl/CursorControl_vc14.vcxproj delete mode 100644 examples/24.CursorControl/Makefile delete mode 100644 examples/24.CursorControl/main.cpp delete mode 100644 examples/26.OcclusionQuery/Makefile delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery.cbp delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery.vcproj delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/project.pbxproj delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/xcshareddata/xcschemes/26.OcclusionQuery.xcscheme delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery_vc10.vcxproj delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery_vc11.vcxproj delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery_vc12.vcxproj delete mode 100644 examples/26.OcclusionQuery/OcclusionQuery_vc14.vcxproj delete mode 100644 examples/26.OcclusionQuery/main.cpp delete mode 100644 examples/27.PostProcessing/Makefile delete mode 100644 examples/27.PostProcessing/PostProcessing.cbp delete mode 100644 examples/27.PostProcessing/PostProcessing_vc10.vcxproj delete mode 100644 examples/27.PostProcessing/PostProcessing_vc11.vcxproj delete mode 100644 examples/27.PostProcessing/PostProcessing_vc12.vcxproj delete mode 100644 examples/27.PostProcessing/PostProcessing_vc14.vcxproj delete mode 100644 examples/27.PostProcessing/main.cpp delete mode 100644 examples/28.CubeMapping/CubeMapping.cbp delete mode 100644 examples/28.CubeMapping/CubeMapping_vc10.vcxproj delete mode 100644 examples/28.CubeMapping/CubeMapping_vc11.vcxproj delete mode 100644 examples/28.CubeMapping/CubeMapping_vc12.vcxproj delete mode 100644 examples/28.CubeMapping/CubeMapping_vc14.vcxproj delete mode 100644 examples/28.CubeMapping/Makefile delete mode 100644 examples/28.CubeMapping/main.cpp delete mode 100644 examples/29.HardwareSkinning/where_is_it.txt delete mode 100644 examples/30.Profiling/Makefile delete mode 100644 examples/30.Profiling/Profiling.cbp delete mode 100644 examples/30.Profiling/Profiling.vcproj delete mode 100644 examples/30.Profiling/Profiling.xcodeproj/project.pbxproj delete mode 100644 examples/30.Profiling/Profiling.xcodeproj/xcshareddata/xcschemes/30.Profiling.xcscheme delete mode 100644 examples/30.Profiling/Profiling_vc10.vcxproj delete mode 100644 examples/30.Profiling/Profiling_vc11.vcxproj delete mode 100644 examples/30.Profiling/Profiling_vc12.vcxproj delete mode 100644 examples/30.Profiling/Profiling_vc14.vcxproj delete mode 100644 examples/30.Profiling/main.cpp delete mode 100644 examples/BuildAllExamples.workspace delete mode 100644 examples/BuildAllExamples.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/BuildAllExamples_vc10.sln delete mode 100644 examples/BuildAllExamples_vc11.sln delete mode 100644 examples/BuildAllExamples_vc12.sln delete mode 100644 examples/BuildAllExamples_vc14.sln delete mode 100644 examples/Demo/CDemo.cpp delete mode 100644 examples/Demo/CDemo.h delete mode 100644 examples/Demo/CMainMenu.cpp delete mode 100644 examples/Demo/CMainMenu.h delete mode 100644 examples/Demo/Demo.vcproj delete mode 100644 examples/Demo/Demo.xcodeproj/project.pbxproj delete mode 100644 examples/Demo/Demo.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme delete mode 100644 examples/Demo/Demo_vc10.vcxproj delete mode 100644 examples/Demo/Demo_vc11.vcxproj delete mode 100644 examples/Demo/Demo_vc12.vcxproj delete mode 100644 examples/Demo/Demo_vc14.vcxproj delete mode 100644 examples/Demo/Makefile delete mode 100644 examples/Demo/demo.cbp delete mode 100644 examples/Demo/icon.ico delete mode 100644 examples/Demo/main.cpp delete mode 100644 examples/Demo/resource.h delete mode 100644 examples/Demo/resscript.rc delete mode 100755 examples/buildAllExamples.sh delete mode 100644 examples/whereAreTheBinaries.txt delete mode 100644 include/ESceneNodeAnimatorTypes.h delete mode 100644 include/IAnimatedMeshMD2.h delete mode 100644 include/IAnimatedMeshMD3.h delete mode 100644 include/IBillboardTextSceneNode.h delete mode 100644 include/IGeometryCreator.h delete mode 100644 include/ILightManager.h delete mode 100644 include/ILightSceneNode.h delete mode 100644 include/IMeshTextureLoader.h delete mode 100644 include/IMetaTriangleSelector.h delete mode 100644 include/IOctreeSceneNode.h delete mode 100644 include/IParticleAffector.h delete mode 100644 include/IParticleAnimatedMeshSceneNodeEmitter.h delete mode 100644 include/IParticleAttractionAffector.h delete mode 100644 include/IParticleBoxEmitter.h delete mode 100644 include/IParticleCylinderEmitter.h delete mode 100644 include/IParticleEmitter.h delete mode 100644 include/IParticleFadeOutAffector.h delete mode 100644 include/IParticleGravityAffector.h delete mode 100644 include/IParticleMeshEmitter.h delete mode 100644 include/IParticleRingEmitter.h delete mode 100644 include/IParticleRotationAffector.h delete mode 100644 include/IParticleSphereEmitter.h delete mode 100644 include/IParticleSystemSceneNode.h delete mode 100644 include/IQ3LevelMesh.h delete mode 100644 include/IQ3Shader.h delete mode 100644 include/ISceneCollisionManager.h delete mode 100644 include/ISceneNodeAnimator.h delete mode 100644 include/ISceneNodeAnimatorCameraFPS.h delete mode 100644 include/ISceneNodeAnimatorCameraMaya.h delete mode 100644 include/ISceneNodeAnimatorCollisionResponse.h delete mode 100644 include/ISceneNodeAnimatorFactory.h delete mode 100644 include/IShadowVolumeSceneNode.h delete mode 100644 include/ITerrainSceneNode.h delete mode 100644 include/ITextSceneNode.h delete mode 100644 include/ITriangleSelector.h delete mode 100644 include/IVolumeLightSceneNode.h delete mode 100644 media/2ddemo.png delete mode 100644 media/Faerie5.BMP delete mode 100644 media/IrrlichtTheme.ogg delete mode 100644 media/Particle.tga delete mode 100644 media/axe.jpg delete mode 100644 media/ball.wav delete mode 100644 media/bigfont.png delete mode 100644 media/burninglogo.png delete mode 100644 media/config.xml create mode 100755 media/coolguy_opt.x create mode 100755 media/cooltexture.png delete mode 100644 media/cubeMapReflection.frag delete mode 100644 media/cubeMapReflection.vert delete mode 100644 media/cubeMapReflectionPS.hlsl delete mode 100644 media/cubeMapReflectionVS.hlsl delete mode 100644 media/cubemap_license.txt delete mode 100644 media/cubemap_negx.jpg delete mode 100644 media/cubemap_negy.jpg delete mode 100644 media/cubemap_negz.jpg delete mode 100644 media/cubemap_posx.jpg delete mode 100644 media/cubemap_posy.jpg delete mode 100644 media/cubemap_posz.jpg delete mode 100644 media/d3d9.hlsl delete mode 100644 media/d3d9.psh delete mode 100644 media/d3d9.vsh delete mode 100644 media/demoback.jpg delete mode 100644 media/detailmap3.jpg delete mode 100644 media/directxlogo.png delete mode 100644 media/dotnetback.jpg delete mode 100644 media/dwarf-Read-Me.txt delete mode 100644 media/dwarf.jpg delete mode 100644 media/dwarf.x delete mode 100644 media/earth.jpg delete mode 100644 media/earth.x delete mode 100644 media/earthbump.jpg delete mode 100644 media/enano.jpg delete mode 100644 media/example.irr delete mode 100644 media/example_screenshots/001shot.jpg delete mode 100644 media/example_screenshots/002shot.jpg delete mode 100644 media/example_screenshots/003shot.jpg delete mode 100644 media/example_screenshots/004shot.jpg delete mode 100644 media/example_screenshots/005shot.jpg delete mode 100644 media/example_screenshots/006shot.jpg delete mode 100644 media/example_screenshots/007shot.jpg delete mode 100644 media/example_screenshots/008shot.jpg delete mode 100644 media/example_screenshots/009shot.jpg delete mode 100644 media/example_screenshots/010shot.jpg delete mode 100644 media/example_screenshots/011shot.jpg delete mode 100644 media/example_screenshots/012shot.jpg delete mode 100644 media/example_screenshots/013shot.jpg delete mode 100644 media/example_screenshots/014shot.jpg delete mode 100644 media/example_screenshots/015shot.jpg delete mode 100644 media/example_screenshots/016shot.jpg delete mode 100644 media/example_screenshots/017shot.jpg delete mode 100644 media/example_screenshots/018shot.jpg delete mode 100644 media/example_screenshots/019shot.jpg delete mode 100644 media/example_screenshots/020shot.jpg delete mode 100644 media/example_screenshots/021shot.jpg delete mode 100644 media/example_screenshots/022shot.jpg delete mode 100644 media/example_screenshots/023shot.jpg delete mode 100644 media/example_screenshots/024shot.jpg delete mode 100644 media/example_screenshots/025shot.jpg delete mode 100644 media/example_screenshots/026shot.jpg delete mode 100644 media/example_screenshots/027shot.jpg delete mode 100644 media/example_screenshots/028shot.jpg delete mode 100644 media/faerie.md2 delete mode 100644 media/faerie2.bmp delete mode 100644 media/fire.bmp delete mode 100644 media/fireball.bmp delete mode 100644 media/fontcourier.bmp delete mode 100644 media/fonthaettenschweiler.bmp delete mode 100644 media/fontlucida.png delete mode 100644 media/gun.jpg delete mode 100644 media/gun.md2 delete mode 100644 media/help.png delete mode 100644 media/icon_crosshairs16x16bw1.png delete mode 100644 media/icon_crosshairs16x16bw2.png delete mode 100644 media/icon_crosshairs16x16bw3.png delete mode 100644 media/icon_crosshairs16x16col.png delete mode 100644 media/iconlist.png delete mode 100644 media/impact.wav delete mode 100644 media/info_ios.plist delete mode 100644 media/info_osx.plist delete mode 100644 media/irr.ico delete mode 100644 media/irrlicht.dat delete mode 100644 media/irrlicht2_bk.jpg delete mode 100644 media/irrlicht2_dn.jpg delete mode 100644 media/irrlicht2_ft.jpg delete mode 100644 media/irrlicht2_lf.jpg delete mode 100644 media/irrlicht2_rt.jpg delete mode 100644 media/irrlicht2_up.jpg delete mode 100644 media/irrlichtlogo.BMP delete mode 100644 media/irrlichtlogo.jpg delete mode 100644 media/irrlichtlogo2.png delete mode 100644 media/irrlichtlogo3.png delete mode 100644 media/irrlichtlogoaligned.jpg delete mode 100644 media/irrlichtlogoalpha.tga delete mode 100644 media/irrlichtlogoalpha2.tga delete mode 100644 media/lightFalloff.png delete mode 100644 media/lucida.xml delete mode 100644 media/lucida0.png delete mode 100644 media/map-20kdm2.pk3 delete mode 100644 media/map-20kdm2.txt delete mode 100644 media/ninja animation ranges.txt delete mode 100644 media/ninja.b3d delete mode 100644 media/nskinbl.jpg delete mode 100644 media/nskinrd.jpg delete mode 100644 media/ogles2.frag delete mode 100644 media/ogles2.vert delete mode 100644 media/open.png delete mode 100644 media/opengl.frag delete mode 100644 media/opengl.psh delete mode 100644 media/opengl.vert delete mode 100644 media/opengl.vsh delete mode 100644 media/opengllogo.png delete mode 100644 media/particle.bmp delete mode 100644 media/particlegreen.jpg delete mode 100644 media/particlered.bmp delete mode 100644 media/particlewhite.bmp delete mode 100644 media/portal1.bmp delete mode 100644 media/portal2.bmp delete mode 100644 media/portal3.bmp delete mode 100644 media/portal4.bmp delete mode 100644 media/portal5.bmp delete mode 100644 media/portal6.bmp delete mode 100644 media/portal7.bmp delete mode 100644 media/pp_d3d9.hlsl delete mode 100644 media/pp_opengl.frag delete mode 100644 media/pp_opengl.vert delete mode 100644 media/rockwall.jpg delete mode 100644 media/rockwall_height.bmp delete mode 100644 media/room.3ds delete mode 100644 media/rsptnback.jpg delete mode 100644 media/skydome.jpg delete mode 100644 media/skydome2.jpg delete mode 100644 media/smoke.bmp delete mode 100644 media/smoke2.jpg delete mode 100644 media/smoke3.jpg delete mode 100644 media/spheremap.jpg delete mode 100644 media/stones.jpg delete mode 100644 media/sydney.bmp delete mode 100644 media/sydney.md2 delete mode 100644 media/t351sml.jpg delete mode 100644 media/terrain-heightmap.bmp delete mode 100644 media/terrain-texture.jpg delete mode 100644 media/tools.png delete mode 100644 media/vc6include.jpg delete mode 100644 media/vc6optionsdir.jpg delete mode 100644 media/vcnetinclude.jpg delete mode 100644 media/wall.bmp delete mode 100644 media/wall.jpg delete mode 100644 media/water.jpg delete mode 100644 media/yodan mdl - readme.txt delete mode 100644 media/yodan.mdl delete mode 100644 media/zip.png delete mode 100644 source/Irrlicht/C3DSMeshFileLoader.cpp delete mode 100644 source/Irrlicht/C3DSMeshFileLoader.h delete mode 100644 source/Irrlicht/CAnimatedMeshHalfLife.cpp delete mode 100644 source/Irrlicht/CAnimatedMeshHalfLife.h delete mode 100644 source/Irrlicht/CAnimatedMeshMD2.cpp delete mode 100644 source/Irrlicht/CAnimatedMeshMD2.h delete mode 100644 source/Irrlicht/CAnimatedMeshMD3.cpp delete mode 100644 source/Irrlicht/CAnimatedMeshMD3.h delete mode 100644 source/Irrlicht/CBSPMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CBSPMeshFileLoader.h delete mode 100644 source/Irrlicht/CBurningShader_Raster_Reference.cpp delete mode 100644 source/Irrlicht/CCSMLoader.cpp delete mode 100644 source/Irrlicht/CCSMLoader.h delete mode 100644 source/Irrlicht/CCubeSceneNode.cpp delete mode 100644 source/Irrlicht/CCubeSceneNode.h delete mode 100644 source/Irrlicht/CD3D9Driver.cpp delete mode 100644 source/Irrlicht/CD3D9Driver.h delete mode 100644 source/Irrlicht/CD3D9HLSLMaterialRenderer.cpp delete mode 100644 source/Irrlicht/CD3D9HLSLMaterialRenderer.h delete mode 100644 source/Irrlicht/CD3D9MaterialRenderer.h delete mode 100644 source/Irrlicht/CD3D9NormalMapRenderer.cpp delete mode 100644 source/Irrlicht/CD3D9NormalMapRenderer.h delete mode 100644 source/Irrlicht/CD3D9ParallaxMapRenderer.cpp delete mode 100644 source/Irrlicht/CD3D9ParallaxMapRenderer.h delete mode 100644 source/Irrlicht/CD3D9RenderTarget.cpp delete mode 100644 source/Irrlicht/CD3D9RenderTarget.h delete mode 100644 source/Irrlicht/CD3D9ShaderMaterialRenderer.cpp delete mode 100644 source/Irrlicht/CD3D9ShaderMaterialRenderer.h delete mode 100644 source/Irrlicht/CD3D9Texture.cpp delete mode 100644 source/Irrlicht/CD3D9Texture.h delete mode 100644 source/Irrlicht/CDMFLoader.cpp delete mode 100644 source/Irrlicht/CDMFLoader.h delete mode 100644 source/Irrlicht/CDefaultSceneNodeAnimatorFactory.cpp delete mode 100644 source/Irrlicht/CDefaultSceneNodeAnimatorFactory.h delete mode 100644 source/Irrlicht/CDepthBuffer.cpp delete mode 100644 source/Irrlicht/CDepthBuffer.h delete mode 100644 source/Irrlicht/CGeometryCreator.cpp delete mode 100644 source/Irrlicht/CGeometryCreator.h delete mode 100644 source/Irrlicht/CImageLoaderDDS.cpp delete mode 100644 source/Irrlicht/CImageLoaderDDS.h delete mode 100644 source/Irrlicht/CImageLoaderPCX.cpp delete mode 100644 source/Irrlicht/CImageLoaderPCX.h delete mode 100644 source/Irrlicht/CImageLoaderPPM.cpp delete mode 100644 source/Irrlicht/CImageLoaderPPM.h delete mode 100644 source/Irrlicht/CImageLoaderPSD.cpp delete mode 100644 source/Irrlicht/CImageLoaderPSD.h delete mode 100644 source/Irrlicht/CImageLoaderPVR.cpp delete mode 100644 source/Irrlicht/CImageLoaderPVR.h delete mode 100644 source/Irrlicht/CImageLoaderRGB.cpp delete mode 100644 source/Irrlicht/CImageLoaderRGB.h delete mode 100644 source/Irrlicht/CImageLoaderTGA.cpp delete mode 100644 source/Irrlicht/CImageLoaderTGA.h delete mode 100644 source/Irrlicht/CImageLoaderWAL.cpp delete mode 100644 source/Irrlicht/CImageLoaderWAL.h delete mode 100644 source/Irrlicht/CImageWriterBMP.cpp delete mode 100644 source/Irrlicht/CImageWriterBMP.h delete mode 100644 source/Irrlicht/CImageWriterPCX.cpp delete mode 100644 source/Irrlicht/CImageWriterPCX.h delete mode 100644 source/Irrlicht/CImageWriterPPM.cpp delete mode 100644 source/Irrlicht/CImageWriterPPM.h delete mode 100644 source/Irrlicht/CImageWriterPSD.cpp delete mode 100644 source/Irrlicht/CImageWriterPSD.h delete mode 100644 source/Irrlicht/CImageWriterTGA.cpp delete mode 100644 source/Irrlicht/CImageWriterTGA.h delete mode 100644 source/Irrlicht/CLMTSMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CLMTSMeshFileLoader.h delete mode 100644 source/Irrlicht/CLWOMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CLWOMeshFileLoader.h delete mode 100644 source/Irrlicht/CLightSceneNode.cpp delete mode 100644 source/Irrlicht/CLightSceneNode.h delete mode 100644 source/Irrlicht/CMD2MeshFileLoader.cpp delete mode 100644 source/Irrlicht/CMD2MeshFileLoader.h delete mode 100644 source/Irrlicht/CMD3MeshFileLoader.cpp delete mode 100644 source/Irrlicht/CMD3MeshFileLoader.h delete mode 100644 source/Irrlicht/CMS3DMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CMS3DMeshFileLoader.h delete mode 100644 source/Irrlicht/CMY3DHelper.h delete mode 100644 source/Irrlicht/CMY3DMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CMY3DMeshFileLoader.h delete mode 100644 source/Irrlicht/CMeshTextureLoader.cpp delete mode 100644 source/Irrlicht/CMeshTextureLoader.h delete mode 100644 source/Irrlicht/CMetaTriangleSelector.cpp delete mode 100644 source/Irrlicht/CMetaTriangleSelector.h delete mode 100644 source/Irrlicht/CNPKReader.cpp delete mode 100644 source/Irrlicht/CNPKReader.h delete mode 100644 source/Irrlicht/COBJMeshWriter.cpp delete mode 100644 source/Irrlicht/COBJMeshWriter.h delete mode 100644 source/Irrlicht/COCTLoader.cpp delete mode 100644 source/Irrlicht/COCTLoader.h delete mode 100644 source/Irrlicht/COctreeSceneNode.cpp delete mode 100644 source/Irrlicht/COctreeSceneNode.h delete mode 100644 source/Irrlicht/COctreeTriangleSelector.cpp delete mode 100644 source/Irrlicht/COctreeTriangleSelector.h delete mode 100644 source/Irrlicht/COgreMeshFileLoader.cpp delete mode 100644 source/Irrlicht/COgreMeshFileLoader.h delete mode 100644 source/Irrlicht/CPLYMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CPLYMeshFileLoader.h delete mode 100644 source/Irrlicht/CPLYMeshWriter.cpp delete mode 100644 source/Irrlicht/CPLYMeshWriter.h delete mode 100644 source/Irrlicht/CPakReader.cpp delete mode 100644 source/Irrlicht/CPakReader.h delete mode 100644 source/Irrlicht/CParticleAnimatedMeshSceneNodeEmitter.cpp delete mode 100644 source/Irrlicht/CParticleAnimatedMeshSceneNodeEmitter.h delete mode 100644 source/Irrlicht/CParticleAttractionAffector.cpp delete mode 100644 source/Irrlicht/CParticleAttractionAffector.h delete mode 100644 source/Irrlicht/CParticleBoxEmitter.cpp delete mode 100644 source/Irrlicht/CParticleBoxEmitter.h delete mode 100644 source/Irrlicht/CParticleCylinderEmitter.cpp delete mode 100644 source/Irrlicht/CParticleCylinderEmitter.h delete mode 100644 source/Irrlicht/CParticleFadeOutAffector.cpp delete mode 100644 source/Irrlicht/CParticleFadeOutAffector.h delete mode 100644 source/Irrlicht/CParticleGravityAffector.cpp delete mode 100644 source/Irrlicht/CParticleGravityAffector.h delete mode 100644 source/Irrlicht/CParticleMeshEmitter.cpp delete mode 100644 source/Irrlicht/CParticleMeshEmitter.h delete mode 100644 source/Irrlicht/CParticlePointEmitter.cpp delete mode 100644 source/Irrlicht/CParticlePointEmitter.h delete mode 100644 source/Irrlicht/CParticleRingEmitter.cpp delete mode 100644 source/Irrlicht/CParticleRingEmitter.h delete mode 100644 source/Irrlicht/CParticleRotationAffector.cpp delete mode 100644 source/Irrlicht/CParticleRotationAffector.h delete mode 100644 source/Irrlicht/CParticleScaleAffector.cpp delete mode 100644 source/Irrlicht/CParticleScaleAffector.h delete mode 100644 source/Irrlicht/CParticleSphereEmitter.cpp delete mode 100644 source/Irrlicht/CParticleSphereEmitter.h delete mode 100644 source/Irrlicht/CParticleSystemSceneNode.cpp delete mode 100644 source/Irrlicht/CParticleSystemSceneNode.h delete mode 100644 source/Irrlicht/CQ3LevelMesh.cpp delete mode 100644 source/Irrlicht/CQ3LevelMesh.h delete mode 100644 source/Irrlicht/CQuake3ShaderSceneNode.cpp delete mode 100644 source/Irrlicht/CQuake3ShaderSceneNode.h delete mode 100644 source/Irrlicht/CSMFMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CSMFMeshFileLoader.h delete mode 100644 source/Irrlicht/CSTLMeshFileLoader.cpp delete mode 100644 source/Irrlicht/CSTLMeshFileLoader.h delete mode 100644 source/Irrlicht/CSTLMeshWriter.cpp delete mode 100644 source/Irrlicht/CSTLMeshWriter.h delete mode 100644 source/Irrlicht/CSceneCollisionManager.cpp delete mode 100644 source/Irrlicht/CSceneCollisionManager.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorCameraFPS.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorCameraFPS.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorCameraMaya.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorCameraMaya.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorCollisionResponse.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorCollisionResponse.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorDelete.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorDelete.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorFlyCircle.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorFlyCircle.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorFlyStraight.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorFlyStraight.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorFollowSpline.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorFollowSpline.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorRotation.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorRotation.h delete mode 100644 source/Irrlicht/CSceneNodeAnimatorTexture.cpp delete mode 100644 source/Irrlicht/CSceneNodeAnimatorTexture.h delete mode 100644 source/Irrlicht/CShadowVolumeSceneNode.cpp delete mode 100644 source/Irrlicht/CShadowVolumeSceneNode.h delete mode 100644 source/Irrlicht/CSkyBoxSceneNode.cpp delete mode 100644 source/Irrlicht/CSkyBoxSceneNode.h delete mode 100644 source/Irrlicht/CSkyDomeSceneNode.cpp delete mode 100644 source/Irrlicht/CSkyDomeSceneNode.h delete mode 100644 source/Irrlicht/CSoftware2MaterialRenderer.h delete mode 100644 source/Irrlicht/CSoftwareDriver.cpp delete mode 100644 source/Irrlicht/CSoftwareDriver.h delete mode 100644 source/Irrlicht/CSoftwareDriver2.cpp delete mode 100644 source/Irrlicht/CSoftwareDriver2.h delete mode 100644 source/Irrlicht/CSoftwareTexture.cpp delete mode 100644 source/Irrlicht/CSoftwareTexture.h delete mode 100644 source/Irrlicht/CSphereSceneNode.cpp delete mode 100644 source/Irrlicht/CSphereSceneNode.h delete mode 100644 source/Irrlicht/CTRFlat.cpp delete mode 100644 source/Irrlicht/CTRFlatWire.cpp delete mode 100644 source/Irrlicht/CTRGouraud.cpp delete mode 100644 source/Irrlicht/CTRGouraud2.cpp delete mode 100644 source/Irrlicht/CTRGouraudAlpha2.cpp delete mode 100644 source/Irrlicht/CTRGouraudAlphaNoZ2.cpp delete mode 100644 source/Irrlicht/CTRGouraudNoZ2.cpp delete mode 100644 source/Irrlicht/CTRGouraudWire.cpp delete mode 100644 source/Irrlicht/CTRNormalMap.cpp delete mode 100644 source/Irrlicht/CTRStencilShadow.cpp delete mode 100644 source/Irrlicht/CTRTextureBlend.cpp delete mode 100644 source/Irrlicht/CTRTextureDetailMap2.cpp delete mode 100644 source/Irrlicht/CTRTextureFlat.cpp delete mode 100644 source/Irrlicht/CTRTextureFlatWire.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraud.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraud.h delete mode 100644 source/Irrlicht/CTRTextureGouraud2.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudAdd.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudAdd2.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudAlpha.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudNoZ.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudNoZ2.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudVertexAlpha2.cpp delete mode 100644 source/Irrlicht/CTRTextureGouraudWire.cpp delete mode 100644 source/Irrlicht/CTRTextureLightMap2_Add.cpp delete mode 100644 source/Irrlicht/CTRTextureLightMap2_M1.cpp delete mode 100644 source/Irrlicht/CTRTextureLightMap2_M2.cpp delete mode 100644 source/Irrlicht/CTRTextureLightMap2_M4.cpp delete mode 100644 source/Irrlicht/CTRTextureLightMapGouraud2_M4.cpp delete mode 100644 source/Irrlicht/CTRTextureWire2.cpp delete mode 100644 source/Irrlicht/CTR_transparent_reflection_2_layer.cpp delete mode 100644 source/Irrlicht/CTarReader.cpp delete mode 100644 source/Irrlicht/CTarReader.h delete mode 100644 source/Irrlicht/CTerrainSceneNode.cpp delete mode 100644 source/Irrlicht/CTerrainSceneNode.h delete mode 100644 source/Irrlicht/CTerrainTriangleSelector.cpp delete mode 100644 source/Irrlicht/CTerrainTriangleSelector.h delete mode 100644 source/Irrlicht/CTextSceneNode.cpp delete mode 100644 source/Irrlicht/CTextSceneNode.h delete mode 100644 source/Irrlicht/CTriangleBBSelector.cpp delete mode 100644 source/Irrlicht/CTriangleBBSelector.h delete mode 100644 source/Irrlicht/CTriangleSelector.cpp delete mode 100644 source/Irrlicht/CTriangleSelector.h delete mode 100644 source/Irrlicht/CVolumeLightSceneNode.cpp delete mode 100644 source/Irrlicht/CVolumeLightSceneNode.h delete mode 100644 source/Irrlicht/CWADReader.cpp delete mode 100644 source/Irrlicht/CWADReader.h delete mode 100644 source/Irrlicht/CWaterSurfaceSceneNode.cpp delete mode 100644 source/Irrlicht/CWaterSurfaceSceneNode.h delete mode 100644 source/Irrlicht/IBurningShader.cpp delete mode 100644 source/Irrlicht/IBurningShader.h delete mode 100644 source/Irrlicht/IDepthBuffer.h delete mode 100644 source/Irrlicht/ISceneNodeAnimatorFinishing.h delete mode 100644 source/Irrlicht/Octree.h delete mode 100644 source/Irrlicht/burning_shader_color.cpp delete mode 100644 source/Irrlicht/burning_shader_color_fraq.h delete mode 100644 source/Irrlicht/burning_shader_compile_fragment_default.h delete mode 100644 source/Irrlicht/burning_shader_compile_fragment_end.h delete mode 100644 source/Irrlicht/burning_shader_compile_fragment_start.h delete mode 100644 source/Irrlicht/burning_shader_compile_start.h delete mode 100644 source/Irrlicht/burning_shader_compile_triangle.h delete mode 100644 source/Irrlicht/burning_shader_compile_verify.h delete mode 100644 source/Irrlicht/dmfsupport.h delete mode 100644 tests/2dmaterial.cpp delete mode 100644 tests/Makefile delete mode 100644 tests/anti-aliasing.cpp delete mode 100644 tests/archiveReader.cpp delete mode 100644 tests/b3dAnimation.cpp delete mode 100644 tests/billboards.cpp delete mode 100644 tests/burningsVideo.cpp delete mode 100644 tests/collisionResponseAnimator.cpp delete mode 100644 tests/color.cpp delete mode 100644 tests/coreutil.cpp delete mode 100644 tests/createImage.cpp delete mode 100644 tests/cursorSetVisible.cpp delete mode 100644 tests/disambiguateTextures.cpp delete mode 100644 tests/draw2DImage.cpp delete mode 100644 tests/drawPixel.cpp delete mode 100644 tests/drawRectOutline.cpp delete mode 100644 tests/drawVertexPrimitive.cpp delete mode 100644 tests/empty/empty/Direct3D 9.0.png delete mode 100644 tests/empty/empty/Irrlicht Software Device 1.0.png delete mode 100644 tests/empty/empty/OpenGL 2.1.2.png delete mode 100644 tests/empty/empty/burnings video 0.39b.png delete mode 100644 tests/enumerateImageManipulators.cpp delete mode 100644 tests/exports.cpp delete mode 100644 tests/fast_atof.cpp delete mode 100644 tests/filesystem.cpp delete mode 100644 tests/flyCircleAnimator.cpp delete mode 100644 tests/guiDisabledMenu.cpp delete mode 100644 tests/ioScene.cpp delete mode 100644 tests/irrArray.cpp delete mode 100644 tests/irrCoreEquals.cpp delete mode 100644 tests/irrList.cpp delete mode 100644 tests/irrMap.cpp delete mode 100644 tests/irrString.cpp delete mode 100644 tests/lightMaps.cpp delete mode 100644 tests/lights.cpp delete mode 100644 tests/line2d.cpp delete mode 100644 tests/loadTextures.cpp delete mode 100644 tests/main.cpp delete mode 100644 tests/makeColorKeyTexture.cpp delete mode 100644 tests/material.cpp delete mode 100644 tests/matrixOps.cpp delete mode 100644 tests/md2Animation.cpp delete mode 100644 tests/media/Burning's Video-2dmatFilter.png delete mode 100644 tests/media/Burning's Video-addBlend2D.png delete mode 100644 tests/media/Burning's Video-ambient-lighting.png delete mode 100644 tests/media/Burning's Video-b3dAnimation.png delete mode 100644 tests/media/Burning's Video-b3dJointPosition.png delete mode 100644 tests/media/Burning's Video-billboard.png delete mode 100644 tests/media/Burning's Video-billboardOrientation.png delete mode 100644 tests/media/Burning's Video-draw2DImage4cFilter.png delete mode 100644 tests/media/Burning's Video-draw2DImageRTT.png delete mode 100644 tests/media/Burning's Video-draw2DImageRect.png delete mode 100644 tests/media/Burning's Video-drawLine.png delete mode 100644 tests/media/Burning's Video-drawPixel.png delete mode 100644 tests/media/Burning's Video-drawRectOutline.png delete mode 100644 tests/media/Burning's Video-drawVPL_a.png delete mode 100644 tests/media/Burning's Video-drawVPL_b.png delete mode 100644 tests/media/Burning's Video-drawVPL_c.png delete mode 100644 tests/media/Burning's Video-drawVPL_d.png delete mode 100644 tests/media/Burning's Video-drawVPL_e.png delete mode 100644 tests/media/Burning's Video-drawVPL_f.png delete mode 100644 tests/media/Burning's Video-drawVPL_g.png delete mode 100644 tests/media/Burning's Video-drawVPL_h.png delete mode 100644 tests/media/Burning's Video-drawVPL_i.png delete mode 100644 tests/media/Burning's Video-drawVPL_j.png delete mode 100644 tests/media/Burning's Video-drawVPL_k.png delete mode 100644 tests/media/Burning's Video-flyCircleAnimator.png delete mode 100644 tests/media/Burning's Video-guiDisabledMenu.png delete mode 100644 tests/media/Burning's Video-lightType.png delete mode 100644 tests/media/Burning's Video-lightmaps.png delete mode 100644 tests/media/Burning's Video-loadScene.png delete mode 100644 tests/media/Burning's Video-makeColorKeyTexture-new.png delete mode 100644 tests/media/Burning's Video-makeColorKeyTexture-old.png delete mode 100644 tests/media/Burning's Video-md2Animation.png delete mode 100644 tests/media/Burning's Video-md2Normals.png delete mode 100644 tests/media/Burning's Video-meshTransform.png delete mode 100644 tests/media/Burning's Video-multiTexture.png delete mode 100644 tests/media/Burning's Video-orthoCam.png delete mode 100644 tests/media/Burning's Video-pixelAccuracy.png delete mode 100644 tests/media/Burning's Video-planeMatrix-scaledClip.png delete mode 100644 tests/media/Burning's Video-projMat.png delete mode 100644 tests/media/Burning's Video-renderMipmap.png delete mode 100644 tests/media/Burning's Video-rttAndAntiAlias.png delete mode 100644 tests/media/Burning's Video-rttAndText.png delete mode 100644 tests/media/Burning's Video-rttWith2DImage.png delete mode 100644 tests/media/Burning's Video-stencilSelfShadow.png delete mode 100644 tests/media/Burning's Video-stencilShadow.png delete mode 100644 tests/media/Burning's Video-terrainGap.png delete mode 100644 tests/media/Burning's Video-terrainSceneNode-1.png delete mode 100644 tests/media/Burning's Video-terrainSceneNode-2.png delete mode 100644 tests/media/Burning's Video-testGeometryCreator.png delete mode 100644 tests/media/Burning's Video-testImageFormats.png delete mode 100644 tests/media/Burning's Video-testTerrainMesh.png delete mode 100644 tests/media/Burning's Video-textureMatrix.png delete mode 100644 tests/media/Burning's Video-textureMatrix2.png delete mode 100644 tests/media/Burning's Video-textureMatrixInMixedScenes.png delete mode 100644 tests/media/Burning's Video-textureRenderStates.png delete mode 100644 tests/media/Burning's Video-transparentAddColor.png delete mode 100644 tests/media/Burning's Video-transparentAlphaChannel.png delete mode 100644 tests/media/Burning's Video-transparentAlphaChannelRef.png delete mode 100644 tests/media/Burning's Video-transparentReflection2Layer.png delete mode 100644 tests/media/Burning's Video-transparentVertexAlpha.png delete mode 100644 tests/media/Burning's Video-transparentVertexAlphaChannelMore.png delete mode 100644 tests/media/Burning's Video-viewPortText.png delete mode 100644 tests/media/Burning's Video-writeImageToFile.png delete mode 100644 tests/media/Direct3D 9.0-2dmatFilter.png delete mode 100644 tests/media/Direct3D 9.0-addBlend2D.png delete mode 100644 tests/media/Direct3D 9.0-draw2DImage4cFilter.png delete mode 100644 tests/media/Direct3D 9.0-draw2DImagePNG.png delete mode 100644 tests/media/Direct3D 9.0-draw2DImageRTT.png delete mode 100644 tests/media/Direct3D 9.0-draw2DImageRect.png delete mode 100644 tests/media/Direct3D 9.0-drawLine.png delete mode 100644 tests/media/Direct3D 9.0-drawPixel.png delete mode 100644 tests/media/Direct3D 9.0-drawRectOutline.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_a.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_b.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_c.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_d.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_e.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_f.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_g.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_h.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_i.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_j.png delete mode 100644 tests/media/Direct3D 9.0-drawVPL_k.png delete mode 100644 tests/media/Direct3D 9.0-lightType.png delete mode 100644 tests/media/Direct3D 9.0-lightmaps.png delete mode 100644 tests/media/Direct3D 9.0-lineAntiAliasing.png delete mode 100644 tests/media/Direct3D 9.0-mrt.png delete mode 100644 tests/media/Direct3D 9.0-mrt2.png delete mode 100644 tests/media/Direct3D 9.0-multiTexture.png delete mode 100644 tests/media/Direct3D 9.0-orthoCam.png delete mode 100644 tests/media/Direct3D 9.0-orthoStencil.png delete mode 100644 tests/media/Direct3D 9.0-pixelAccuracy.png delete mode 100644 tests/media/Direct3D 9.0-polygonBack.png delete mode 100644 tests/media/Direct3D 9.0-polygonFront.png delete mode 100644 tests/media/Direct3D 9.0-projMat.png delete mode 100644 tests/media/Direct3D 9.0-renderMipmap.png delete mode 100644 tests/media/Direct3D 9.0-rttAndAntiAlias.png delete mode 100644 tests/media/Direct3D 9.0-rttAndText.png delete mode 100644 tests/media/Direct3D 9.0-rttWith2DImage.png delete mode 100644 tests/media/Direct3D 9.0-stencilSelfShadow.png delete mode 100644 tests/media/Direct3D 9.0-stencilShadow.png delete mode 100644 tests/media/Direct3D 9.0-textureMatrix.png delete mode 100644 tests/media/Direct3D 9.0-textureMatrix2.png delete mode 100644 tests/media/Direct3D 9.0-textureMatrixInMixedScenes.png delete mode 100644 tests/media/Direct3D 9.0-textureRenderStates.png delete mode 100644 tests/media/Direct3D 9.0-transparentAddColor.png delete mode 100644 tests/media/Direct3D 9.0-transparentAlphaChannel.png delete mode 100644 tests/media/Direct3D 9.0-transparentAlphaChannelRef.png delete mode 100644 tests/media/Direct3D 9.0-transparentReflection2Layer.png delete mode 100644 tests/media/Direct3D 9.0-transparentVertexAlpha.png delete mode 100644 tests/media/Direct3D 9.0-transparentVertexAlphaChannelMore.png delete mode 100644 tests/media/Direct3D 9.0-ucpsphere.png delete mode 100644 tests/media/Direct3D 9.0-viewPortText.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-createImage.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-draw2DImageRTT.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-draw2DImageRect.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawLine.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawPixel.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawRectOutline.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_a.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_b.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_c.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_d.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_e.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_f.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_g.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_h.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_i.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_j.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-drawVPL_k.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-makeColorKeyTexture-new.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-makeColorKeyTexture-old.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-multiTexture.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-pixelAccuracy.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-projMat.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-rttAndText.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-rttWith2DImage.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-softwareDevice-rotatedClip.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-textureRenderStates.png delete mode 100644 tests/media/Irrlicht Software Driver 1.0-viewPortText.png delete mode 100644 tests/media/Monty.zip delete mode 100644 tests/media/OpenGL-2dmatFilter.png delete mode 100644 tests/media/OpenGL-addBlend2D.png delete mode 100644 tests/media/OpenGL-draw2DImage4cFilter.png delete mode 100644 tests/media/OpenGL-draw2DImagePNG.png delete mode 100644 tests/media/OpenGL-draw2DImageRTT.png delete mode 100644 tests/media/OpenGL-draw2DImageRect.png delete mode 100644 tests/media/OpenGL-drawLine.png delete mode 100644 tests/media/OpenGL-drawPixel.png delete mode 100644 tests/media/OpenGL-drawRectOutline.png delete mode 100644 tests/media/OpenGL-drawVPL_a.png delete mode 100644 tests/media/OpenGL-drawVPL_b.png delete mode 100644 tests/media/OpenGL-drawVPL_c.png delete mode 100644 tests/media/OpenGL-drawVPL_d.png delete mode 100644 tests/media/OpenGL-drawVPL_e.png delete mode 100644 tests/media/OpenGL-drawVPL_f.png delete mode 100644 tests/media/OpenGL-drawVPL_g.png delete mode 100644 tests/media/OpenGL-drawVPL_h.png delete mode 100644 tests/media/OpenGL-drawVPL_i.png delete mode 100644 tests/media/OpenGL-drawVPL_j.png delete mode 100644 tests/media/OpenGL-drawVPL_k.png delete mode 100644 tests/media/OpenGL-lightType.png delete mode 100644 tests/media/OpenGL-lightmaps.png delete mode 100644 tests/media/OpenGL-lineAntiAliasing.png delete mode 100644 tests/media/OpenGL-mrt.png delete mode 100644 tests/media/OpenGL-mrt2.png delete mode 100644 tests/media/OpenGL-multiTexture.png delete mode 100644 tests/media/OpenGL-octree_select1.png delete mode 100644 tests/media/OpenGL-octree_select2.png delete mode 100644 tests/media/OpenGL-orthoCam.png delete mode 100644 tests/media/OpenGL-orthoStencil.png delete mode 100644 tests/media/OpenGL-pixelAccuracy.png delete mode 100644 tests/media/OpenGL-polygonBack.png delete mode 100644 tests/media/OpenGL-polygonFront.png delete mode 100644 tests/media/OpenGL-projMat.png delete mode 100644 tests/media/OpenGL-renderMipmap.png delete mode 100644 tests/media/OpenGL-rttAndAntiAlias.png delete mode 100644 tests/media/OpenGL-rttAndText.png delete mode 100644 tests/media/OpenGL-rttWith2DImage.png delete mode 100644 tests/media/OpenGL-stencilSelfShadow.png delete mode 100644 tests/media/OpenGL-stencilShadow.png delete mode 100644 tests/media/OpenGL-textureMatrix.png delete mode 100644 tests/media/OpenGL-textureMatrix2.png delete mode 100644 tests/media/OpenGL-textureMatrixInMixedScenes.png delete mode 100644 tests/media/OpenGL-texturePointer.png delete mode 100644 tests/media/OpenGL-textureRenderStates.png delete mode 100644 tests/media/OpenGL-transparentAddColor.png delete mode 100644 tests/media/OpenGL-transparentAlphaChannel.png delete mode 100644 tests/media/OpenGL-transparentAlphaChannelRef.png delete mode 100644 tests/media/OpenGL-transparentReflection2Layer.png delete mode 100644 tests/media/OpenGL-transparentVertexAlpha.png delete mode 100644 tests/media/OpenGL-transparentVertexAlphaChannelMore.png delete mode 100644 tests/media/OpenGL-tri_select1.png delete mode 100644 tests/media/OpenGL-tri_select2.png delete mode 100644 tests/media/OpenGL-tri_select3.png delete mode 100644 tests/media/OpenGL-ucpsphere.png delete mode 100644 tests/media/OpenGL-viewPortText.png delete mode 100644 tests/media/RedbrushAlpha-0.25.png delete mode 100644 tests/media/attributes.xml delete mode 100644 tests/media/cdata.xml delete mode 100755 tests/media/enc.zip delete mode 100644 tests/media/file_with_path.npk delete mode 100644 tests/media/file_with_path.zip delete mode 100644 tests/media/file_with_path/mypath/myfile.txt delete mode 100644 tests/media/file_with_path/mypath/mypath/myfile.txt delete mode 100644 tests/media/file_with_path/test/test.txt delete mode 100644 tests/media/fireball.png delete mode 100644 tests/media/grey.tga delete mode 100644 tests/media/licenses.txt delete mode 100644 tests/media/lzmadata.zip delete mode 100644 tests/media/sample_pakfile.pak delete mode 100644 tests/media/scene.irr delete mode 100644 tests/media/scene2.irr delete mode 100644 tests/media/sydney.bmp delete mode 100644 tests/media/sydney.md2 delete mode 100644 tests/media/ter1.png delete mode 100644 tests/media/test.xml delete mode 100644 tests/media/title_font.png delete mode 100644 tests/media/title_font.xml delete mode 100644 tests/media/title_font_2.png delete mode 100644 tests/media/tools.png delete mode 100644 tests/meshLoaders.cpp delete mode 100644 tests/meshTransform.cpp delete mode 100644 tests/mrt.cpp delete mode 100644 tests/orthoCam.cpp delete mode 100644 tests/planeMatrix.cpp delete mode 100644 tests/projectionMatrix.cpp delete mode 100644 tests/removeCustomAnimator.cpp delete mode 100644 tests/renderTargetTexture.cpp delete mode 100644 tests/sceneCollisionManager.cpp delete mode 100644 tests/sceneNodeAnimator.cpp delete mode 100644 tests/screenshot.cpp delete mode 100644 tests/serializeAttributes.cpp delete mode 100644 tests/skinnedMesh.cpp delete mode 100644 tests/softwareDevice.cpp delete mode 100644 tests/stencilshadow.cpp delete mode 100644 tests/terrainSceneNode.cpp delete mode 100644 tests/testDimension2d.cpp delete mode 100644 tests/testGeometryCreator.cpp delete mode 100644 tests/testLine2d.cpp delete mode 100644 tests/testQuaternion.cpp delete mode 100644 tests/testS3DVertex.cpp delete mode 100644 tests/testUtils.cpp delete mode 100644 tests/testUtils.h delete mode 100644 tests/testVector2d.cpp delete mode 100644 tests/testVector3d.cpp delete mode 100644 tests/testXML.cpp delete mode 100644 tests/testaabbox.cpp delete mode 100644 tests/tests-last-passed-at.txt delete mode 100644 tests/tests-readme.txt delete mode 100644 tests/tests.cbp delete mode 100644 tests/tests.workspace delete mode 100644 tests/tests_vc10.sln delete mode 100644 tests/tests_vc10.vcxproj delete mode 100644 tests/tests_vc11.sln delete mode 100644 tests/tests_vc11.vcxproj delete mode 100644 tests/tests_vc12.sln delete mode 100644 tests/tests_vc12.vcxproj delete mode 100644 tests/tests_vc14.sln delete mode 100644 tests/tests_vc14.vcxproj delete mode 100644 tests/textureFeatures.cpp delete mode 100644 tests/textureRenderStates.cpp delete mode 100644 tests/timer.cpp delete mode 100644 tests/transparentMaterials.cpp delete mode 100644 tests/triangle3d.cpp delete mode 100644 tests/triangleSelector.cpp delete mode 100644 tests/userClipPlane.cpp delete mode 100644 tests/vectorPositionDimension2d.cpp delete mode 100644 tests/videoDriver.cpp delete mode 100644 tests/viewPort.cpp delete mode 100644 tests/writeImageToFile.cpp diff --git a/examples/01.HelloWorld/HelloWorld.cbp b/examples/01.HelloWorld/HelloWorld.cbp deleted file mode 100644 index 1811e4a8..00000000 --- a/examples/01.HelloWorld/HelloWorld.cbp +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - diff --git a/examples/01.HelloWorld/HelloWorld.vcproj b/examples/01.HelloWorld/HelloWorld.vcproj deleted file mode 100644 index 3a2fdb0e..00000000 --- a/examples/01.HelloWorld/HelloWorld.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/01.HelloWorld/HelloWorld.xcodeproj/project.pbxproj b/examples/01.HelloWorld/HelloWorld.xcodeproj/project.pbxproj deleted file mode 100644 index c3c5eb5f..00000000 --- a/examples/01.HelloWorld/HelloWorld.xcodeproj/project.pbxproj +++ /dev/null @@ -1,290 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 01.HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 01.HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 01.HelloWorld.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 01.HelloWorld */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "01.HelloWorld" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 01.HelloWorld; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 01.HelloWorld.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0710; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "HelloWorld" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 01.HelloWorld */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - GCC_C_LANGUAGE_STANDARD = c11; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "HelloWorld" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "01.HelloWorld" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/01.HelloWorld/HelloWorld.xcodeproj/xcshareddata/xcschemes/01.HelloWorld.xcscheme b/examples/01.HelloWorld/HelloWorld.xcodeproj/xcshareddata/xcschemes/01.HelloWorld.xcscheme deleted file mode 100644 index ba196db3..00000000 --- a/examples/01.HelloWorld/HelloWorld.xcodeproj/xcshareddata/xcschemes/01.HelloWorld.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/01.HelloWorld/HelloWorld_vc10.vcxproj b/examples/01.HelloWorld/HelloWorld_vc10.vcxproj deleted file mode 100644 index 509ccbed..00000000 --- a/examples/01.HelloWorld/HelloWorld_vc10.vcxproj +++ /dev/null @@ -1,233 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 01.HelloWorld - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9} - HelloWorld - - - - Application - false - MultiByte - - - Application - false - MultiByte - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/01.HelloWorld/HelloWorld_vc11.vcxproj b/examples/01.HelloWorld/HelloWorld_vc11.vcxproj deleted file mode 100644 index c131e023..00000000 --- a/examples/01.HelloWorld/HelloWorld_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 01.HelloWorld - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9} - HelloWorld - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/01.HelloWorld/HelloWorld_vc12.vcxproj b/examples/01.HelloWorld/HelloWorld_vc12.vcxproj deleted file mode 100644 index 109da6b3..00000000 --- a/examples/01.HelloWorld/HelloWorld_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 01.HelloWorld - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9} - HelloWorld - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/01.HelloWorld/HelloWorld_vc14.vcxproj b/examples/01.HelloWorld/HelloWorld_vc14.vcxproj deleted file mode 100644 index 23853d7b..00000000 --- a/examples/01.HelloWorld/HelloWorld_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 01.HelloWorld - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9} - HelloWorld - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/HelloWorld.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/HelloWorld.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\01.HelloWorld.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/01.HelloWorld/Makefile b/examples/01.HelloWorld/Makefile deleted file mode 100644 index 6b6d16fd..00000000 --- a/examples/01.HelloWorld/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 01.HelloWorld -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/01.HelloWorld/main.cpp b/examples/01.HelloWorld/main.cpp deleted file mode 100644 index aeb0c570..00000000 --- a/examples/01.HelloWorld/main.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/** Example 001 HelloWorld - -This tutorial shows how to set up the IDE for using the Irrlicht Engine and how -to write a simple HelloWorld program with it. The program will show how to use -the basics of the VideoDriver, the GUIEnvironment, and the SceneManager. -Microsoft Visual Studio is used as an IDE, but you will also be able to -understand everything if you are using a different one or even another -operating system than Windows. - -You have to include the header file in order to use the engine. The -header file can be found in the Irrlicht Engine SDK directory \c include. To let -the compiler find this header file, the directory where it is located has to be -added in your project as include path. This is different for every IDE and -compiler you use. Let's explain shortly how to do this in Visual Studio 2010: - -- In Visual Studio 2010 select the Menu Project -> Properties. Select the - "C/C++" - "General" option, and select the "Additional Include Directories". - Add the \c include directory of the Irrlicht engine folder to the list of - directories. Now the compiler will find the irrlicht.h header file. We also - need the irrlicht.lib to be found, so select "Linker" - "General" and - add the \c lib/Win64-visualStudio or \c lib/Win32-visualStudio directory - to "Additional Library Directories". Which of the 2 Irrlicht versions you - chose depends on the target platform for your application (win32 or x64). - In your project properties you can see what your active solution platform - is, you can use the same one for Irrlicht. - -To be able to use the Irrlicht.DLL file, we need to link with the Irrlicht.lib. -In most IDE's you have to add irrlicht.lib (or irrlicht.a or irrlicht.so on -Linux) to your Linker input files. - -For VisualStudio we can be lazy and use the pragma comment lib. -We also want to get rid of the console window, which pops up when starting a -program with main() (instead of WinMain). This is done by the second pragma. -We could also use the WinMain method, though losing platform independence then. -*/ -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") -#endif - -/* -That's it. With your IDE set up like this, you will now be able to develop -applications with the Irrlicht Engine. - -Lets start! - -After we have set up the IDE, the compiler will know where to find the Irrlicht -Engine header files so we can include it now in our code. -*/ -#include - -/* -That header just adds the getExampleMediaPath tool-functions to help locating -the media we need. More about that later below. -*/ -#include "exampleHelper.h" - -/* -In the Irrlicht Engine, everything can be found in the namespace 'irr'. So if -you want to use a class of the engine, you have to write irr:: before the name -of the class. For example to use the IrrlichtDevice write: irr::IrrlichtDevice. -To get rid of the irr:: in front of the name of every class, we tell the -compiler that we use that namespace from now on, and we will not have to write -irr:: anymore. -Note that you never should do that in headers - otherwise you will pollute the -namespace of every file including such a header. So in headers always write -out the full names including all namespaces. -*/ -using namespace irr; - -/* -There are 5 sub namespaces in the Irrlicht Engine. Take a look at them, you can -read a detailed description of them in the documentation by clicking on the top -menu item 'Namespace List' or by using this link: -http://irrlicht.sourceforge.net/docu/namespaces.html -Like the irr namespace, we do not want these 5 sub namespaces now, to keep this -example simple. Hence, we tell the compiler again that we do not want always to -write their names. -*/ -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -/* -This is the main method. We can now use main() on every platform. -*/ -int main() -{ - /* - The most important function of the engine is the createDevice() - function. The IrrlichtDevice is created by it, which is the root - object for doing anything with the engine. createDevice() has the - following parameters: - - - driverType: Type of the video driver. This can currently be the Null-device, - one of the two software renderers, D3D9, or OpenGL. In this - example we use EDT_BURNINGSVIDEO, but to try out, you might want to - change it to EDT_SOFTWARE, EDT_NULL, EDT_DIRECT3D9, or EDT_OPENGL. - Generally you will want to use OpenGL or Direct3D as they are - using your graphic card for calculations instead of the CPU and - are way faster (and usually better looking). We just use one of the - software renderers here as it even works when your graphic card driver - isn't set up for 3d support. - - - windowSize: Size of the Window or screen in FullScreenMode to be - created. In this example we use 640x480. - - - bits: Amount of color bits per pixel. This should be 16 or 32. The - parameter is often ignored when running in windowed mode. More - commonly you would chose 32 bit, again we're just playing it safe. - - - fullscreen: Specifies if we want the device to run in fullscreen mode - or windowed. - - - stencilbuffer: Specifies if we want to use the stencil buffer (you - need it for drawing shadows). - - - vsync: Specifies if we want to have vsync enabled, this is only useful - in fullscreen mode. - - - eventReceiver: An object to receive events. We do not want to use this - parameter here, and set it to 0. - - Always check the return value to cope with unsupported drivers, - dimensions, etc. - */ - IrrlichtDevice *device = - createDevice( video::EDT_OGLES1, dimension2d(640, 480), 16, - false, false, false, 0); - - if (!device) - return 1; - - /* - Set the caption of the window to some nice text. Note that there is an - 'L' in front of the string. The Irrlicht Engine uses wide character - strings when displaying text. - */ - device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); - - /* - Get a pointer to the VideoDriver, the SceneManager and the graphical - user interface environment, so that we do not always have to write - device->getVideoDriver(), device->getSceneManager(), or - device->getGUIEnvironment(). - */ - IVideoDriver* driver = device->getVideoDriver(); - ISceneManager* smgr = device->getSceneManager(); - IGUIEnvironment* guienv = device->getGUIEnvironment(); - - /* - We add a hello world label to the window, using the GUI environment. - The text is placed at the position (10,10) as top left corner and - (260,22) as lower right corner. - */ - guienv->addStaticText(L"Hello World! This is Irrlicht with the burnings software renderer!", - rect(10,10,260,22), true); - - /* - Get a media path dedicated for your platform. Finding media files for your - applications can be tricky. First you have 2 options - working with relative - paths or working with absolute paths. - - On Windows a common solution is that your installer will write a key into - the registry with the absolute path of wherever the user installed the - media. And in your application you read out that key from the registry. - On Linux a common solution is to use config file which is placed in some - fixed location (for example in a . file/folder in the user home). - - But you can also work with relative paths - which is what we do here. There - is a slight complication with relative paths as they are relative to your - current working directory. And that depends on the way your application is - started and it might change inside your application. But mostly it will be - set to your executable on start so you can ignore that problem while - developing. - - When inside VisualStudio the current working directory is set to your - project files location unless you overwrite Project properties - Debugging - - Working Directory. In Irrlicht examples the media folder is on most - platforms ../../media which works for the examples as it's relative to our - project files as well as to the binary (.exe) files. - - Whatever you chose to find your base-folder for media - wrap it with some - function and then you can improve the code to locate the media later on. - */ - const io::path mediaPath = getExampleMediaPath(); - - /* - To show something interesting, we load a Quake 2 model and display it. - We get the Mesh from the Scene Manager with getMesh() and add a SceneNode - to display the mesh with addAnimatedMeshSceneNode(). Check the return value - of getMesh() to become aware of loading problems and other errors. - - Instead of writing the filename sydney.md2, it would also be possible - to load a Maya object file (.obj), a complete Quake3 map (.bsp) or any - other supported file format. By the way, that cool Quake 2 model - called sydney was modeled by Brian Collins. - */ - IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "sydney.md2"); - if (!mesh) - { - device->drop(); - return 1; - } - IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); - - /* - To let the mesh look a little bit nicer, we change its material. We - disable lighting because we do not have a dynamic light in here, and - the mesh would be totally black otherwise. Then we set the frame loop, - such that the predefined STAND animation is used. And last, we apply a - texture to the mesh. Without it the mesh would be drawn using only a - color. - */ - if (node) - { - node->setMaterialFlag(EMF_LIGHTING, false); - node->setMD2Animation(scene::EMAT_STAND); - node->setMaterialTexture( 0, driver->getTexture(mediaPath + "sydney.bmp") ); - } - - /* - To look at the mesh, we place a camera into 3d space at the position - (0, 30, -40). The camera looks from there to (0,5,0), which is - approximately the place where our md2 model is. - */ - smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); - - /* - OK, now we have set up the scene, lets draw everything: We run the - device in a while() loop, until the device does not want to run any - more. This would be when the user closes the window or presses ALT+F4 - (or whatever keycode closes a window on your OS). - */ - while(device->run()) - { - /* - Anything can be drawn between a beginScene() and an endScene() - call. The beginScene() call clears the screen with a color and - the depth buffer, if desired. Then we let the Scene Manager and - the GUI Environment draw their content. With the endScene() - call everything is presented on the screen. - */ - driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255,100,101,140)); - - smgr->drawAll(); - guienv->drawAll(); - - driver->endScene(); - } - - /* - After we are done with the render loop, we have to delete the Irrlicht - Device created before with createDevice(). In the Irrlicht Engine, you - have to delete all objects you created with a method or function which - starts with 'create'. The object is simply deleted by calling ->drop(). - See the documentation at irr::IReferenceCounted::drop() for more - information. - */ - device->drop(); - - return 0; -} - -/* -That's it. Compile and run. -**/ diff --git a/examples/01.HelloWorld/tutorial.html b/examples/01.HelloWorld/tutorial.html deleted file mode 100644 index e46c9542..00000000 --- a/examples/01.HelloWorld/tutorial.html +++ /dev/null @@ -1,394 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - - -
Tutorial 1.HelloWorld
-

This Tutorial shows how to set up the IDE for using the - Irrlicht Engine and how to write a simple HelloWorld program - with it. The program will show how to use the basics of - the VideoDriver, the GUIEnvironment and the SceneManager.
- The result of this example will look like this:

-


-

-
-
- - - - - - -
Setting up the - IDE
-
-

To use the engine, we will have to include - the header file <irrlicht.h>, which can be found - in the Irrlicht Engine SDK directory \include. To let - the compiler find this header file, the directory where - it is located should be specified somewhere. This is different - for every IDE and compiler. I will explain how to do this - in Microsoft Visual Studio C++ 6.0 and .NET:

- -
-
    -
  • -
    If you use Version 6.0, select the Menu - Extras -> Options. Select the directories tab, and - select the 'Include' Item in the combo box. Add the - \include directory of the Irrlicht Engine folder to - the list of directories. Now the compiler will find - the Irrlicht.h header file. We also need the location - of irrlicht.lib to be listed, so select the 'Libraries' - tab and add the \lib\VisualStudio directory.
    -
    -   
    -  
    - -
    -
  • -
  • If your IDE is Visual Studio .NET, select Tools -> - Options. Select the Projects entry and then select VC++ - directories. Select 'show directories for include files' - in the combo box, and add the \include directory of the - Irrlicht Engine folder to the list of directories so the - compiler will find the Irrlicht.h header file. We also - need the irrlicht.lib to be found, so select 'show directories - for Library files' and add the \lib\VisualStudio directory.
    -
    - -
    -
  • -
- -

 

-
-
- - - - - - - - -
Lets start!
-
-
-
-

After we have set up the IDE, the compiler will know - where to find the Irrlicht Engine header files so - we can include it now into our code.

- - - - - -
#include <irrlicht.h>
-

In the Irrlicht Engine, everything can be found in - the namespace 'irr'. So if you want to use a class - of the engine, you'll have to type an irr:: before - the name of the class. For example, to use the IrrlichtDevice, - write: irr::IrrlichtDevice. To avoid having to put - irr:: before of the name of every class, we tell the - compiler that we use that namespace.

- - - - - -
using namespace irr;
-

There are 5 sub-namespaces in the Irrlicht Engine. - Take a look at them: you can read a detailed description - of them in the documentation by clicking on the top - menu item 'Namespace - List'. To keep this example simple, we don't want - to have to specify the name spaces, Hence:

- - - - - -
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
-

To be able to use the Irrlicht.DLL file, we need - to link with the Irrlicht.lib. We could set this option - in the project settings, but to make it easy we use - a pragma comment:

- - - - - -
#pragma comment(lib, "Irrlicht.lib")
-

Now the main method: to keep this example simple - we use int main(), which can be used on any platform. - However, on Windows platforms, we could also use the - WinMain method if we would want to get rid of the - console window which pops up when starting a program - with main().

- - - - - -
int main()
{
-

The most important function of the engine is the - 'createDevice' function. The Irrlicht Device, which - is the root object for doing everything with the engine, - can be created with it. createDevice() has 7 parameters:

-
-
    -
  • - -
    deviceType: Type of the device. This can currently - be the Null device, the Software device, Direct3D8, Direct3D9, - or OpenGL. In this example we use EDT_SOFTWARE, but, to try - them out, you might want to change it to EDT_NULL, EDT_DIRECT3D8, - EDT_DIRECT3D9 or EDT_OPENGL.
    -
  • -
  • -
    windowSize: Size of the window or - full screen mode to be created. In this example - we use 512x384.
    - -
  • -
  • -
    bits: Number of bits per pixel when - in full screen mode. This should be 16 or 32. This - parameter is ignored when running in windowed mode.
    -
  • -
  • -
    fullscreen: Specifies if we want - the device to run in full screen mode or not.
    -
  • -
  • stencilbuffer: Specifies if we want to use the stencil - buffer for drawing shadows.
  • - -
  • vsync: Specifies if we want to have vsync enabled. - This is only useful in full screen mode.
  • -
  • -
    eventReceiver: An object to receive - events. We do not want to use this parameter here, - and set it to 0.
    -
  • -
- - - - - -
IrrlichtDevice *device =
createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384), 16,
false, false, false, 0);
-

Now we set the caption of the window to some nice text. - Note that there is a 'L' in front of the string: the - Irrlicht Engine uses wide character strings when displaying - text.

- - - - - -
device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
-

Now we store a pointer to the video driver, the SceneManager, - and the graphical user interface environment so that - we do not always have to write device->getVideoDriver(), - device->getSceneManager(), and device->getGUIEnvironment().

- - - - - -
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
-

We add a hello world label to the window using the - GUI environment. The text is placed at the position - (10,10) as top left corner and (200,22) as lower right - corner.

- - - - - -
guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!",
rect<s32>(10,10,200,22), true);
-

To display something interesting, we load a Quake 2 - model and display it. We only have to get the Mesh from - the Scene Manager with getMesh() and add a SceneNode - to display the mesh with addAnimatedMeshSceneNode(). - Instead of loading a Quake2 file (.md2), it is also - possible to load a Maya object file (.obj), a complete - Quake3 map (.bsp), or a Milshape file (.ms3d).
- By the way, that cool Quake 2 model called sydney.md2 - was modelled by Brian Collins.

- - - - - -
IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
-

To make the mesh look a little bit nicer, we change - its material a little bit: we disable lighting because - we do not have a dynamic light in here and the mesh - would be totally black. Then we set the frame loop so - that the animation is looped between the frames 0 and - 310. Then, at last, we apply a texture to the mesh. - Without it the mesh would be drawn using only a solid - color.

- - - - - -
if (node)
{
node->setMaterialFlag(EMF_LIGHTING, false);
node->setFrameLoop(0, 310);
node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
}
-
-

To look at the mesh, we place a camera into 3d space - at the position (0, 10, -40). The camera looks from - there to (0,5,0).

- - - - - -
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
-

Ok. Now that we have set up the scene, let's draw everything: - we run the device in a while() loop until the device - does not want to run any more. This would be when the - user closes the window or presses ALT+F4 in Windows.

- - - - - -
while(device->run())
{
-

Everything must be drawn between a beginScene() and - an endScene() call. The beginScene clears the screen - with a color and also the depth buffer, if desired. - Then we let the Scene Manager and the GUI environment - draw their content. With the endScene() call, everything - is presented on the screen.

- - - - - - -
	driver->beginScene(true, true, SColor(255,100,101,140));
- smgr->drawAll(); - guienv->drawAll();
-
	driver->endScene();
-}
-

After we are finished, we have to delete the Irrlicht - Device created earlier with createDevice(). With the - Irrlicht Engine, you should delete all objects you created - with a method or function that starts with 'create'. - The object is deleted simply by calling ->drop(). - See the documentation - for more information.

- - - - - -
	device->drop();
return 0; -}
-

That's it. Compile and run.

-

 

-
-
-
-
- - - - - - - -
Possible Errors - or Problems
-
-
-

Visual Studio
- - While trying to compile the tutorial, if you get the - error:

- - - - -
fatal - error C1083: Cannot open include file: 'irrlicht.h': - No such file or directory
-

Solution: You may have set the include directory improperly - in the Visual Studio options. See above - for information on setting it.

- - - - - -
LINK - : LNK6004: HelloWorld.exe not found or not built - by the last incremental link; performing full link
- LINK : fatal error LNK1104: cannot open file "Irrlicht.lib"
- Error executing link.exe
-

Solution: You may have set the library directory improperly. - See above for information on - setting it.
- -
-

-

Compiler independent problems
-
If the tutorial compiles successfully but gives - the error:

- - - - - -
This - application has failed to start because Irrlicht.dll - was not found. Re-installing the application may - fix this problem
-

Solution: You may have forgotten to copy the Irrlicht.dll - file from Irrlicht\bin\VisualStudio to the directory - the tutorial's project file is in.

- If the tutorial compiles and runs successfully but produces - errors in the console like:
-
- - - - - -
Could - not load mesh, because file could not be opened.: - ../media/sydney.md2
-

Or:

- - - - - -
Could - not open file of texture: stones.jpg
-
Could not load texture: stones.jpg
-

Solution: The file listed in the error message cannot - be found. Ensure that the directory specified in the - main.cpp exists and is where the file is located.
-

-
-
-
-

 

- - diff --git a/examples/01.HelloWorld_Android/AndroidManifest.xml b/examples/01.HelloWorld_Android/AndroidManifest.xml deleted file mode 100755 index b26b4d40..00000000 --- a/examples/01.HelloWorld_Android/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/01.HelloWorld_Android/android_tools.cpp b/examples/01.HelloWorld_Android/android_tools.cpp deleted file mode 100644 index 758a0a8d..00000000 --- a/examples/01.HelloWorld_Android/android_tools.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include "android_tools.h" -#include // for the occasional debugging, style: __android_log_print(ANDROID_LOG_VERBOSE, "Irrlicht", "%s\n", "We do log"); - -namespace irr -{ -namespace android -{ - -// Not all DisplayMetrics are available through the NDK. -// So we access the Java classes with the JNI interface. -// You can access other Java classes available in Android in similar ways. -// Function based roughly on the code from here: http://stackoverflow.com/questions/13249164/android-using-jni-from-nativeactivity -bool getDisplayMetrics(android_app* app, SDisplayMetrics & metrics) -{ - if (!app || !app->activity || !app->activity->vm ) - return false; - - JNIEnv* jni = 0; - app->activity->vm->AttachCurrentThread(&jni, NULL); - if (!jni ) - return false; - - - // get all the classes we want to access from the JVM - jclass classNativeActivity = jni->FindClass("android/app/NativeActivity"); - jclass classWindowManager = jni->FindClass("android/view/WindowManager"); - jclass classDisplay = jni->FindClass("android/view/Display"); - jclass classDisplayMetrics = jni->FindClass("android/util/DisplayMetrics"); - - if (!classNativeActivity || !classWindowManager || !classDisplay || !classDisplayMetrics) - { - app->activity->vm->DetachCurrentThread(); - return false; - } - - - // Get all the methods we want to access from the JVM classes - // Note: You can get the signatures (third parameter of GetMethodID) for all - // functions of a class with the javap tool, like in the following example for class DisplayMetrics: - // javap -s -classpath myandroidpath/adt-bundle-linux-x86_64-20131030/sdk/platforms/android-10/android.jar android/util/DisplayMetrics - jmethodID idNativeActivity_getWindowManager = jni->GetMethodID( classNativeActivity - , "getWindowManager" - , "()Landroid/view/WindowManager;"); - jmethodID idWindowManager_getDefaultDisplay = jni->GetMethodID( classWindowManager - , "getDefaultDisplay" - , "()Landroid/view/Display;"); - jmethodID idDisplayMetrics_constructor = jni->GetMethodID( classDisplayMetrics - , "" - , "()V"); - jmethodID idDisplay_getMetrics = jni->GetMethodID( classDisplay - , "getMetrics" - , "(Landroid/util/DisplayMetrics;)V"); - - if (!idNativeActivity_getWindowManager || !idWindowManager_getDefaultDisplay || !idDisplayMetrics_constructor - || !idDisplay_getMetrics) - { - app->activity->vm->DetachCurrentThread(); - return false; - } - - - // In Java the following code would be: getWindowManager().getDefaultDisplay().getMetrics(metrics); - // Note: If you need to call java functions in time-critical places you can split getting the jmethodID's - // and calling the functions into separate functions as you only have to get the jmethodID's once. - jobject windowManager = jni->CallObjectMethod(app->activity->clazz, idNativeActivity_getWindowManager); - - if (!windowManager) - { - app->activity->vm->DetachCurrentThread(); - return false; - } - jobject display = jni->CallObjectMethod(windowManager, idWindowManager_getDefaultDisplay); - if (!display) - { - app->activity->vm->DetachCurrentThread(); - return false; - } - jobject displayMetrics = jni->NewObject( classDisplayMetrics, idDisplayMetrics_constructor); - if (!displayMetrics) - { - app->activity->vm->DetachCurrentThread(); - return false; - } - jni->CallVoidMethod(display, idDisplay_getMetrics, displayMetrics); - - // access the fields of DisplayMetrics (we ignore the DENSITY constants) - jfieldID idDisplayMetrics_widthPixels = jni->GetFieldID( classDisplayMetrics, "widthPixels", "I"); - jfieldID idDisplayMetrics_heightPixels = jni->GetFieldID( classDisplayMetrics, "heightPixels", "I"); - jfieldID idDisplayMetrics_density = jni->GetFieldID( classDisplayMetrics, "density", "F"); - jfieldID idDisplayMetrics_densityDpi = jni->GetFieldID( classDisplayMetrics, "densityDpi", "I"); - jfieldID idDisplayMetrics_scaledDensity = jni->GetFieldID( classDisplayMetrics, "scaledDensity", "F"); - jfieldID idDisplayMetrics_xdpi = jni->GetFieldID(classDisplayMetrics, "xdpi", "F"); - jfieldID idDisplayMetrics_ydpi = jni->GetFieldID(classDisplayMetrics, "ydpi", "F"); - - if ( idDisplayMetrics_widthPixels ) - metrics.widthPixels = jni->GetIntField(displayMetrics, idDisplayMetrics_widthPixels); - if ( idDisplayMetrics_heightPixels ) - metrics.heightPixels = jni->GetIntField(displayMetrics, idDisplayMetrics_heightPixels); - if (idDisplayMetrics_density ) - metrics.density = jni->GetFloatField(displayMetrics, idDisplayMetrics_density); - if (idDisplayMetrics_densityDpi) - metrics.densityDpi = jni->GetIntField(displayMetrics, idDisplayMetrics_densityDpi); - if (idDisplayMetrics_scaledDensity) - metrics.scaledDensity = jni->GetFloatField(displayMetrics, idDisplayMetrics_scaledDensity); - if ( idDisplayMetrics_xdpi ) - metrics.xdpi = jni->GetFloatField(displayMetrics, idDisplayMetrics_xdpi); - if ( idDisplayMetrics_ydpi ) - metrics.ydpi = jni->GetFloatField(displayMetrics, idDisplayMetrics_ydpi); - - app->activity->vm->DetachCurrentThread(); - return true; -} - -void setSoftInputVisibility(android_app* app, bool visible) -{ - // NOTE: Unfortunately ANativeActivity_showSoftInput from the NDK does not work and Google does not care. - // This is based on the solution from @Ratamovic from here: http://stackoverflow.com/questions/5864790/how-to-show-the-soft-keyboard-on-native-activity - - if (!app || !app->activity || !app->activity->vm ) - return; - - JNIEnv* jni = 0; - app->activity->vm->AttachCurrentThread(&jni, NULL); - if (!jni ) - return; - - // get all the classes we want to access from the JVM (could be cached) - jclass classNativeActivity = jni->FindClass("android/app/NativeActivity"); - jclass classInputMethodManager = jni->FindClass("android/view/inputmethod/InputMethodManager"); - jclass classWindow = jni->FindClass("android/view/Window"); - jclass classView = jni->FindClass("android/view/View"); - - if (classNativeActivity && classInputMethodManager && classWindow) - { - // Get all the methods we want to access from the JVM classes (could be cached) - jmethodID mid_getSystemService = jni->GetMethodID(classNativeActivity, "getSystemService","(Ljava/lang/String;)Ljava/lang/Object;"); - jmethodID mid_showSoftInput = jni->GetMethodID(classInputMethodManager, "showSoftInput", "(Landroid/view/View;I)Z"); - - jmethodID mid_hideSoftInput = jni->GetMethodID(classInputMethodManager, "hideSoftInputFromWindow", "(Landroid/os/IBinder;I)Z"); - jmethodID mid_getWindow = jni->GetMethodID(classNativeActivity, "getWindow", "()Landroid/view/Window;"); - jmethodID mid_getWindowToken = jni->GetMethodID(classView, "getWindowToken", "()Landroid/os/IBinder;"); - jmethodID mid_getDecorView = jni->GetMethodID(classWindow, "getDecorView", "()Landroid/view/View;"); - - if ( mid_getSystemService && mid_showSoftInput && mid_hideSoftInput && mid_getWindow && mid_getDecorView && mid_getWindowToken ) - { - jstring paramInput = jni->NewStringUTF("input_method"); - jobject objInputMethodManager = jni->CallObjectMethod(app->activity->clazz, mid_getSystemService, paramInput); - jni->DeleteLocalRef(paramInput); - - jobject objWindow = jni->CallObjectMethod(app->activity->clazz, mid_getWindow); - - if ( visible && objInputMethodManager && objWindow) - { - jobject objDecorView = jni->CallObjectMethod(objWindow, mid_getDecorView); - if ( objDecorView ) - { - int showFlags = 0; - jni->CallBooleanMethod(objInputMethodManager, mid_showSoftInput, objDecorView, showFlags); - } - } - else if ( !visible && objInputMethodManager && objWindow ) - { - jobject objDecorView = jni->CallObjectMethod(objWindow, mid_getDecorView); - if ( objDecorView ) - { - jobject objBinder = jni->CallObjectMethod(objDecorView, mid_getWindowToken); - if ( objBinder ) - { - int hideFlags = 0; - jni->CallBooleanMethod(objInputMethodManager, mid_hideSoftInput, objBinder, hideFlags); - } - } - } - } - } - - app->activity->vm->DetachCurrentThread(); -} - -} // namespace android -} // namespace irr diff --git a/examples/01.HelloWorld_Android/android_tools.h b/examples/01.HelloWorld_Android/android_tools.h deleted file mode 100644 index 2a3d66f7..00000000 --- a/examples/01.HelloWorld_Android/android_tools.h +++ /dev/null @@ -1,33 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __IRR_ANDROID_TOOLS_H__ -#define __IRR_ANDROID_TOOLS_H__ - -#include -#include - -namespace irr -{ -namespace android -{ - -struct SDisplayMetrics -{ - irr::s32 widthPixels; - irr::s32 heightPixels; - irr::f32 density; - irr::s32 densityDpi; - irr::f32 scaledDensity; - irr::f32 xdpi; - irr::f32 ydpi; -}; - -//! Access SDisplayMetrics -extern bool getDisplayMetrics(android_app* app, SDisplayMetrics & metrics); - -extern void setSoftInputVisibility(android_app* app, bool visible); -} -} - -#endif // __IRR_ANDROID_TOOLS_H__ diff --git a/examples/01.HelloWorld_Android/build.xml b/examples/01.HelloWorld_Android/build.xml deleted file mode 100755 index 3ebae63b..00000000 --- a/examples/01.HelloWorld_Android/build.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/01.HelloWorld_Android/jni/Android.mk b/examples/01.HelloWorld_Android/jni/Android.mk deleted file mode 100755 index 3ac2aa4c..00000000 --- a/examples/01.HelloWorld_Android/jni/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -LOCAL_PATH := $(call my-dir)/.. -IRRLICHT_PROJECT_PATH := $(LOCAL_PATH) - -include $(CLEAR_VARS) -LOCAL_MODULE := Irrlicht -LOCAL_SRC_FILES := $(IRRLICHT_PROJECT_PATH)/../../lib/Android/libIrrlicht.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := HelloWorldMobile - -LOCAL_CFLAGS := -pipe -fno-exceptions -fno-rtti -fstrict-aliasing - -ifndef NDEBUG -LOCAL_CFLAGS += -g -D_DEBUG -else -LOCAL_CFLAGS += -fexpensive-optimizations -O3 -endif - -ifeq ($(TARGET_ARCH_ABI),x86) -LOCAL_CFLAGS += -fno-stack-protector -endif - -LOCAL_C_INCLUDES := ../../include - -LOCAL_SRC_FILES := main.cpp android_tools.cpp - -LOCAL_LDLIBS := -lEGL -llog -lGLESv1_CM -lGLESv2 -lz -landroid - -LOCAL_STATIC_LIBRARIES := Irrlicht android_native_app_glue - -include $(BUILD_SHARED_LIBRARY) - -$(call import-module,android/native_app_glue) - -# copy Irrlicht data to assets - -$(shell mkdir -p $(IRRLICHT_PROJECT_PATH)/assets) -$(shell mkdir -p $(IRRLICHT_PROJECT_PATH)/assets/media) -$(shell mkdir -p $(IRRLICHT_PROJECT_PATH)/assets/media/Shaders) -$(shell mkdir -p $(IRRLICHT_PROJECT_PATH)/src) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/Shaders/*.* $(IRRLICHT_PROJECT_PATH)/assets/media/Shaders/) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/irrlichtlogo3.png $(IRRLICHT_PROJECT_PATH)/assets/media/) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/dwarf.x $(IRRLICHT_PROJECT_PATH)/assets/media/) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/dwarf.jpg $(IRRLICHT_PROJECT_PATH)/assets/media/) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/axe.jpg $(IRRLICHT_PROJECT_PATH)/assets/media/) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/fonthaettenschweiler.bmp $(IRRLICHT_PROJECT_PATH)/assets/media/) -$(shell cp $(IRRLICHT_PROJECT_PATH)/../../media/bigfont.png $(IRRLICHT_PROJECT_PATH)/assets/media/) - diff --git a/examples/01.HelloWorld_Android/jni/Application.mk b/examples/01.HelloWorld_Android/jni/Application.mk deleted file mode 100755 index 6c4880ea..00000000 --- a/examples/01.HelloWorld_Android/jni/Application.mk +++ /dev/null @@ -1,2 +0,0 @@ -APP_PLATFORM := android-10 -APP_MODULES := HelloWorldMobile diff --git a/examples/01.HelloWorld_Android/main.cpp b/examples/01.HelloWorld_Android/main.cpp deleted file mode 100644 index 087da556..00000000 --- a/examples/01.HelloWorld_Android/main.cpp +++ /dev/null @@ -1,387 +0,0 @@ -/** Example 027 Helloworld_Android - This example shows a simple application for Android. -*/ - -#include - -#ifdef _IRR_ANDROID_PLATFORM_ - -#include -#include "android_tools.h" -#include "android/window.h" - -using namespace irr; -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - - -enum GUI_IDS -{ - GUI_INFO_FPS, - GUI_IRR_LOGO, -}; - - -/* - Android is using multitouch events. - We allow users to move around the Irrlicht logo as example of how to use those. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - MyEventReceiver(android_app* app ) - : Device(0), AndroidApp(app), SpriteToMove(0), TouchID(-1) - { - } - - void Init(IrrlichtDevice *device) - { - Device = device; - } - - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_TOUCH_INPUT_EVENT) - { - /* - For now we fake mouse-events. Touch-events will be handled inside Irrlicht in the future, but until - that is implemented you can use this workaround to get a GUI which works at least for simple elements like - buttons. That workaround does ignore multi-touch events - if you need several buttons pressed at the same - time you have to handle that yourself. - */ - SEvent fakeMouseEvent; - fakeMouseEvent.EventType = EET_MOUSE_INPUT_EVENT; - fakeMouseEvent.MouseInput.X = event.TouchInput.X; - fakeMouseEvent.MouseInput.Y = event.TouchInput.Y; - fakeMouseEvent.MouseInput.Shift = false; - fakeMouseEvent.MouseInput.Control = false; - fakeMouseEvent.MouseInput.ButtonStates = 0; - fakeMouseEvent.MouseInput.Event = EMIE_COUNT; - - switch (event.TouchInput.Event) - { - case ETIE_PRESSED_DOWN: - { - // We only work with the first for now.force opengl error - if ( TouchID == -1 ) - { - fakeMouseEvent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN; - - if (Device) - { - position2d touchPoint(event.TouchInput.X, event.TouchInput.Y); - IGUIElement * logo = Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId ( GUI_IRR_LOGO ); - if ( logo && logo->isPointInside (touchPoint) ) - { - TouchID = event.TouchInput.ID; - SpriteToMove = logo; - SpriteStartRect = SpriteToMove->getRelativePosition(); - TouchStartPos = touchPoint; - } - } - } - break; - } - case ETIE_MOVED: - if ( TouchID == event.TouchInput.ID ) - { - fakeMouseEvent.MouseInput.Event = EMIE_MOUSE_MOVED; - fakeMouseEvent.MouseInput.ButtonStates = EMBSM_LEFT; - - if ( SpriteToMove && TouchID == event.TouchInput.ID ) - { - - position2d touchPoint(event.TouchInput.X, event.TouchInput.Y); - MoveSprite(touchPoint); - } - } - break; - case ETIE_LEFT_UP: - if ( TouchID == event.TouchInput.ID ) - { - fakeMouseEvent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP; - - if ( SpriteToMove ) - { - TouchID = -1; - position2d touchPoint(event.TouchInput.X, event.TouchInput.Y); - MoveSprite(touchPoint); - SpriteToMove = 0; - } - } - break; - default: - break; - } - - if ( fakeMouseEvent.MouseInput.Event != EMIE_COUNT && Device ) - { - Device->postEventFromUser(fakeMouseEvent); - } - } - else if ( event.EventType == EET_GUI_EVENT ) - { - /* - Show and hide the soft input keyboard when an edit-box get's the focus. - */ - switch(event.GUIEvent.EventType) - { - case EGET_EDITBOX_ENTER: - if ( event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX ) - { - if( Device->getGUIEnvironment() ) - Device->getGUIEnvironment()->setFocus(NULL); - android::setSoftInputVisibility(AndroidApp, false); - } - break; - case EGET_ELEMENT_FOCUS_LOST: - if ( event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX ) - { - /* Unfortunatly this only works on some android devices. - On other devices Android passes through touch-input events when the virtual keyboard is clicked while blocking those events in areas where the keyboard isn't. - Very likely an Android bug as it only happens in certain cases (like Android Lollipop with landscape mode on MotoG, but also some reports from other devices). - Or maybe Irrlicht still does something wrong. - Can't figure it out so far - so be warned - with landscape mode you might be better off writing your own keyboard. - */ - android::setSoftInputVisibility(AndroidApp, false); - } - break; - case EGET_ELEMENT_FOCUSED: - if ( event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX ) - { - android::setSoftInputVisibility(AndroidApp, true); - } - break; - default: - break; - } - } - - return false; - } - - void MoveSprite(const irr::core::position2d &touchPos) - { - irr::core::position2d move(touchPos-TouchStartPos); - SpriteToMove->setRelativePosition(SpriteStartRect.UpperLeftCorner + move); - } - -private: - IrrlichtDevice * Device; - android_app* AndroidApp; - gui::IGUIElement * SpriteToMove; - core::rect SpriteStartRect; - core::position2d TouchStartPos; - s32 TouchID; -}; - -/* Mainloop. -*/ -void mainloop( IrrlichtDevice *device, IGUIStaticText * infoText ) -{ - u32 loop = 0; // loop is reset when the app is destroyed unlike runCounter - static u32 runCounter = 0; // static's seem to survive even an app-destroy message (not sure if that's guaranteed). - while(device->run()) - { - /* - The window seems to be always active in this setup. - That's because when it's not active Android will stop the code from running. - */ - if (device->isWindowActive()) - { - /* - Show FPS and some counters to show which parts of an app run - in different app-lifecycle states. - */ - if ( infoText ) - { - stringw str = L"FPS:"; - str += (s32)device->getVideoDriver()->getFPS(); - str += L" r:"; - str += runCounter; - str += L" l:"; - str += loop; - infoText->setText ( str.c_str() ); - } - - device->getVideoDriver()->beginScene(true, true, SColor(0,100,100,100)); - device->getSceneManager()->drawAll(); - device->getGUIEnvironment()->drawAll(); - device->getVideoDriver()->endScene (); - } - device->yield(); // probably nicer to the battery - ++runCounter; - ++loop; - } -} - -/* Main application code. */ -void android_main(android_app* app) -{ - // Make sure glue isn't stripped. - app_dummy(); - - /* - The receiver can already receive system events while createDeviceEx is called. - So we create it first. - */ - MyEventReceiver receiver(app); - - /* - Create the device. - You have currently the choice between 2 drivers: - EDT_OGLES1 is basically a opengl fixed function pipeline. - EDT_OGLES2 is a shader pipeline. Irrlicht comes with shaders to simulate - typical fixed function materials. For this to work the - corresponding shaders from the Irrlicht media/Shaders folder are - copied to the application assets folder (done in the Makefile). - */ - SIrrlichtCreationParameters param; -// param.DriverType = EDT_OGLES1; // android:glEsVersion in AndroidManifest.xml should be "0x00010000" (requesting 0x00020000 will also guarantee that ES1 works) - param.DriverType = EDT_OGLES2; // android:glEsVersion in AndroidManifest.xml should be "0x00020000" - param.WindowSize = dimension2d(300,300); // using 0,0 it will automatically set it to the maximal size - param.PrivateData = app; - param.Bits = 24; - param.ZBufferBits = 16; - param.AntiAlias = 0; - param. EventReceiver = &receiver; - - /* Logging is written to a file. So your application should disable all logging when you distribute your - application or it can fill up that file over time. - */ -#ifndef _DEBUG - param.LoggingLevel = ELL_NONE; -#endif - - IrrlichtDevice *device = createDeviceEx(param); - if (device == 0) - return; - - receiver.Init(device); - -// ANativeActivity_setWindowFlags(app->activity, AWINDOW_FLAG_FULLSCREEN, 0); - - IVideoDriver* driver = device->getVideoDriver(); - ISceneManager* smgr = device->getSceneManager(); - IGUIEnvironment* guienv = device->getGUIEnvironment(); - ILogger* logger = device->getLogger(); - IFileSystem * fs = device->getFileSystem(); - - /* Access to the Android native window. You often need this when accessing NDK functions like we are doing here. - Note that windowWidth/windowHeight have already subtracted things like the taskbar which your device might have, - so you get the real size of your render-window. - */ - ANativeWindow* nativeWindow = static_cast(driver->getExposedVideoData().OGLESAndroid.Window); - int32_t windowWidth = ANativeWindow_getWidth(app->window); - int32_t windowHeight = ANativeWindow_getHeight(app->window); - - /* Get display metrics. We are accessing the Java functions of the JVM directly in this case as there is no NDK function for that yet. - Checkout android_tools.cpp if you want to know how that is done. */ - irr::android::SDisplayMetrics displayMetrics; - memset(&displayMetrics, 0, sizeof displayMetrics); - irr::android::getDisplayMetrics(app, displayMetrics); - - /* For troubleshooting you can use the Irrlicht logger. - The Irrlicht logging messages are send to the Android logging system using the tag "Irrlicht". - They stay in a file there, so you can check them even after running your app. - You can watch them with the command: "adb logcat Irrlicht:V DEBUG:V *:S" - This means Irrlicht _V_erbose, debug messages verbose (p.E callstack on crashes) and all other messages _S_ilent. - Clean the logging file with: "adb logcat -c". - See http://developer.android.com/tools/debugging/debugging-log.html for more advanced log options. - */ - char strDisplay[1000]; - sprintf(strDisplay, "Window size:(%d/%d)\nDisplay size:(%d/%d)", windowWidth, windowHeight, displayMetrics.widthPixels, displayMetrics.heightPixels); - logger->log(strDisplay); - - core::dimension2d dim(driver->getScreenSize()); - sprintf(strDisplay, "getScreenSize:(%d/%d)", dim.Width, dim.Height); - logger->log(strDisplay); - - - /* Your media must be somewhere inside the assets folder. The assets folder is the root for the file system. - This example copies the media in the Android.mk makefile. */ - stringc mediaPath = "media/"; - - // The Android assets file-system does not know which sub-directories it has (blame google). - // So we have to add all sub-directories in assets manually. Otherwise we could still open the files, - // but existFile checks will fail (which are for example needed by getFont). - for ( u32 i=0; i < fs->getFileArchiveCount(); ++i ) - { - IFileArchive* archive = fs->getFileArchive(i); - if ( archive->getType() == EFAT_ANDROID_ASSET ) - { - archive->addDirectoryToFileList(mediaPath); - break; - } - } - - /* Set the font-size depending on your device. - dpi=dots per inch. 1 inch = 2.54 cm. */ - IGUISkin* skin = guienv->getSkin(); - IGUIFont* font = 0; - if ( displayMetrics.xdpi < 100 ) // just guessing some value where fontsize might start to get too small - font = guienv->getFont(mediaPath + "fonthaettenschweiler.bmp"); - else - font = guienv->getFont(mediaPath + "bigfont.png"); - if (font) - skin->setFont(font); - - // A field to show some text. Comment out stat->setText in run() if you want to see the dpi instead of the fps. - IGUIStaticText *text = guienv->addStaticText(stringw(displayMetrics.xdpi).c_str(), - rect(5,5,635,35), false, false, 0, GUI_INFO_FPS ); - guienv->addEditBox( L"", rect(5,40,475,80)); - - // add irrlicht logo - IGUIImage * logo = guienv->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), - core::position2d(5,85), true, 0, GUI_IRR_LOGO); - s32 minLogoWidth = windowWidth/3; - if ( logo && logo->getRelativePosition().getWidth() < minLogoWidth ) - { - /* Scale to make it better visible on high-res devices (we could also work with dpi here). - */ - logo->setScaleImage(true); - core::rect logoPos(logo->getRelativePosition()); - f32 scale = (f32)minLogoWidth/(f32)logoPos.getWidth(); - logoPos.LowerRightCorner.X = logoPos.UpperLeftCorner.X + minLogoWidth; - logoPos.LowerRightCorner.Y = logoPos.UpperLeftCorner.Y + (s32)((f32)logoPos.getHeight()*scale); - logo->setRelativePosition(logoPos); - } - - /* - Add a 3d model. Note that you might need to add light when using other models. - A copy of the model and it's textures must be inside the assets folder to be installed to Android. - In this example we do copy it to the assets folder in the Makefile jni/Android.mk - */ - IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "dwarf.x"); - if (!mesh) - { - device->closeDevice(); - device->drop(); - return; - } - smgr->addAnimatedMeshSceneNode( mesh ); - - - /* - To look at the mesh, we place a camera. - */ - smgr->addCameraSceneNode(0, vector3df(15,40,-90), vector3df(0,30,0)); - - /* - Mainloop. Applications usually never quit themself in Android. The OS is responsible for that. - */ - mainloop(device, text); - - /* Cleanup */ - device->setEventReceiver(0); - device->closeDevice(); - device->drop(); -} - -#endif // defined(_IRR_ANDROID_PLATFORM_) - -/* -**/ diff --git a/examples/01.HelloWorld_Android/project.properties b/examples/01.HelloWorld_Android/project.properties deleted file mode 100755 index 5bf8b31b..00000000 --- a/examples/01.HelloWorld_Android/project.properties +++ /dev/null @@ -1 +0,0 @@ -target = android-10 diff --git a/examples/01.HelloWorld_Android/readme.txt b/examples/01.HelloWorld_Android/readme.txt deleted file mode 100644 index 2a9d66f5..00000000 --- a/examples/01.HelloWorld_Android/readme.txt +++ /dev/null @@ -1,95 +0,0 @@ ------------- -REQUIREMENTS ------------- - -To use Android you need to have installed: -- Android SDK (from http://developer.android.com) -- Android NDK (from http://developer.android.com) -- ant (a build tool commonly used for Java) -- A Java jdk (for example openjdk-6-jdk) -- GNU Make 3.81 or later -- A recent version of awk -- On Windows you need to have Cygwin (at least version 1.7) installed - ----------------------------- -BUILDING Irrlicht & your App ----------------------------- - -1. Assign your Android SDK path to an ANDROID_HOME environment variable. -2. Add $ANDROID_HOME/tools and $ANDROID_HOME/platform-tools and the Android NDK main folder to your PATH environment variable. -3. Go to: source/Irrlicht/Android and call "ndk-build" or "ndk-build NDEBUG=1" -4. Go to: examples/01.HelloWorld_Android and call "ndk-build" or "ndk-build NDEBUG=1" -5. Call "ant debug" to create package -6. Connect device to PC (with USB debugging mode ON) or turn on emulator. -7. Call "adb -d install bin/HelloWorldMobile-debug.apk" (if you use emulator please add "-e" parameter instead of "-d") to install package on your device/emulator. - -Troubleshooting: - -Error: Unable to resolve project target 'android-10' -Solution: Run "android sdk" in sdk/tools and install API 10. - Alternatively you can probably (not yet tested) set another APP_PLATFORM - in the Application.mk's for the project and for Irrlicht. In this case you - should likely also change the android:minSdkVersion in the AndroidManifest.xml - ------ -FILES ------ - -AndroidManifest.xml: - Every Android application needs one of those to describe the needs of the application. - Must have exactly this name. - See http://developer.android.com/guide/topics/manifest/manifest-intro.html - -build.xml: - Ant build file to create the final package. - You might want to create a new one as described in the Android documentation: - http://developer.android.com/tools/projects/projects-cmdline.html - That will then also update project.properties. - -project.properties - Contains the build target (and maybe other project properties). Must exist. - -jni: - A folder by this name must exist below the folder where you have build.xml. - Usually it contains the native (c/c++) source files, but in our case we put - the source-files one level higher (with LOCAL_PATH in Android.mk). - -jni/Android.mk: - The Makefile for the project. - Source-files in the project are added to LOCAL_SRC_FILES - In the Irrlicht example it also copies the assets, but you can - also already create your project assets in the right place. - -jni/Application.mk: - Optional file which for example restricts which modules are installed and - where you can set specific target architectures. - More info about this can be found in the ndk docs. - -res: - A folder with resources which districuted with your application and can be accessed via ID's. - Unfortunately no direct NDK access to resources at the time of writing this. So you either have - to access them with java-code and copy to c++ somehow or you have to use hacks to read the format - directly (which is done by some apps, but not future-safe and google recommends not doing that). - Please check the official "App Resources" android developer documention, as this is rather complex. - We use it only for the application icons in this example. - -assets: - Files in here are distributed with your app. It's acting like a read-only file system. - -assets/media/Shaders: - Shader code needed by the OGLES2 driver to simulate a fixed function pipeline. - In the example this code is automatically copied within the Android.mk makefile. - The path where the shaders are searched is set in the IRR_OGLES2_SHADER_PATH define in IrrCompileConfig.h - The names are hardcoded so they have to be identical to those found in media/Shaders. - You can rewrite the shaders, but ensure to add some working shaders files by those names. - The OGLES1 driver doesn't need those files. - -obj: - All object and library files mentioned in the Android.mk are put in here before linking. - -libs: - Contains the binaries of your application after compilation. The application itself is a lib(probably because native code can't run directly but only as lib). - -src: - The src folder is needed when you have Java sources and should only contain .java and .aidl files. - Although the examples doesn't use Java the makefile creates this folder as the ant build.xml in the android sdk needs it. diff --git a/examples/01.HelloWorld_Android/res/drawable-hdpi/irr_icon.png b/examples/01.HelloWorld_Android/res/drawable-hdpi/irr_icon.png deleted file mode 100755 index 65813ad1a6c7952cd14fdd2e2c7ed3c2aa1b5874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8103 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 B69)hQ diff --git a/examples/01.HelloWorld_Android/res/drawable-ldpi/irr_icon.png b/examples/01.HelloWorld_Android/res/drawable-ldpi/irr_icon.png deleted file mode 100755 index 11e3ae24b5ef7b35ba9e85358c973010035ea220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2890 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 IM6N<$f_J<{p8x;= diff --git a/examples/01.HelloWorld_Android/res/drawable-xhdpi/irr_icon.png b/examples/01.HelloWorld_Android/res/drawable-xhdpi/irr_icon.png deleted file mode 100755 index 89573a3cf4a0626166837fc3ef3a4e1a3fcf522b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13099 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 diff --git a/examples/01.HelloWorld_emscripten/Makefile b/examples/01.HelloWorld_emscripten/Makefile deleted file mode 100644 index f60a678e..00000000 --- a/examples/01.HelloWorld_emscripten/Makefile +++ /dev/null @@ -1,98 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 01.HelloEmscripten -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -all_emscripten: EMSCRIPTEN=1 - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG - ifdef EMSCRIPTEN - LDFLAGS += -s DEMANGLE_SUPPORT=1 - endif - CXXFLAGS += -g -Wall -else - ifdef EMSCRIPTEN - LDFLAGS += -O3 - endif - CXXFLAGS += -O3 -endif -ifdef EMSCRIPTEN - CXXFLAGS += -std=gnu++11 -U__STRICT_ANSI__ -endif - -ifdef EMSCRIPTEN - all: all_emscripten -else - all: all_linux -endif - -# target specific settings -all_linux all_emscripten all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -ifndef EMSCRIPTEN - LDFLAGS += -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -endif -all_linux clean_linux: SYSTEM=Linux -all_emscripten clean_emscripten: SYSTEM=emscripten -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -all_emscripten clean_emscripten: SUF=.html -all_emscripten: CXXFLAGS += -fno-exceptions -fno-rtti -fstrict-aliasing -std=gnu++11 -U__STRICT_ANSI__ -# Pass on a custom html file. -#all_emscripten: CXXFLAGS += --shell-file shell_minimal.html -all_emscripten: LDFLAGS += -lGL -lSDL --preload-file ../../media@/media -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=1 -#If you know the maximum memory (in bytes) which your application need then set it. It can speed things up a lot. -#all_emscripten: LDFLAGS += -s TOTAL_MEMORY=268435456 -# You need the FULL_ES2 when using EDT_OGLES2 driver -#all_emscripten: LDFLAGS += -s FULL_ES2=1 -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -# Enable compiling to WASM and not just asm.js (you have to set it in the engine Makefile as well) -ifdef EMSCRIPTEN - ifdef WASM - CXXFLAGS += -s WASM=1 - endif -endif - -emscripten: all_emscripten - -all_linux all_win32 all_emscripten static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 clean_emscripten - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -clean_emscripten: - @$(RM) $(BinPath)/$(Target).data - @$(RM) $(BinPath)/$(Target).html* - @$(RM) $(BinPath)/$(Target).js - - -.PHONY: all all_win32 all_emscripten static_win32 clean clean_linux clean_win32 clean_emscripten - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/01.HelloWorld_emscripten/main.cpp b/examples/01.HelloWorld_emscripten/main.cpp deleted file mode 100644 index 86b960da..00000000 --- a/examples/01.HelloWorld_emscripten/main.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/** Example 001 HelloWorld adapted to emscripten - -This Tutorial shows how to run code with emscripten. -Emscripten compiles c++ to asm.js to allow it running inside a webbrowser. -You have to setup the emscripten environment on your system first to use this. -*/ -#include -#include "exampleHelper.h" -#include -#include - -/* -The code in here is mostly similar to the usual HelloWorld. -You can find more information about it there. Here we mainly document the -differences needed for emscripten. -*/ - -using namespace irr; -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -/* -This part not necessary for emscripten, only useful to keep it in -in case you want to run the same code on Windows with VS as well. -*/ -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") -#endif - - -/* -Variables on the stack will stay intact between runs of one_iter() -*/ -IrrlichtDevice *device = 0; -IVideoDriver* driver = 0; -ISceneManager* smgr = 0; -IGUIEnvironment* guienv = 0; - -ICameraSceneNode* camera = 0; -dimension2d screenSize(640, 480); - -#ifdef __EMSCRIPTEN__ -/* - Handle changes in canvas size which are done with html/js. - Note that it's only OK for windowed so far, - the switch to fullscreen not yet working. - Also the emscripten_get_canvas_size might cause a slow-down - (but haven't found yet a way to avoid it with SDL1). - */ -void checkCanvasResize() -{ - int w, h, fs; - emscripten_get_canvas_size(&w, &h, &fs); - const core::dimension2d canvasDim(w,h); - if ( canvasDim != screenSize ) - { - screenSize = canvasDim; - driver->OnResize(canvasDim); - driver->setViewPort(irr::core::rect(0,0,w,h)); - - irr::f32 aspect = (irr::f32)w / (irr::f32)h; - camera->setAspectRatio(aspect); - } -} - - -/* - emscripten can't run things in an endless-loop or otherwise the browse will consider - the script to hang. -*/ -void one_iter() -{ - if(!device->run()) - { - // Could clean up here in theory, but not sure if it makes a difference - - /* - This tells emscripten to not run any further code. - */ - emscripten_cancel_main_loop(); - return; - } - - // In case you have a resizeable canvas (resized from html) - //checkCanvasResize(); - - driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255,100,101,140)); - - smgr->drawAll(); - guienv->drawAll(); - - driver->endScene(); -} -#endif //__EMSCRIPTEN__ - - -/* - The main method is also run on emscripten. -*/ -int main() -{ - /* - Printing out the build date/time is very useful to find troubles with unexpected browser-caches. - */ - printf("Build-date: %s %s\n", __DATE__, __TIME__); - - SIrrlichtCreationParameters parameters; - /* - Create device flags for emscripten are still experimental - and might not all work. - - - deviceType: You can to use EDT_OGLES2 or EDT_WEBGL1 on emscripten. - EDT_WEBGL1 is better optimized but does not yet support all options. - EDT_OGLES2 needs -s FULL_ES2=1 as linker flag in the Makefile. - */ -#ifndef __EMSCRIPTEN__ - parameters.DriverType = EDT_OGLES2; -#else //__EMSCRIPTEN__ - parameters.DriverType = EDT_WEBGL1; -#endif //__EMSCRIPTEN__ - - parameters.LoggingLevel = ELL_DEBUG; - parameters.WindowSize = screenSize; - parameters.Stencilbuffer = false; - parameters.AntiAlias = 4; - - device = createDeviceEx(parameters); - - if (!device) - return 1; - - /* - Window caption will set the title-text in the browser. - */ - device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); - - /* - Get a pointer to the VideoDriver, the SceneManager and the graphical - user interface environment, so that we do not always have to write - device->getVideoDriver(), device->getSceneManager(), or - device->getGUIEnvironment(). - */ - driver = device->getVideoDriver(); - smgr = device->getSceneManager(); - guienv = device->getGUIEnvironment(); - - /* - We add a hello world label to the window, using the GUI environment. - The text is placed at the position (10,10) as top left corner and - (260,22) as lower right corner. - */ - guienv->addStaticText(L"Hello World! This is Irrlicht on emscripten!", - rect(10,10,260,22), true); - - /* - Get a media path dedicated for your platform. - We tell emscripten to copy the media folder in the Makefile with: - "--preload-file ../../media@/media" - That copies our ../../media folder in a .data - file which is loaded by the browser. It can then be accessed there - by "/media" name (that's the parameter after the '@'). - Note that usually you would try to copy only as many files - as absolutely necessary to reduce start-up times. - */ - const io::path mediaPath = getExampleMediaPath(); - - /* - Make a model called Sydney show up. - */ - IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "sydney.md2"); - if (!mesh) - { - device->drop(); - return 1; - } - IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); - - /* - Disable lighting because we do not have a dynamic light in here, and - the mesh would be totally black otherwise. - Set the frame loop such that the predefined STAND animation is used. - Add a texture to the model. - */ - if (node) - { - node->setMaterialFlag(EMF_LIGHTING, false); - node->setMD2Animation(scene::EMAT_STAND); - node->setMaterialTexture( 0, driver->getTexture(mediaPath + "sydney.bmp") ); - } - - /* - To look at the mesh, we place a camera into 3d space at the position - (0, 30, -40). The camera looks from there to (0,5,0), which is - approximately the place where our md2 model is. - */ - camera = smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); - -#ifndef __EMSCRIPTEN__ // this part only so you can run the same code on desktop - /* - On desktop we run and endless loop until the user closes the window or - presses ALT+F4 (or whatever keycode closes a window). - */ - while(device->run()) - { - driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255,100,101,140)); - - smgr->drawAll(); - guienv->drawAll(); - - driver->endScene(); - } - device->drop(); - -#else // __EMSCRIPTEN__ - - /* - Setting fps to 0 or a negative value will use the browser’s - requestAnimationFrame mechanism to call the main loop function. - Emscripten documentation recommends to do that, but you can also set - another fps value and the browser will try to call the main-loop - fps times per second. - The simulate_infinite_loop tells emscripten that this is an application - which will simulate an infinite loop. There is also a flag in the - Makefile about that: -s NO_EXIT_RUNTIME=1 - */ - int fps = 0; - int simulate_infinite_loop = 1; - emscripten_set_main_loop(one_iter, fps, simulate_infinite_loop); -#endif //__EMSCRIPTEN__ - - return 0; -} - -/* -That's it. Compile and run. -**/ diff --git a/examples/01.HelloWorld_emscripten/readme.txt b/examples/01.HelloWorld_emscripten/readme.txt deleted file mode 100644 index e1cfb5b2..00000000 --- a/examples/01.HelloWorld_emscripten/readme.txt +++ /dev/null @@ -1,24 +0,0 @@ -Emscripten is a project to compile c/c++ code int the asm.js format which can be run in some browsers. -See http://kripken.github.io/emscripten-site for more information. - -emscripten support for Irrlicht is a work in process. Use at your own risk. -Might take work and knowledge to get it running. - ------------- -REQUIREMENTS ------------- -You have to install the emscripten environment. - ----------------------------- -BUILDING Irrlicht & your App ----------------------------- - -Linux: -Go into source/Irrlicht folder and call: -emmake make emscripten - - -Go into examples/01.HelloWord_emscripten folder and call: -emmake make all_emscripten - -Note: The shell_minimal.html is currently not used (as resizing isn't working yet correctly), but can be enabled in the Makefile. diff --git a/examples/01.HelloWorld_emscripten/shell_minimal.html b/examples/01.HelloWorld_emscripten/shell_minimal.html deleted file mode 100644 index 15d8b3bf..00000000 --- a/examples/01.HelloWorld_emscripten/shell_minimal.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - Emscripten-Generated Code - - - - - - - - - - -
-
emscripten
-
Downloading...
-
- -
-
- -
-
-
- Resize canvas - Lock/hide mouse pointer -     - -
- -
- -
- - {{{ SCRIPT }}} - - diff --git a/examples/01.HelloWorld_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/01.HelloWorld_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 36d2c80d..00000000 --- a/examples/01.HelloWorld_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/project.pbxproj b/examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/project.pbxproj deleted file mode 100644 index 18933c8d..00000000 --- a/examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,302 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E172FF01C1DB99B0024464F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E172FEF1C1DB99B0024464F /* UIKit.framework */; }; - 5E172FF21C1DB9C80024464F /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E172FF11C1DB9C80024464F /* CoreMotion.framework */; }; - 5E172FF41C1DBA610024464F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E172FF31C1DBA610024464F /* OpenGLES.framework */; }; - 5E172FF81C1DBAC30024464F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E172FF71C1DBAC30024464F /* Foundation.framework */; }; - 5E172FFC1C1DBB280024464F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E172FFB1C1DBB280024464F /* QuartzCore.framework */; }; - 5E6AC1831C1DA8A100DADD92 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E6AC1821C1DA8A100DADD92 /* main.cpp */; }; - 5E6AC1881C1DA9C000DADD92 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E6AC1871C1DA9C000DADD92 /* media */; }; - 5E6AC18B1C1DAA3100DADD92 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E6AC18A1C1DAA3100DADD92 /* Assets.xcassets */; }; - 5E6AC18D1C1DAD9500DADD92 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E6AC18C1C1DAD9500DADD92 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E172FEF1C1DB99B0024464F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 5E172FF11C1DB9C80024464F /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 5E172FF31C1DBA610024464F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 5E172FF71C1DBAC30024464F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 5E172FFB1C1DBB280024464F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 5E6AC1821C1DA8A100DADD92 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E6AC1871C1DA9C000DADD92 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; - 5E6AC1891C1DA9CE00DADD92 /* 28.HelloWorld_iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 28.HelloWorld_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E6AC18A1C1DAA3100DADD92 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 5E6AC18C1C1DAD9500DADD92 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/iOS/libIrrlicht.a; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E6AC1651C1DA6CF00DADD92 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E172FF21C1DB9C80024464F /* CoreMotion.framework in Frameworks */, - 5E172FF81C1DBAC30024464F /* Foundation.framework in Frameworks */, - 5E172FF41C1DBA610024464F /* OpenGLES.framework in Frameworks */, - 5E172FF01C1DB99B0024464F /* UIKit.framework in Frameworks */, - 5E172FFC1C1DBB280024464F /* QuartzCore.framework in Frameworks */, - 5E6AC18D1C1DAD9500DADD92 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E6AC15F1C1DA6CF00DADD92 = { - isa = PBXGroup; - children = ( - 5E6AC1821C1DA8A100DADD92 /* main.cpp */, - 5E6AC1851C1DA91500DADD92 /* Libraries */, - 5E6AC1841C1DA90B00DADD92 /* Products */, - 5E6AC1861C1DA91E00DADD92 /* Resources */, - ); - sourceTree = ""; - }; - 5E6AC1841C1DA90B00DADD92 /* Products */ = { - isa = PBXGroup; - children = ( - 5E6AC1891C1DA9CE00DADD92 /* 28.HelloWorld_iOS.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E6AC1851C1DA91500DADD92 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E172FF11C1DB9C80024464F /* CoreMotion.framework */, - 5E172FF71C1DBAC30024464F /* Foundation.framework */, - 5E172FF31C1DBA610024464F /* OpenGLES.framework */, - 5E172FEF1C1DB99B0024464F /* UIKit.framework */, - 5E172FFB1C1DBB280024464F /* QuartzCore.framework */, - 5E6AC18C1C1DAD9500DADD92 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E6AC1861C1DA91E00DADD92 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E6AC18A1C1DAA3100DADD92 /* Assets.xcassets */, - 5E6AC1871C1DA9C000DADD92 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E6AC1671C1DA6CF00DADD92 /* 28.HelloWorld_iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E6AC17F1C1DA6D000DADD92 /* Build configuration list for PBXNativeTarget "28.HelloWorld_iOS" */; - buildPhases = ( - 5E6AC1641C1DA6CF00DADD92 /* Sources */, - 5E6AC1651C1DA6CF00DADD92 /* Frameworks */, - 5E6AC1661C1DA6CF00DADD92 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 28.HelloWorld_iOS; - productName = 28.HelloWorld_iOS; - productReference = 5E6AC1891C1DA9CE00DADD92 /* 28.HelloWorld_iOS.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E6AC1601C1DA6CF00DADD92 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E6AC1671C1DA6CF00DADD92 = { - CreatedOnToolsVersion = 7.1.1; - }; - }; - }; - buildConfigurationList = 5E6AC1631C1DA6CF00DADD92 /* Build configuration list for PBXProject "HelloWorld_iOS" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E6AC15F1C1DA6CF00DADD92; - productRefGroup = 5E6AC15F1C1DA6CF00DADD92; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E6AC1671C1DA6CF00DADD92 /* 28.HelloWorld_iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E6AC1661C1DA6CF00DADD92 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E6AC18B1C1DAA3100DADD92 /* Assets.xcassets in Resources */, - 5E6AC1881C1DA9C000DADD92 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E6AC1641C1DA6CF00DADD92 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E6AC1831C1DA8A100DADD92 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E6AC17D1C1DA6D000DADD92 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 5E6AC17E1C1DA6D000DADD92 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5E6AC1801C1DA6D000DADD92 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include"; - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_ios.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/iOS"; - PRODUCT_BUNDLE_IDENTIFIER = "org.irrlicht.-8-HelloWorld-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 5E6AC1811C1DA6D000DADD92 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - HEADER_SEARCH_PATHS = "$(SRCROOT)/../../include"; - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_ios.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/iOS"; - PRODUCT_BUNDLE_IDENTIFIER = "org.irrlicht.-8-HelloWorld-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E6AC1631C1DA6CF00DADD92 /* Build configuration list for PBXProject "HelloWorld_iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E6AC17D1C1DA6D000DADD92 /* Debug */, - 5E6AC17E1C1DA6D000DADD92 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E6AC17F1C1DA6D000DADD92 /* Build configuration list for PBXNativeTarget "28.HelloWorld_iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E6AC1801C1DA6D000DADD92 /* Debug */, - 5E6AC1811C1DA6D000DADD92 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E6AC1601C1DA6CF00DADD92 /* Project object */; -} diff --git a/examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/xcshareddata/xcschemes/28.HelloWorld_iOS.xcscheme b/examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/xcshareddata/xcschemes/28.HelloWorld_iOS.xcscheme deleted file mode 100644 index 61feff08..00000000 --- a/examples/01.HelloWorld_iOS/HelloWorld_iOS.xcodeproj/xcshareddata/xcschemes/28.HelloWorld_iOS.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/01.HelloWorld_iOS/main.cpp b/examples/01.HelloWorld_iOS/main.cpp deleted file mode 100644 index 93b9405f..00000000 --- a/examples/01.HelloWorld_iOS/main.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include "exampleHelper.h" - -using namespace irr; - -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -// It's important for iOS projects to use 'irrlicht_main' instead of standard 'main' function. - -void irrlicht_main() -{ - IrrlichtDevice *device = createDevice(EDT_OGLES2, dimension2d(0, 0), 16, false, false, false, 0); - - if (!device) - return; - - device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); - - IVideoDriver* driver = device->getVideoDriver(); - ISceneManager* smgr = device->getSceneManager(); - IGUIEnvironment* guienv = device->getGUIEnvironment(); - - guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!", rect(10,10,260,22), true); - - const io::path mediaPath = getExampleMediaPath(); - - IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "sydney.md2"); - - if (!mesh) - { - device->drop(); - return; - } - - IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); - - if (node) - { - node->setMaterialFlag(EMF_LIGHTING, false); - node->setMD2Animation(scene::EMAT_STAND); - node->setMaterialTexture( 0, driver->getTexture(mediaPath + "sydney.bmp") ); - } - - smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); - - while (device->run()) - if (device->isWindowActive()) - { - driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255,255,255,255)); - - smgr->drawAll(); - guienv->drawAll(); - - driver->endScene(); - } - - device->drop(); -} diff --git a/examples/02.Quake3Map/Makefile b/examples/02.Quake3Map/Makefile deleted file mode 100644 index 10f2fcd7..00000000 --- a/examples/02.Quake3Map/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 02.Quake3Map -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/02.Quake3Map/Quake3Map.cbp b/examples/02.Quake3Map/Quake3Map.cbp deleted file mode 100644 index 2d54a9c1..00000000 --- a/examples/02.Quake3Map/Quake3Map.cbp +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - diff --git a/examples/02.Quake3Map/Quake3Map.vcproj b/examples/02.Quake3Map/Quake3Map.vcproj deleted file mode 100644 index 4416fbb4..00000000 --- a/examples/02.Quake3Map/Quake3Map.vcproj +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/02.Quake3Map/Quake3Map.xcodeproj/project.pbxproj b/examples/02.Quake3Map/Quake3Map.xcodeproj/project.pbxproj deleted file mode 100644 index e9ef2605..00000000 --- a/examples/02.Quake3Map/Quake3Map.xcodeproj/project.pbxproj +++ /dev/null @@ -1,326 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 02.Quake3Map.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 02.Quake3Map.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 02.Quake3Map.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 02.Quake3Map */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "02.Quake3Map" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 02.Quake3Map; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 02.Quake3Map.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Quake3Map" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 02.Quake3Map */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "org.irrlicht.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "org.irrlicht.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Quake3Map" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "02.Quake3Map" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/02.Quake3Map/Quake3Map.xcodeproj/xcshareddata/xcschemes/02.Quake3Map.xcscheme b/examples/02.Quake3Map/Quake3Map.xcodeproj/xcshareddata/xcschemes/02.Quake3Map.xcscheme deleted file mode 100644 index 68dd239a..00000000 --- a/examples/02.Quake3Map/Quake3Map.xcodeproj/xcshareddata/xcschemes/02.Quake3Map.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/02.Quake3Map/Quake3Map_vc10.vcxproj b/examples/02.Quake3Map/Quake3Map_vc10.vcxproj deleted file mode 100644 index f45673aa..00000000 --- a/examples/02.Quake3Map/Quake3Map_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 02.Quake3Map - {D1A464A2-D479-458C-98A2-60965D823CD1} - Quake3Map - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/02.Quake3Map/Quake3Map_vc11.vcxproj b/examples/02.Quake3Map/Quake3Map_vc11.vcxproj deleted file mode 100644 index f45673aa..00000000 --- a/examples/02.Quake3Map/Quake3Map_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 02.Quake3Map - {D1A464A2-D479-458C-98A2-60965D823CD1} - Quake3Map - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/02.Quake3Map/Quake3Map_vc12.vcxproj b/examples/02.Quake3Map/Quake3Map_vc12.vcxproj deleted file mode 100644 index 042060f3..00000000 --- a/examples/02.Quake3Map/Quake3Map_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 02.Quake3Map - {D1A464A2-D479-458C-98A2-60965D823CD1} - Quake3Map - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/02.Quake3Map/Quake3Map_vc14.vcxproj b/examples/02.Quake3Map/Quake3Map_vc14.vcxproj deleted file mode 100644 index df7001d1..00000000 --- a/examples/02.Quake3Map/Quake3Map_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 02.Quake3Map - {D1A464A2-D479-458C-98A2-60965D823CD1} - Quake3Map - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Quake3Map.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Quake3Map.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\02.Quake3Map.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/02.Quake3Map/main.cpp b/examples/02.Quake3Map/main.cpp deleted file mode 100644 index 042b70fe..00000000 --- a/examples/02.Quake3Map/main.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/** Example 002 Quake3Map - -This tutorial shows how to load a Quake 3 map into the engine, create a -SceneNode for optimizing the speed of rendering, and how to create a user -controlled camera. - -Please note that you should know the basics of the engine before starting this -tutorial. Just take a short look at the first tutorial, if you haven't done -this yet: http://irrlicht.sourceforge.net/docu/example001.html - -Lets start like the HelloWorld example: We include the irrlicht header files -and an additional file to be able to ask the user for a driver type using the -console. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -/* -As already written in the HelloWorld example, in the Irrlicht Engine everything -can be found in the namespace 'irr'. To get rid of the irr:: in front of the -name of every class, we tell the compiler that we use that namespace from now -on, and we will not have to write that 'irr::'. There are 5 other sub -namespaces 'core', 'scene', 'video', 'io' and 'gui'. Unlike in the HelloWorld -example, we do not call 'using namespace' for these 5 other namespaces, because -in this way you will see what can be found in which namespace. But if you like, -you can also include the namespaces like in the previous example. -*/ -using namespace irr; - -/* -Again, to be able to use the Irrlicht.DLL file, we need to link with the -Irrlicht.lib. We could set this option in the project settings, but to make it -easy, we use a pragma comment lib: -*/ -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* -OK, lets start. Again, we use the main() method as start, not the WinMain(). -*/ -int main() -{ - /* - Like in the HelloWorld example, we create an IrrlichtDevice with - createDevice(). The difference now is that we ask the user to select - which video driver to use. The Software device might be - too slow to draw a huge Quake 3 map, but just for the fun of it, we make - this decision possible, too. - */ - - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(true); - if (driverType==video::EDT_COUNT) - return 1; - - // create device and exit if creation failed - - IrrlichtDevice *device = - createDevice(driverType, core::dimension2d(640, 480)); - - if (device == 0) - return 1; // could not create selected driver. - - /* - Get a pointer to the video driver and the SceneManager so that - we do not always have to call irr::IrrlichtDevice::getVideoDriver() and - irr::IrrlichtDevice::getSceneManager(). - */ - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - /* - To display the Quake 3 map, we first need to load it. Quake 3 maps - are packed into .pk3 files which are nothing else than .zip files. - So we add the .pk3 file to our irr::io::IFileSystem. After it was added, - we can read from the files in that archive as if they were stored on disk. - */ - device->getFileSystem()->addFileArchive(getExampleMediaPath() + "map-20kdm2.pk3"); - - /* - Now we can load the mesh by calling irr::scene::ISceneManager::getMesh(). - We get a pointer returned to an irr::scene::IAnimatedMesh. Quake 3 maps are - not really animated, they are only a chunk of static geometry with - some materials attached. Hence the IAnimatedMesh consists of only one - frame, so we get the "first frame" of the "animation", which is our - quake level and create an Octree scene node with it, using - irr::scene::ISceneManager::addOctreeSceneNode(). - The Octree optimizes the scene a little bit, trying to draw only geometry - which is currently visible. An alternative to the Octree would be a - irr::scene::IMeshSceneNode, which would always draw the complete - geometry of the mesh, without optimization. Try it: Use - irr::scene::ISceneManager::addMeshSceneNode() instead of - addOctreeSceneNode() and compare the primitives drawn by the video - driver. (There is a irr::video::IVideoDriver::getPrimitiveCountDrawn() - method in the irr::video::IVideoDriver class). Note that this - optimization with the Octree is only useful when drawing huge meshes - consisting of lots of geometry and if users can't see the whole scene at - once. - */ - scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp"); - scene::ISceneNode* node = 0; - - if (mesh) - node = smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024); -// node = smgr->addMeshSceneNode(mesh->getMesh(0)); - - /* - Because the level was not modeled around the origin (0,0,0), we - translate the whole level a little bit. This is done on - irr::scene::ISceneNode level using the methods - irr::scene::ISceneNode::setPosition() (in this case), - irr::scene::ISceneNode::setRotation(), and - irr::scene::ISceneNode::setScale(). - */ - if (node) - node->setPosition(core::vector3df(-1300,-144,-1249)); - - /* - Now we need a camera to look at the Quake 3 map. - We want to create a user controlled camera. There are some - cameras available in the Irrlicht engine. For example the - MayaCamera which can be controlled like the camera in Maya: - Rotate with left mouse button pressed, Zoom with both buttons pressed, - translate with right mouse button pressed. This could be created with - irr::scene::ISceneManager::addCameraSceneNodeMaya(). But for this - example, we want to create a camera which behaves like the ones in - first person shooter games (FPS) and hence use - irr::scene::ISceneManager::addCameraSceneNodeFPS(). - */ - smgr->addCameraSceneNodeFPS(); - - /* - The mouse cursor needs not be visible, so we hide it via the - irr::IrrlichtDevice::ICursorControl. - */ - device->getCursorControl()->setVisible(false); - - /* - Everything is set up, so lets draw it. We also write the current - frames per second and the primitives drawn into the caption of the - window. The test for irr::IrrlichtDevice::isWindowActive() is optional, - but prevents the engine to grab the mouse cursor after task switching - when other programs are active. The call to irr::IrrlichtDevice::yield() - will avoid the busy loop to eat up all CPU cycles when the window is not - active. - */ - int lastFPS = -1; - - while(device->run()) - { - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,200,200,200)); - smgr->drawAll(); - driver->endScene(); - - int fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw str = L"Irrlicht Engine - Quake 3 Map example ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - else - device->yield(); - } - - /* - In the end, delete the Irrlicht device. - */ - device->drop(); - return 0; -} - -/* -That's it. Compile and play around with the program. -**/ diff --git a/examples/02.Quake3Map/tutorial.html b/examples/02.Quake3Map/tutorial.html deleted file mode 100644 index 1858b866..00000000 --- a/examples/02.Quake3Map/tutorial.html +++ /dev/null @@ -1,181 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
- Tutorial 2.Quake3Map
-

This Tutorial shows how to load a Quake 3 map into the engine, create - a SceneNode for optimizing the speed of rendering and how to create - a user controlled camera. Please note that you should know the basics - of the engine before starting this tutorial, just take a short look - at the first tutorial, 1.HelloWorld, if you haven't done this yet.
- The result of this example will look like this:

-


-

-
-
- - - - - - - -
- Lets start!
-

Lets start like the HelloWorld example: We include the irrlicht header - files and an additional file to be able
- to ask the user for a driver type using the console.

- - - - -
#include <irrlicht.h>
#include <iostream>
-

As already written in the HelloWorld example, in the Irrlicht Engine, - everything can be found in the namespace 'irr'. To get rid of the irr:: - in front of the name of every class, we tell the compiler that we use - that namespace from now on, and we will not have to write that 'irr::'.
- There are 5 other sub namespaces 'core', 'scene', 'video', 'io' and - 'gui'. Unlike in the HelloWorld example, we do not a 'using namespace' - for these 5 other namespaces because in this way you will see what can - be found in which namespace. But if you like, you can also include the - namespaces like in the previous example. Code just like you want to.

- - - - -
using namespace irr;
-

Again, to be able to use the Irrlicht.DLL file, we need to link with - the Irrlicht.lib. We could set this option in the project settings, - but to make it easy, we use a pragma comment lib:

- - - - -
#pragma comment(lib, "Irrlicht.lib")
- -
-

Ok, lets start. Again, we use the main() method as start, not the WinMain(), - because its shorter to write.

- - - - -
int main()
{
-

Like in the HelloWorld example, we create an IrrlichtDevice with createDevice(). - The difference now is that we ask the user to select which hardware accelerated - driver to use. The Software device would be too slow to draw a huge Quake - 3 map, but just for the fun of it, we make this decision possible too.

- - - - -
// ask user for driver

video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");
-char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
}

// create device and exit if creation failed

IrrlichtDevice *device =
createDevice(driverType, core::dimension2d<s32>(640, 480));

if (device == 0)
return 1;
-

Get a pointer to the video driver and the SceneManager so that we do - not always have to write device->getVideoDriver() and device->getSceneManager().

- - - - -
video::IVideoDriver* driver = device->getVideoDriver();
-scene::ISceneManager* smgr = device->getSceneManager();
-

To display the Quake 3 map, we first need to load it. Quake 3 maps are - packed into .pk3 files wich are nothing other than .zip files. So we add - the .pk3 file to our FileSystem. After it was added, we are able to read - from the files in that archive as they would directly be stored on disk.

- - - - -
device->getFileSystem()->addZipFileArchive("../../media/map-20kdm2.pk3");
-

Now we can load the mesh by calling getMesh(). We get a pointer returned - to a IAnimatedMesh. As you know, Quake 3 maps are not really animated, - they are only a huge chunk of static geometry with some materials attached. - Hence the IAnimated mesh consists of only one frame,
- so we get the "first frame" of the "animation", which - is our quake level and create an OctTree scene node with it, using addOctTreeSceneNode(). - The OctTree optimizes the scene a little bit, trying to draw only geometry - which is currently visible. An alternative to the OctTree would be a AnimatedMeshSceneNode, - which would draw always the complete geometry of the mesh, without optimization. - Try it out: Write addAnimatedMeshSceneNode instead of addOctTreeSceneNode - and compare the primitives drawed by the video driver. (There is a getPrimitiveCountDrawed() - method in the IVideoDriver class). Note that this optimization with the - Octree is only useful when drawing huge meshes consiting of lots of geometry.

- - - - -
scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
scene::ISceneNode* node = 0; - -if (mesh)
node = smgr->addOctTreeSceneNode(mesh->getMesh(0));
-

Because the level was modelled not around the origin (0,0,0), we translate - the whole level a little bit.

- - - - -
if (node)
node->setPosition(core::vector3df(-1300,-144,-1249));
-

Now we only need a Camera to look at the Quake 3 map. And we want to - create a user controlled camera. There are some different cameras available - in the Irrlicht engine. For example the Maya Camera which can be controlled - compareable to the camera in Maya: Rotate with left mouse button pressed, - Zoom with both buttons pressed,
- translate with right mouse button pressed. This could be created with - addCameraSceneNodeMaya(). But for this example, we want to create a camera - which behaves like the ones in first person shooter games (FPS):

- - - - -
smgr->addCameraSceneNodeFPS();
-

The mouse cursor needs not to be visible, so we make it invisible.

- - - - -
device->getCursorControl()->setVisible(false);
-

We have done everything, so lets draw it. We also write the current frames - per second and the drawn primitives to the caption of the window. The - 'if (device->isWindowActive())' line is optional, but prevents the - engine render to set the position of the mouse cursor after task switching - when other program are active.

- - - - -
int lastFPS = -1;
-
while(device->run())
-{
-  driver->beginScene(true, true, video::SColor(0,200,200,200));
-  smgr->drawAll();
-  driver->endScene();
-
  int fps = driver->getFPS();
-
  if (lastFPS != fps)
-  {
-     core::stringw str = L"Irrlicht Engine - Quake 3 Map example [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps; - } -}
-

In the end, delete the Irrlicht device.

- - - - -
  device->drop();
return 0;
}
-

That's it. Compile and play around with the program.

-

 

-

 

- - diff --git a/examples/03.CustomSceneNode/CustomSceneNode.cbp b/examples/03.CustomSceneNode/CustomSceneNode.cbp deleted file mode 100644 index 4295fbc3..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode.cbp +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - diff --git a/examples/03.CustomSceneNode/CustomSceneNode.vcproj b/examples/03.CustomSceneNode/CustomSceneNode.vcproj deleted file mode 100644 index 890d308b..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/project.pbxproj b/examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/project.pbxproj deleted file mode 100644 index 9ac9c7c1..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 03.CustomSceneNode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 03.CustomSceneNode.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 03.CustomSceneNode.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 03.CustomSceneNode */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "03.CustomSceneNode" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 03.CustomSceneNode; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 03.CustomSceneNode.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "CustomSceneNode" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 03.CustomSceneNode */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "CustomSceneNode" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "03.CustomSceneNode" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/xcshareddata/xcschemes/03.CustomSceneNode.xcscheme b/examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/xcshareddata/xcschemes/03.CustomSceneNode.xcscheme deleted file mode 100644 index e186f6d6..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode.xcodeproj/xcshareddata/xcschemes/03.CustomSceneNode.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/03.CustomSceneNode/CustomSceneNode_vc10.vcxproj b/examples/03.CustomSceneNode/CustomSceneNode_vc10.vcxproj deleted file mode 100644 index 77e9e6e1..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode_vc10.vcxproj +++ /dev/null @@ -1,247 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 03.CustomSceneNode - {171CCDFA-C140-4956-8EB7-F0168F4521D3} - CustomSceneNode - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/03.CustomSceneNode/CustomSceneNode_vc11.vcxproj b/examples/03.CustomSceneNode/CustomSceneNode_vc11.vcxproj deleted file mode 100644 index 77e9e6e1..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode_vc11.vcxproj +++ /dev/null @@ -1,247 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 03.CustomSceneNode - {171CCDFA-C140-4956-8EB7-F0168F4521D3} - CustomSceneNode - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/03.CustomSceneNode/CustomSceneNode_vc12.vcxproj b/examples/03.CustomSceneNode/CustomSceneNode_vc12.vcxproj deleted file mode 100644 index aa125e42..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode_vc12.vcxproj +++ /dev/null @@ -1,247 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 03.CustomSceneNode - {171CCDFA-C140-4956-8EB7-F0168F4521D3} - CustomSceneNode - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/03.CustomSceneNode/CustomSceneNode_vc14.vcxproj b/examples/03.CustomSceneNode/CustomSceneNode_vc14.vcxproj deleted file mode 100644 index 42e75d1f..00000000 --- a/examples/03.CustomSceneNode/CustomSceneNode_vc14.vcxproj +++ /dev/null @@ -1,247 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 03.CustomSceneNode - {171CCDFA-C140-4956-8EB7-F0168F4521D3} - CustomSceneNode - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CustomSceneNode.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - .\Release/CustomSceneNode.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - .\Release/CustomSceneNode.pch - .\Release/ - .\Release/ - .\Release/ - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\03.CustomSceneNode.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/CustomSceneNode.pdb - Console - false - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/03.CustomSceneNode/Makefile b/examples/03.CustomSceneNode/Makefile deleted file mode 100644 index 7daed21a..00000000 --- a/examples/03.CustomSceneNode/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 03.CustomSceneNode -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/03.CustomSceneNode/main.cpp b/examples/03.CustomSceneNode/main.cpp deleted file mode 100644 index 95529312..00000000 --- a/examples/03.CustomSceneNode/main.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/** Example 003 Custom SceneNode - -This tutorial is more advanced than the previous ones. -If you are currently just playing around with the Irrlicht -engine, you may want to look at other examples first. -This tutorials shows how to create a custom scene node and -how to use it in the engine. A custom scene node is needed -if you want to implement a render technique the Irrlicht -Engine currently does not support. For example, you can write -an indoor portal based renderer or an advanced terrain scene -node with it. By creating custom scene nodes, you can -easily extend the Irrlicht Engine and adapt it to your needs. - -I will keep the tutorial simple: Keep everything very short -and everything in one .cpp file. This is the style which -will also be used in most of the following tutorials. - -To start, I include the header files, use the irr namespace, -and tell the linker to link with the .lib file. -*/ -#include -#include "driverChoice.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* -Here comes the more sophisticated part of this tutorial: -The class of our very own custom scene node. To keep it simple, -our scene node will not be an indoor portal renderer nor a terrain -scene node, but a simple tetrahedron, a 3D object consisting of 4 -connected vertices, which only draws itself and does nothing more. -Note that this scenario does not require a custom scene node in Irrlicht. -Instead one would create a mesh from the geometry and pass it to a -irr::scene::IMeshSceneNode. This example just illustrates creation of a custom -scene node in a simple setting. - -To allow our scene node to be inserted into the Irrlicht -Engine scene, the class we create needs to be derived from the -irr::scene::ISceneNode class and has to override some methods. -*/ - -class CSampleSceneNode : public scene::ISceneNode -{ - - /* - First, we declare some member variables: - The bounding box, 4 vertices, and the material of the tetrahedron. - */ - core::aabbox3d Box; - video::S3DVertex Vertices[4]; - video::SMaterial Material; - -public: - - /* - The parameters of the constructor specify the parent of the scene node, - a pointer to the scene manager, and an id of the scene node. - In the constructor we call the parent class' constructor, - set some properties of the material, and create the 4 vertices of - the tetrahedron. - */ - - CSampleSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id) - : scene::ISceneNode(parent, mgr, id) - { - Material.Wireframe = false; - Material.Lighting = false; - Material.Thickness=0.f; - - Vertices[0] = video::S3DVertex(0,0,10, 5,1,0, - video::SColor(255,0,255,255), 0, 1); - Vertices[1] = video::S3DVertex(10,0,-10, 10,0,0, - video::SColor(255,255,0,255), 1, 1); - Vertices[2] = video::S3DVertex(0,20,0, 20,1,1, - video::SColor(255,255,255,0), 1, 0); - Vertices[3] = video::S3DVertex(-10,0,-10, 40,0,1, - video::SColor(255,0,255,0), 0, 0); - - /* - The Irrlicht Engine needs to know the bounding box of a scene node. - It will use it for automatic culling and other things. Hence, we - need to create a bounding box from the 4 vertices we use. - If you do not want the engine to use the box for automatic culling, - and/or don't want to create the box, you could also call - irr::scene::ISceneNode::setAutomaticCulling() with irr::scene::EAC_OFF. - */ - Box.reset(Vertices[0].Pos); - for (s32 i=1; i<4; ++i) - Box.addInternalPoint(Vertices[i].Pos); - } - - /* - Before it is drawn, the irr::scene::ISceneNode::OnRegisterSceneNode() - method of every scene node in the scene is called by the scene manager. - If the scene node wishes to draw itself, it may register itself in the - scene manager to be drawn. This is necessary to tell the scene manager - when it should call irr::scene::ISceneNode::render(). For - example, normal scene nodes render their content one after another, - while stencil buffer shadows would like to be drawn after all other - scene nodes. And camera or light scene nodes need to be rendered before - all other scene nodes (if at all). So here we simply register the - scene node to render normally. If we would like to let it be rendered - like cameras or light, we would have to call - SceneManager->registerNodeForRendering(this, SNRT_LIGHT_AND_CAMERA); - After this, we call the actual irr::scene::ISceneNode::OnRegisterSceneNode() - method of the base class, which lets all the child scene nodes of this node - register themselves. - */ - virtual void OnRegisterSceneNode() - { - if (IsVisible) - SceneManager->registerNodeForRendering(this); - - ISceneNode::OnRegisterSceneNode(); - } - - /* - In the render() method most of the interesting stuff happens: The - Scene node renders itself. We override this method and draw the - tetrahedron. - */ - virtual void render() - { - /* Indices into the 'Vertices' array. A triangle needs 3 vertices - so you have to pass the 3 corresponding indices for each triangle to - tell which of the vertices should be used for it. */ - u16 indices[] = { 0,2,3, 2,1,3, 1,0,3, 2,0,1 }; - video::IVideoDriver* driver = SceneManager->getVideoDriver(); - - driver->setMaterial(Material); - driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); - driver->drawVertexPrimitiveList(&Vertices[0], 4, &indices[0], 4, video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT); - } - - /* - And finally we create three small additional methods. - irr::scene::ISceneNode::getBoundingBox() returns the bounding box of - this scene node, irr::scene::ISceneNode::getMaterialCount() returns the - amount of materials in this scene node (our tetrahedron only has one - material), and irr::scene::ISceneNode::getMaterial() returns the - material at an index. Because we have only one material, we can - return that and assume that no one ever calls getMaterial() with an index - greater than 0. - */ - virtual const core::aabbox3d& getBoundingBox() const - { - return Box; - } - - virtual u32 getMaterialCount() const - { - return 1; - } - - virtual video::SMaterial& getMaterial(u32 i) - { - return Material; - } -}; - -/* -That's it. The Scene node is done. Now we start the engine, -create the scene node and a camera, and look at the result. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device - IrrlichtDevice *device = createDevice(driverType, - core::dimension2d(640, 480), 16, false); - - if (device == 0) - return 1; // could not create selected driver. - - // set window caption, get some pointers, create a camera - - device->setWindowCaption(L"Custom Scene Node - Irrlicht Engine Demo"); - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - smgr->addCameraSceneNode(0, core::vector3df(0,-40,0), core::vector3df(0,0,0)); - - /* - Create our scene node. I don't check the result of calling new, as it - should throw an exception rather than returning 0 on failure. Because - the new node will create itself with a reference count of 1, and then - will have another reference added by its parent scene node when it is - added to the scene, I need to drop my reference to it. Best practice is - to drop it only *after* I have finished using it, regardless of what - the reference count of the object is after creation. - */ - CSampleSceneNode *myNode = - new CSampleSceneNode(smgr->getRootSceneNode(), smgr, 666); - - /* - To animate something in this boring scene consisting only of one - tetrahedron, and to show that you now can use your scene node like any - other scene node in the engine, we add an animator to the scene node, - which rotates the node a little bit. - irr::scene::ISceneManager::createRotationAnimator() could return 0, so - should be checked. - */ - scene::ISceneNodeAnimator* anim = - smgr->createRotationAnimator(core::vector3df(0.8f, 0, 0.8f)); - - if(anim) - { - myNode->addAnimator(anim); - - /* - I'm done referring to anim, so must - irr::IReferenceCounted::drop() this reference now because it - was produced by a createFoo() function. As I shouldn't refer to - it again, ensure that I can't by setting to 0. - */ - anim->drop(); - anim = 0; - } - - /* - I'm done with my CSampleSceneNode object, and so must drop my reference. - This won't delete the object, yet, because it is still attached to the - scene graph, which prevents the deletion until the graph is deleted or the - custom scene node is removed from it. - */ - myNode->drop(); - myNode = 0; // As I shouldn't refer to it again, ensure that I can't - - /* - Now draw everything and finish. - */ - u32 frames=0; - while(device->run()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0,100,100,100)); - - smgr->drawAll(); - - driver->endScene(); - if (++frames==100) // don't update more often, setWindowCaption can be expensive - { - core::stringw str = L"Irrlicht Engine ["; - str += driver->getName(); - str += L"] FPS: "; - str += (s32)driver->getFPS(); - - device->setWindowCaption(str.c_str()); - frames=0; - } - } - - device->drop(); - - return 0; -} - -/* -That's it. Compile and play around with the program. -**/ diff --git a/examples/03.CustomSceneNode/tutorial.html b/examples/03.CustomSceneNode/tutorial.html deleted file mode 100644 index becc3d77..00000000 --- a/examples/03.CustomSceneNode/tutorial.html +++ /dev/null @@ -1,222 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
-
Tutorial 3.CustomSceneNode
-
-
-
-

This Tutorial is a tutorial for more advanced developers. If you are - currently just playing around with the Irrlicht engine, please look - at other examples first. This tutorial shows how to create a custom - scene node and how to use it in the engine. A custom scene node is needed, - if you want to implement a render technique, the Irrlicht Engine is - currently not supporting. For example you can write a indoor portal - based renderer or a advanced terrain scene node with it. With creating - custom scene nodes, you can easily extend the Irrlicht Engine and adapt - it to your needs.

-

I will keep the tutorial simple: Keep everything very short, everything - in one .cpp file, and I'll use the engine here as in all other tutorials. - At the end of the tutorial, the result will look like the image below. - This looks not very exciting, but it is a complete customized scene - node and a good point to start from creating you own scene nodes.

-


-

-
-
-
- - - - - - - -
- Lets start!
-

To start, I include the header files, use the irr namespace, and tell - the linker to link with the .lib file.

- - - - -
#include <irrlicht.h>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
-

Here comes the most sophisticated part of this tutorial: The class - of our very own custom scene node. To keep it simple,
- our scene node will not be an indoor portal renderer nor a terrain scene - node, but a simple tetraeder, a 3d object consiting of 4 connected vertices, - which only draws itself and does nothing more.

-

To let our scene node be able to be inserted into the Irrlicht Engine - scene, the class we create needs only be derived from the ISceneNode - class and has to override some methods.

- - - - -
class CSampleSceneNode : public scene::ISceneNode
{
-

First, we declare some member variables, to hold data for our tetraeder: - The bounding box, 4 vertices, and
- the material of the tetraeder.

- - - - -
core::aabbox3d<f32> Box;
video::S3DVertex Vertices[4];
video::SMaterial Material;
-

The parameters of the constructor specify the parent of the scene node, - a pointer to the scene manager, and an id of the scene node. In the - constructor itself, we call the parent classes constructor, set some - properties of the material we use to draw the scene node and create - the 4 vertices of the tetraeder we will draw later.

- - - - -
public:
CSampleSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id)
- : scene::ISceneNode(parent, mgr, id)
-{ 
-  Material.Wireframe = false;
-  Material.Lighting = false;
-
  Vertices[0] = video::S3DVertex(0,0,10, 1,1,0,video::SColor(255,0,255,255),0,1);
-  Vertices[1] = video::S3DVertex(10,0,-10, 1,0,0,video::SColor(255,255,0,255),1,1); 
-  Vertices[2] = video::S3DVertex(0,20,0, 0,1,1,video::SColor(255,255,255,0),1,0);
-  Vertices[3] = video::S3DVertex(-10,0,-10, 0,0,1,video::SColor(255,0,255,0),0,0);
-
-
- The Irrlicht Engine needs to know the bounding box of your scene node. - It will use it for doing automatic culling and other things. Hence we - need to create a bounding box from the 4 vertices we use. If you do not - want the engine to use the box for automatic culling, and/or don't want - to create the box, you could also write
- AutomaticCullingEnabled = false;.
-
- - - - -
  Box.reset(Vertices[0].Pos);
for (s32 i=1; i<4; ++i)
Box.addInternalPoint(Vertices[i].Pos); -}
-
-

Before it is drawn, the OnPreRender() method of every scene node in - the scene is called by the scene manager. If the scene node wishes to - draw itself, it may register itself in the scene manager to be drawn. - This is necessary to tell the scene manager when it should call the - ::render method. For example normal scene nodes render their content - one after another, while stencil buffer shadows would like to be drawn - after all other scene nodes. And camera or light scene nodes need to - be rendered before all other scene nodes (if at all).
- So here we simply register the scene node to get rendered normally. - If we would like to let it be rendered like cameras or light, we would - have to call SceneManager->registerNodeForRendering(this, SNRT_LIGHT_AND_CAMERA); -
- After this, we call the OnPreRender-method of the base class ISceneNode, - which simply lets also all the child scene nodes of this node register - themselves.

-
- - - - -
virtual void OnPreRender()
{
if (IsVisible)
SceneManager->registerNodeForRendering(this); - - ISceneNode::OnPreRender(); -}
-

In the render() method most of the interresting stuff happenes: The Scene - node renders itself. We override this method and draw the tetraeder.

- - - - -
virtual void render()
{
u16 indices[] = { 0,2,3, 2,1,3, 1,0,3, 2,0,1 }; - video::IVideoDriver* driver = SceneManager->getVideoDriver();
-
  driver->setMaterial(Material);
-  driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
-  driver->drawIndexedTriangleList(&Vertices[0], 4, &indices[0], 4);
-}
-

At least, we create three small additional methods. GetBoundingBox() - returns the bounding box of this scene node,
- GetMaterialCount() returns the amount of materials in this scene node - (our tetraeder only has one material), and getMaterial() returns the material - at an index. Because we have only one material here, we can return the - only one material, assuming that no one ever calls getMaterial() with - an index greater than 0.

- - - - -
  virtual const core::aabbox3d<f32>& getBoundingBox() const
{
return Box;
}
  virtual u32 getMaterialCount()
-  {
-    return 1;
-  }
  virtual video::SMaterial& getMaterial(u32 i)
-  {
-    return Material;
-  } 
-};
-

That's it. The Scene node is done. Now we simply have to start the engine, - create the scene node and a camera, and look at the result.

- - - - -
int main()
{ - IrrlichtDevice *device = - createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 16, false);
  device->setWindowCaption(L"Custom Scene Node - Irrlicht Engine Demo");
  video::IVideoDriver* driver = device->getVideoDriver();
-           scene::ISceneManager* smgr = device->getSceneManager();
-
  smgr->addCameraSceneNode(0, core::vector3df(0,-40,0), core::vector3df(0,0,0));
-                   
-

Create our scene node. Note that it is dropped (->drop()) instantly - after we create it. This is possible because the scene manager now takes - care of it. This is not nessecary, it would also be possible to drop it - at the end of the program.

- - - - -
CSampleSceneNode *myNode = 
new CSampleSceneNode(smgr->getRootSceneNode(), smgr, 666); - -myNode->drop();
-

To animate something in this boring scene consisting only of one tetraeder, - and to show, that you now can use your scene node like any other scene - node in the engine, we add an animator to the scene node, which rotates - the node a little bit.

- - - - -
scene::ISceneNodeAnimator* anim = 
smgr->createRotationAnimator(core::vector3df(0.8f, 0, 0.8f)); - -myNode->addAnimator(anim); -anim->drop();
-

Now draw everything and finish.

- - - - -
  while(device->run())
{
driver->beginScene(true, true, video::SColor(0,100,100,100)); - - smgr->drawAll(); - - driver->endScene(); - } - -device->drop(); -return 0; -}
-

That's it. Compile and play around with the program.

-

 

- - diff --git a/examples/04.Movement/Makefile b/examples/04.Movement/Makefile deleted file mode 100644 index c5d50c9d..00000000 --- a/examples/04.Movement/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 04.Movement -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/04.Movement/Movement.cbp b/examples/04.Movement/Movement.cbp deleted file mode 100644 index 76e2f439..00000000 --- a/examples/04.Movement/Movement.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/04.Movement/Movement.vcproj b/examples/04.Movement/Movement.vcproj deleted file mode 100644 index 105c6258..00000000 --- a/examples/04.Movement/Movement.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/04.Movement/Movement.xcodeproj/project.pbxproj b/examples/04.Movement/Movement.xcodeproj/project.pbxproj deleted file mode 100644 index 06d14890..00000000 --- a/examples/04.Movement/Movement.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 04.Movement.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 04.Movement.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 04.Movement.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 04.Movement */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "04.Movement" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 04.Movement; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 04.Movement.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Movement" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 04.Movement */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Movement" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "04.Movement" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/04.Movement/Movement.xcodeproj/xcshareddata/xcschemes/04.Movement.xcscheme b/examples/04.Movement/Movement.xcodeproj/xcshareddata/xcschemes/04.Movement.xcscheme deleted file mode 100644 index aec7f206..00000000 --- a/examples/04.Movement/Movement.xcodeproj/xcshareddata/xcschemes/04.Movement.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/04.Movement/Movement_vc10.vcxproj b/examples/04.Movement/Movement_vc10.vcxproj deleted file mode 100644 index 131479da..00000000 --- a/examples/04.Movement/Movement_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 04.Movement - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF} - Movement - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/04.Movement/Movement_vc11.vcxproj b/examples/04.Movement/Movement_vc11.vcxproj deleted file mode 100644 index 131479da..00000000 --- a/examples/04.Movement/Movement_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 04.Movement - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF} - Movement - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/04.Movement/Movement_vc12.vcxproj b/examples/04.Movement/Movement_vc12.vcxproj deleted file mode 100644 index bbebe747..00000000 --- a/examples/04.Movement/Movement_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 04.Movement - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF} - Movement - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/04.Movement/Movement_vc14.vcxproj b/examples/04.Movement/Movement_vc14.vcxproj deleted file mode 100644 index f56853e9..00000000 --- a/examples/04.Movement/Movement_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 04.Movement - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF} - Movement - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Movement.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\04.Movement.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Movement.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\04.Movement.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/04.Movement/main.cpp b/examples/04.Movement/main.cpp deleted file mode 100644 index dcbcc30e..00000000 --- a/examples/04.Movement/main.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/** Example 004 Movement - -This tutorial shows how to move and animate SceneNodes. The -basic concept of SceneNodeAnimators is shown as well as manual -movement of nodes using the keyboard. We'll demonstrate framerate -independent movement, which means moving by an amount dependent -on the duration of the last run of the Irrlicht loop. - -Example 19.MouseAndJoystick shows how to handle other input than keyboard. - -As always, include the header files, use the irr namespace, -and tell the linker to link with the .lib file. -*/ -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -/* -To receive events like mouse and keyboard input, or GUI events like -"button has been clicked", we need an object which is derived from the -irr::IEventReceiver object. There is only one method to override: -irr::IEventReceiver::OnEvent(). This method will be called by the engine once -when an event happens. What we really want to know is whether a key is being -held down, and so we will remember the current state of each key. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - // This is the one method that we have to implement - virtual bool OnEvent(const SEvent& event) - { - // Remember whether each key is down or up - if (event.EventType == irr::EET_KEY_INPUT_EVENT) - KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown; - - /* - Always return false by default. If you return true you tell the engine - that you handled this event completely and the Irrlicht should not - process it any further. So for example if you return true for all - EET_KEY_INPUT_EVENT events then Irrlicht would not pass on key-events - to it's GUI system. - */ - return false; - } - - // This is used to check whether a key is being held down - virtual bool IsKeyDown(EKEY_CODE keyCode) const - { - return KeyIsDown[keyCode]; - } - - MyEventReceiver() - { - for (u32 i=0; i(640, 480), 16, false, false, false, &receiver); - - if (device == 0) - return 1; // could not create selected driver. - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - Create the node which will be moved with the WSAD keys. We create a - sphere node, which is a built-in geometry primitive. We place the node - at (0,0,30) and assign a texture to it to let it look a little bit more - interesting. Because we have no dynamic lights in this scene we disable - lighting for each model (otherwise the models would be black). - */ - scene::ISceneNode * sphereNode = smgr->addSphereSceneNode(); - if (sphereNode) - { - sphereNode->setPosition(core::vector3df(0,0,30)); - sphereNode->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.bmp")); - sphereNode->setMaterialFlag(video::EMF_LIGHTING, false); - } - - /* - Now we create another node, movable using a scene node animator. Scene - node animators modify scene nodes and can be attached to any scene node - like mesh scene nodes, billboards, lights and even camera scene nodes. - Scene node animators are not only able to modify the position of a - scene node, they can also animate the textures of an object for - example. We create a cube scene node and attach a 'fly circle' scene - node animator to it, letting this node fly around our sphere scene node. - */ - scene::ISceneNode* cubeNode = smgr->addCubeSceneNode(); - if (cubeNode) - { - cubeNode->setMaterialTexture(0, driver->getTexture(mediaPath + "t351sml.jpg")); - cubeNode->setMaterialFlag(video::EMF_LIGHTING, false); - scene::ISceneNodeAnimator* anim = - smgr->createFlyCircleAnimator(core::vector3df(0,0,30), 20.0f); - if (anim) - { - cubeNode->addAnimator(anim); - anim->drop(); - } - } - - /* - The last scene node we add is a b3d model of a walking ninja. Is shows the - use of a 'fly straight' animator to move the node between two points. - */ - scene::IAnimatedMeshSceneNode* ninjaNode = - smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "ninja.b3d")); - - if (ninjaNode) - { - scene::ISceneNodeAnimator* anim = - smgr->createFlyStraightAnimator(core::vector3df(100,0,60), - core::vector3df(-100,0,60), 3500, true); - if (anim) - { - ninjaNode->addAnimator(anim); - anim->drop(); - } - - /* - To make the model look right we disable lighting, set the - frames between which the animation should loop, rotate the - model around 180 degrees, and adjust the animation speed and - the texture. To set the correct animation (frames and speed), we - would also be able to just call - "ninjaNode->setMD2Animation(scene::EMAT_RUN)" for the 'run' - animation instead of "setFrameLoop" and "setAnimationSpeed", - But that only works with MD2 animations, while this can be used to - start other animations. For MD2 it's usually good advice not to use - hardcoded frame-numbers... - */ - ninjaNode->setMaterialFlag(video::EMF_LIGHTING, false); - - ninjaNode->setFrameLoop(0, 13); - ninjaNode->setAnimationSpeed(15); -// ninjaNode->setMD2Animation(scene::EMAT_RUN); - - ninjaNode->setScale(core::vector3df(2.f,2.f,2.f)); - ninjaNode->setRotation(core::vector3df(0,-90,0)); -// ninjaNode->setMaterialTexture(0, driver->getTexture(mediaPath + "sydney.bmp")); - - } - - - /* - To be able to look at and move around in this scene, we create a first - person shooter style camera and make the mouse cursor invisible. - */ - smgr->addCameraSceneNodeFPS(); - device->getCursorControl()->setVisible(false); - - /* - Add a colorful irrlicht logo - */ - device->getGUIEnvironment()->addImage( - driver->getTexture(mediaPath + "irrlichtlogoalpha2.tga"), - core::position2d(10,20)); - - /* - Lets draw the scene and also write the current frames per second and the - name of the driver to the caption of the window. - */ - int lastFPS = -1; - - // In order to do framerate independent movement, we have to know - // how long it was since the last frame - u32 then = device->getTimer()->getTime(); - - // This is the movement speed in units per second. - const f32 MOVEMENT_SPEED = 5.f; - - while(device->run()) - { - // Work out a frame delta time. - const u32 now = device->getTimer()->getTime(); - const f32 frameDeltaTime = (f32)(now - then) / 1000.f; // Time in seconds - then = now; - - /* Check if keys W, S, A or D are being held down, and move the - sphere node around respectively. */ - core::vector3df nodePosition = sphereNode->getPosition(); - - if(receiver.IsKeyDown(irr::KEY_KEY_W)) - nodePosition.Y += MOVEMENT_SPEED * frameDeltaTime; - else if(receiver.IsKeyDown(irr::KEY_KEY_S)) - nodePosition.Y -= MOVEMENT_SPEED * frameDeltaTime; - - if(receiver.IsKeyDown(irr::KEY_KEY_A)) - nodePosition.X -= MOVEMENT_SPEED * frameDeltaTime; - else if(receiver.IsKeyDown(irr::KEY_KEY_D)) - nodePosition.X += MOVEMENT_SPEED * frameDeltaTime; - - sphereNode->setPosition(nodePosition); - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,113,113,133)); - - smgr->drawAll(); // draw the 3d scene - device->getGUIEnvironment()->drawAll(); // draw the gui environment (the logo) - - driver->endScene(); - - int fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw tmp(L"Movement Example - Irrlicht Engine ["); - tmp += driver->getName(); - tmp += L"] fps: "; - tmp += fps; - - device->setWindowCaption(tmp.c_str()); - lastFPS = fps; - } - } - - /* - In the end, delete the Irrlicht device. - */ - device->drop(); - - return 0; -} - -/* -That's it. Compile and play around with the program. -**/ diff --git a/examples/04.Movement/tutorial.html b/examples/04.Movement/tutorial.html deleted file mode 100644 index 28b207dc..00000000 --- a/examples/04.Movement/tutorial.html +++ /dev/null @@ -1,188 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
-
Tutorial 4.Movement
-
-
-
-

This Tutorial shows how to move and animate SceneNodes. The basic concept - of SceneNodeAnimators is shown as well as manual movement of nodes using - the keyboard.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
- Lets start!
-

As always, I include the header files, use the irr namespace, and tell - the linker to link with the .lib file.

- - - - -
#include <stdio.h>
#include <wchar.h>
#include <irrlicht.h>
-
using namespace irr;
-
#pragma comment(lib, "Irrlicht.lib")
-

In this tutorial, one of our goals is to move a scene node using some - keys on the keyboard. We store a pointer to the scene node we want to - move with the keys here.
- The other pointer is a pointer to the Irrlicht Device, which we need - int the EventReceiver to manipulate the scene node and to get the active - camera.

- - - - -
scene::ISceneNode* node = 0;
IrrlichtDevice* device = 0;
-

To get events like mouse and keyboard input, or GUI events like "the - OK button has been clicked", we need an object wich is derived - from the IEventReceiver object. There is only one method to override: - OnEvent. This method will be called by the engine when an event happened. - We will use this input to move the scene node with the keys W and S.

- - - - -
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(const SEvent& event)
{
-

If the key 'W' or 'S' was left up, we get the position of the scene - node, and modify the Y coordinate a little bit. So if you press 'W', - the node moves up, and if you press 'S' it moves down.

- - - - -
if (node != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT&&
!event.KeyInput.PressedDown)
{
switch(event.KeyInput.Key)
{
case KEY_KEY_W:
case KEY_KEY_S:
{
core::vector3df v = node->getPosition();
v.Y += event.KeyInput.Key == KEY_KEY_W ? 2.0f : -2.0f;
node->setPosition(v);
}
return true;
}
} return false;
}
};
- -
-

The event receiver for moving a scene node is ready. So lets just create - an Irrlicht Device and the scene node we want to move. We also create - some other additional scene nodes, to show that there are also some different - possibilities to move and animate scene nodes.

- - - - -
int main()
{
MyEventReceiver receiver; - - device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), - 16, false, false, false, &receiver);
-
   video::IVideoDriver* driver = device->getVideoDriver();
-   scene::ISceneManager* smgr = device->getSceneManager();
-
-

Create the node for moving it with the 'W' and 'S' key. We create a - sphere node, which is a built in geometric primitive scene node. - We place the node at (0,0,30) and assign a texture to it to let it look - a little bit more interesting.

- - - - -
node = smgr->addSphereSceneNode();
-node->setPosition(core::vector3df(0,0,30));
-node->setMaterialFlag(video::EMF_LIGHTING, false);
-node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
-

Now we create another node, moving using a scene node animator. Scene - node animators modify scene nodes and can be attached to any scene node - like
- mesh scene nodes, billboards, lights and even camera scene nodes. Scene - node animators are not only able to modify the position of a scene node, - they can
- also animate the textures of an object for example. We create a test scene - node again an attach a 'fly circle' scene node to it, letting this node - fly around our first test scene node.

- - - - -
scene::ISceneNode* n = smgr->addCubeSceneNode();
-n->setMaterialTexture(0, driver->getTexture("../../media/t351sml.jpg"));
-n->setMaterialFlag(video::EMF_LIGHTING, false);
-scene::ISceneNodeAnimator* anim = 
-	smgr->createFlyCircleAnimator(core::vector3df(0,0,30), 20.0f);
-n->addAnimator(anim);
-anim->drop();
-

The last scene node we add to show possibilities of scene node animators - is a md2 model, which uses a 'fly straight' animator to run between to - points.

- - - - -
scene::IAnimatedMeshSceneNode* anms = smgr->addAnimatedMeshSceneNode(
smgr->getMesh("../../media/sydney.md2")); - -if (n)
{
anim = smgr->createFlyStraightAnimator(core::vector3df(100,0,60),
core::vector3df(-100,0,60), 10000, true);
anms->addAnimator(anim);
anim->drop();
-
-

To make to model look right we set the frames between which - the animation should loop, rotate the model around 180 degrees, and adjust - the animation speed and the texture.
- To set the right animation (frames and speed), we would also be able to - just call "anms->setMD2Animation(scene::EMAT_RUN)" for the - 'run' animation instead of "setFrameLoop" and "setAnimationSpeed", - but this only works with MD2 animations, and so you know how to start - other animations.

- - - - -
   anms->setMaterialFlag(video::EMF_LIGHTING, false);
anms->setFrameLoop(320, 360); - anms->setAnimationSpeed(30);
anms->setRotation(core::vector3df(0,180.0f,0));
anms->setMaterialTexture(0, driver->getTexture("../../media/sydney.bmp"));
}
-

To be able to look at and move around in this scene, we create a first - person shooter style camera and make the mouse cursor invisible.

- - - - -
smgr->addCameraSceneNodeFPS(0, 100.0f, 100.0f);
device->getCursorControl()->setVisible(false);
-

We have done everything, so lets draw it. We also write the current frames - per second and the name of the driver to the caption of the window.

- - - - -
int lastFPS = -1;
-
while(device->run())
-{
-     driver->beginScene(true, true, video::SColor(255,90,90,156));
-     smgr->drawAll();
-     driver->endScene();
-
     int fps = driver->getFPS();
-
     if (lastFPS != fps)
-     {
-        wchar_t tmp[1024];
-        swprintf(tmp, 1024, L"Movement Example - Irrlicht Engine (%ls)(fps:%d)",
driver->getName(), fps);
-
       device->setWindowCaption(tmp);
-       lastFPS = fps;
-     }
-}
-
-device->drop();
return 0;
}
-

That's it. Compile and play around with the program.

-

 

-

 

- - diff --git a/examples/05.UserInterface/Makefile b/examples/05.UserInterface/Makefile deleted file mode 100644 index fb919746..00000000 --- a/examples/05.UserInterface/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 05.UserInterface -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/05.UserInterface/UserInterface.cbp b/examples/05.UserInterface/UserInterface.cbp deleted file mode 100644 index 99887189..00000000 --- a/examples/05.UserInterface/UserInterface.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/05.UserInterface/UserInterface.vcproj b/examples/05.UserInterface/UserInterface.vcproj deleted file mode 100644 index 44281698..00000000 --- a/examples/05.UserInterface/UserInterface.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/05.UserInterface/UserInterface.xcodeproj/project.pbxproj b/examples/05.UserInterface/UserInterface.xcodeproj/project.pbxproj deleted file mode 100644 index 1e03a8ee..00000000 --- a/examples/05.UserInterface/UserInterface.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 05.UserInterface.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 05.UserInterface.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 05.UserInterface.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 05.UserInterface */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "05.UserInterface" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 05.UserInterface; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 05.UserInterface.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "UserInterface" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 05.UserInterface */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "UserInterface" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "05.UserInterface" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/05.UserInterface/UserInterface.xcodeproj/xcshareddata/xcschemes/05.UserInterface.xcscheme b/examples/05.UserInterface/UserInterface.xcodeproj/xcshareddata/xcschemes/05.UserInterface.xcscheme deleted file mode 100644 index 3edc9eb3..00000000 --- a/examples/05.UserInterface/UserInterface.xcodeproj/xcshareddata/xcschemes/05.UserInterface.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/05.UserInterface/UserInterface_vc10.vcxproj b/examples/05.UserInterface/UserInterface_vc10.vcxproj deleted file mode 100644 index d4be57f1..00000000 --- a/examples/05.UserInterface/UserInterface_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 05.UserInterface - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53} - UserInterface - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/05.UserInterface/UserInterface_vc11.vcxproj b/examples/05.UserInterface/UserInterface_vc11.vcxproj deleted file mode 100644 index d4be57f1..00000000 --- a/examples/05.UserInterface/UserInterface_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 05.UserInterface - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53} - UserInterface - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/05.UserInterface/UserInterface_vc12.vcxproj b/examples/05.UserInterface/UserInterface_vc12.vcxproj deleted file mode 100644 index 3945262f..00000000 --- a/examples/05.UserInterface/UserInterface_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 05.UserInterface - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53} - UserInterface - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/05.UserInterface/UserInterface_vc14.vcxproj b/examples/05.UserInterface/UserInterface_vc14.vcxproj deleted file mode 100644 index 0b66809b..00000000 --- a/examples/05.UserInterface/UserInterface_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 05.UserInterface - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53} - UserInterface - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/UserInterface.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\05.UserInterface.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/UserInterface.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\05.UserInterface.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/05.UserInterface/main.cpp b/examples/05.UserInterface/main.cpp deleted file mode 100644 index deaba6f1..00000000 --- a/examples/05.UserInterface/main.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/** Example 005 User Interface - -This tutorial shows how to use the built in User Interface of -the Irrlicht Engine. It will give a brief overview and show -how to create and use windows, buttons, scroll bars, static -texts, and list boxes. - -As always, we include the header files, and use the irrlicht -namespaces. We also store a pointer to the Irrlicht device, -a counter variable for changing the creation position of a window, -and a pointer to a listbox. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -// Declare a structure to hold some context for the event receiver so that it -// has it available inside its OnEvent() method. -struct SAppContext -{ - IrrlichtDevice *device; - s32 counter; - IGUIListBox* listbox; -}; - -// Define some values that we'll use to identify individual GUI controls. -enum -{ - GUI_ID_QUIT_BUTTON = 101, - GUI_ID_NEW_WINDOW_BUTTON, - GUI_ID_FILE_OPEN_BUTTON, - GUI_ID_TRANSPARENCY_SCROLL_BAR -}; - -/* - Set the skin transparency by changing the alpha values of all skin-colors -*/ -void setSkinTransparency(s32 alpha, irr::gui::IGUISkin * skin) -{ - for (s32 i=0; igetColor((EGUI_DEFAULT_COLOR)i); - col.setAlpha(alpha); - skin->setColor((EGUI_DEFAULT_COLOR)i, col); - } -} - -/* -The Event Receiver is not only capable of getting keyboard and -mouse input events, but also events of the graphical user interface -(gui). There are events for almost everything: button click, -listbox selection change, events that say that a element was hovered -and so on. To be able to react to some of these events, we create -an event receiver. -We only react to gui events, and if it's such an event, we get the -id of the caller (the gui element which caused the event) and get -the pointer to the gui environment. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - MyEventReceiver(SAppContext & context) : Context(context) { } - - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_GUI_EVENT) - { - s32 id = event.GUIEvent.Caller->getID(); - IGUIEnvironment* env = Context.device->getGUIEnvironment(); - - switch(event.GUIEvent.EventType) - { - - /* - If a scrollbar changed its scroll position, and it is - 'our' scrollbar (the one with id GUI_ID_TRANSPARENCY_SCROLL_BAR), - then we change the transparency of all gui elements. This is an - easy task: There is a skin object, in which all color - settings are stored. We simply go through all colors - stored in the skin and change their alpha value. - */ - case EGET_SCROLL_BAR_CHANGED: - if (id == GUI_ID_TRANSPARENCY_SCROLL_BAR) - { - s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); - setSkinTransparency(pos, env->getSkin()); - } - break; - - /* - If a button was clicked, it could be one of 'our' - three buttons. If it is the first, we shut down the engine. - If it is the second, we create a little window with some - text on it. We also add a string to the list box to log - what happened. And if it is the third button, we create - a file open dialog, and add also this as string to the list box. - That's all for the event receiver. - */ - case EGET_BUTTON_CLICKED: - switch(id) - { - case GUI_ID_QUIT_BUTTON: - Context.device->closeDevice(); - return true; - - case GUI_ID_NEW_WINDOW_BUTTON: - { - Context.listbox->addItem(L"Window created"); - Context.counter += 30; - if (Context.counter > 200) - Context.counter = 0; - - IGUIWindow* window = env->addWindow( - rect(100 + Context.counter, 100 + Context.counter, 300 + Context.counter, 200 + Context.counter), - false, // modal? - L"Test window"); - - env->addStaticText(L"Please close me", - rect(35,35,140,50), - true, // border? - false, // wordwrap? - window); - } - return true; - - case GUI_ID_FILE_OPEN_BUTTON: - Context.listbox->addItem(L"File open"); - // There are some options for the file open dialog - // We set the title, make it a modal window, and make sure - // that the working directory is restored after the dialog - // is finished. - env->addFileOpenDialog(L"Please choose a file.", true, 0, -1, true); - return true; - - default: - return false; - } - break; - - case EGET_FILE_SELECTED: - { - // show the model filename, selected in the file dialog - IGUIFileOpenDialog* dialog = - (IGUIFileOpenDialog*)event.GUIEvent.Caller; - Context.listbox->addItem(dialog->getFileName()); - } - break; - - default: - break; - } - } - - return false; - } - -private: - SAppContext & Context; -}; - - -/* -OK, now for the more interesting part. First, create the Irrlicht device. As in -some examples before, we ask the user which driver he wants to use for this -example. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device and exit if creation failed - IrrlichtDevice * device = createDevice(driverType, core::dimension2d(640, 480)); - - if (device == 0) - return 1; // could not create selected driver. - - /* The creation was successful, now we set the event receiver and - store pointers to the driver and to the gui environment. */ - - device->setWindowCaption(L"Irrlicht Engine - User Interface Demo"); - device->setResizable(true); - - video::IVideoDriver* driver = device->getVideoDriver(); - IGUIEnvironment* env = device->getGUIEnvironment(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - To make the font a little bit nicer, we load an external font - and set it as the new default font in the skin. - To keep the standard font for tool tip text, we set it to - the built-in font. - */ - - IGUISkin* skin = env->getSkin(); - IGUIFont* font = env->getFont(mediaPath + "fonthaettenschweiler.bmp"); - if (font) - skin->setFont(font); - - skin->setFont(env->getBuiltInFont(), EGDF_TOOLTIP); - - /* - We add three buttons. The first one closes the engine. The second - creates a window and the third opens a file open dialog. The third - parameter is the id of the button, with which we can easily identify - the button in the event receiver. - */ - - env->addButton(rect(10,240,110,240 + 32), 0, GUI_ID_QUIT_BUTTON, - L"Quit", L"Exits Program"); - env->addButton(rect(10,280,110,280 + 32), 0, GUI_ID_NEW_WINDOW_BUTTON, - L"New Window", L"Launches a new Window"); - env->addButton(rect(10,320,110,320 + 32), 0, GUI_ID_FILE_OPEN_BUTTON, - L"File Open", L"Opens a file"); - - /* - Now, we add a static text and a scrollbar, which modifies the - transparency of all gui elements. We set the maximum value of - the scrollbar to 255, because that's the maximal value for - a color value. - Then we create an other static text and a list box. - */ - - env->addStaticText(L"Transparent Control:", rect(150,20,350,40), true); - IGUIScrollBar* scrollbar = env->addScrollBar(true, - rect(150, 45, 350, 60), 0, GUI_ID_TRANSPARENCY_SCROLL_BAR); - scrollbar->setMax(255); - scrollbar->setPos(255); - setSkinTransparency( scrollbar->getPos(), env->getSkin()); - - // set scrollbar position to alpha value of an arbitrary element - scrollbar->setPos(env->getSkin()->getColor(EGDC_WINDOW).getAlpha()); - - env->addStaticText(L"Logging ListBox:", rect(50,110,250,130), true); - IGUIListBox * listbox = env->addListBox(rect(50, 140, 250, 210)); - env->addEditBox(L"Editable Text", rect(350, 80, 550, 100)); - - // Store the appropriate data in a context structure. - SAppContext context; - context.device = device; - context.counter = 0; - context.listbox = listbox; - - // Then create the event receiver, giving it that context structure. - MyEventReceiver receiver(context); - - // And tell the device to use our custom event receiver. - device->setEventReceiver(&receiver); - - - /* - And at last, we create a nice Irrlicht Engine logo in the top left corner. - */ - env->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), - position2d(10,10)); - - - /* - That's all, we only have to draw everything. - */ - - while(device->run() && driver) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,200,200,200)); - - env->drawAll(); - - driver->endScene(); - } - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/05.UserInterface/tutorial.html b/examples/05.UserInterface/tutorial.html deleted file mode 100644 index 3f3614fa..00000000 --- a/examples/05.UserInterface/tutorial.html +++ /dev/null @@ -1,225 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
-
Tutorial 5.User Interface
-
-
-
-

This tutorial shows how to use the built in User Interface of the Irrlicht - Engine. It will give a brief overview and show how to create and use - windows, buttons, scroll bars, static texts and list boxes.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
- Lets start!
-

As always, we include the header files (conio and curses for getting - user input from the console), and use the irrlicht namespaces. We also - store a pointer to the Irrlicht device, a counter variable for changing - the creation position of a window, and a pointer to a listbox.

- - - - -
#include <irrlicht.h>
-#include <iostream>
-using namespace irr;
-
using namespace core;
-using namespace scene;
-using namespace video;
-using namespace io;
-using namespace gui;
-
#pragma comment(lib, "Irrlicht.lib")
-
IrrlichtDevice *device = 0;
-s32 cnt = 0;
-IGUIListBox* listbox = 0;
-
-

The Event Receiver is not only capable of getting keyboard and mouse - input events, but also events of the graphical user interface (gui). - There are events for almost everything: Button click, Listbox selection - change, events that say that a element was hovered and so on. To be - able to react to some of these events, we create
- an event receiver. We only react to gui events, and if it's such an - event, we get the id of the caller (the gui element which caused the - event) and get the pointer to the gui environment.

- - - - -
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == EET_GUI_EVENT)
{
s32 id = event.GUIEvent.Caller->getID();
IGUIEnvironment* env = device->getGUIEnvironment();
-
            switch(event.GUIEvent.EventType)
-            {
-
-

If a scrollbar changed its scroll position, and it is 'our' scrollbar - (the one with id 104), then we change the
- transparency of all gui elements. This is a very easy task: There is - a skin object, in which all color settings are stored. We simply go - through all colors stored in the skin and change their alpha value. -

- - - - -
case EGET_SCROLL_BAR_CHANGED:
if (id == 104)
{
s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();

for (s32 i=0; i<EGDC_COUNT ; ++i)
{
SColor col = env->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
col.setAlpha(pos);
env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
}
}
break;
-

If a button was clicked, it could be one of 'our' three buttons. If - it is the first, we shut down the engine.
- If it is the second, we create a little window with some text on it. - We also add a string to the list box to log
- what happened. And if it is the third button, we create a file open - dialog, and add also this as string to the list box.
- That's all for the event receiver.

- - - - -
-
       case EGET_BUTTON_CLICKED:
-              if (id == 101)
-              {
-                 device->closeDevice();
-                 return true;
-              }
-
              if (id == 102)
-              {
-                 listbox->addItem(L"Window created");
-                 cnt += 30;
-                 if (cnt > 200) 
-                   cnt = 0;
-
                 IGUIWindow* window = env->addWindow(
-                       rect<s32>(100 + cnt, 100 + cnt, 300 + cnt, 200 + cnt), 
false, // modal? - L"Test window");
-
                 env->addStaticText(L"Please close me", 
-                       rect<s32>(35,35,140,50),
-                       true, // border?,
-                       false, // wordwrap?
-                       window);
-
-                 return true;
-              }
-
              if (id == 103)
-              {
-                 listbox->addItem(L"File open");
-                 env->addFileOpenDialog(L"Please choose a file.");
-                 return true;
-              }
-
              break;
-          }
-       }
-       return false;
-    }
- };
-
-

Ok, now for the more interesting part. First, create the Irrlicht device. - As in some examples before, we ask the user which driver he wants to - use for this example:

-
- - - - -
int main()
-{
-  // ask user for driver
-  video::E_DRIVER_TYPE driverType;
-
-
-  printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;
- switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
} - - // create device and exit if creation failed - device = createDevice(driverType, core::dimension2d<s32>(640, 480));
- if (device == 0) - return 1; -
-
-

The creation was successful, now we set the event receiver and store - pointers to the driver and to the gui environment.

- - - - -
MyEventReceiver receiver;
-device->setEventReceiver(&receiver);
-device->setWindowCaption(L"Irrlicht Engine - User Inferface Demo");
-
video::IVideoDriver* driver = device->getVideoDriver();
-IGUIEnvironment* env = device->getGUIEnvironment();
-
-
-

We add three buttons. The first one closes the engine. The second creates - a window and the third opens a file open dialog. The third parameter is - the id of the button, with which we can easily identify the button in - the event receiver.

- - - - -
env->addButton(rect<s32>(10,240,100,270), 0, 101, L"Quit");
env->addButton(rect<s32>(10,280,100,320), 0, 102, L"New Window");
env->addButton(rect<s32>(10,330,100,370), 0, 103, L"File Open");
-

Now, we add a static text and a scrollbar, which modifies the transparency - of all gui elements. We set the maximum value of the scrollbar to 255, - because that's the maximal value for a color value.
- Then we create an other static text and a list box.

- - - - -
env->addStaticText(L"Transparent Control:", rect<s32>(150,20,350,40), true);
IGUIScrollBar* scrollbar = env->addScrollBar(true, - rect<s32>(150, 45, 350, 60), 0, 104);
scrollbar->setMax(255);
-
env->addStaticText(L"Logging ListBox:", rect<s32>(50,110,250,130), true);
-listbox = env->addListBox(rect<s32>(50, 140, 250, 210));
-
- To make the font a little bit nicer, we load an external font and set it - as new font in the skin. An at last, we create a nice Irrlicht Engine logo - in the top left corner.
-
- - - - -
IGUISkin* skin = env->getSkin();
IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
if (font)
skin->setFont(font);
-
IGUIImage* img = env->addImage(
driver->getTexture("../../media/irrlichtlogoalpha.tga"),
position2d<int>(10,10));
-

That's all, we only have to draw everything.

- - - - -
-
  while(device->run() && driver)
if (device->isWindowActive())
{
driver->beginScene(true, true, SColor(0,122,65,171)); - env->drawAll(); - driver->endScene(); - } - - device->drop();
-
  return 0;
-}
-
- -
-

 

- - diff --git a/examples/06.2DGraphics/2DGraphics.cbp b/examples/06.2DGraphics/2DGraphics.cbp deleted file mode 100644 index f7b73962..00000000 --- a/examples/06.2DGraphics/2DGraphics.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/06.2DGraphics/2DGraphics.vcproj b/examples/06.2DGraphics/2DGraphics.vcproj deleted file mode 100644 index b21c3517..00000000 --- a/examples/06.2DGraphics/2DGraphics.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/06.2DGraphics/2DGraphics.xcodeproj/project.pbxproj b/examples/06.2DGraphics/2DGraphics.xcodeproj/project.pbxproj deleted file mode 100644 index 5848bbf1..00000000 --- a/examples/06.2DGraphics/2DGraphics.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 06.2DGraphics.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 06.2DGraphics.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 06.2DGraphics.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 06.2DGraphics */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "06.2DGraphics" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 06.2DGraphics; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 06.2DGraphics.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "2DGraphics" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 06.2DGraphics */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "2DGraphics" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "06.2DGraphics" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/06.2DGraphics/2DGraphics.xcodeproj/xcshareddata/xcschemes/06.2DGraphics.xcscheme b/examples/06.2DGraphics/2DGraphics.xcodeproj/xcshareddata/xcschemes/06.2DGraphics.xcscheme deleted file mode 100644 index 6a138026..00000000 --- a/examples/06.2DGraphics/2DGraphics.xcodeproj/xcshareddata/xcschemes/06.2DGraphics.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/06.2DGraphics/2DGraphics_vc10.vcxproj b/examples/06.2DGraphics/2DGraphics_vc10.vcxproj deleted file mode 100644 index 07fd309f..00000000 --- a/examples/06.2DGraphics/2DGraphics_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 06.2DGraphics - {E71B6F18-10DC-4101-A541-F6D33F71B2BD} - 2DGraphics - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/06.2DGraphics/2DGraphics_vc11.vcxproj b/examples/06.2DGraphics/2DGraphics_vc11.vcxproj deleted file mode 100644 index 07fd309f..00000000 --- a/examples/06.2DGraphics/2DGraphics_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 06.2DGraphics - {E71B6F18-10DC-4101-A541-F6D33F71B2BD} - 2DGraphics - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/06.2DGraphics/2DGraphics_vc12.vcxproj b/examples/06.2DGraphics/2DGraphics_vc12.vcxproj deleted file mode 100644 index a4750aad..00000000 --- a/examples/06.2DGraphics/2DGraphics_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 06.2DGraphics - {E71B6F18-10DC-4101-A541-F6D33F71B2BD} - 2DGraphics - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/06.2DGraphics/2DGraphics_vc14.vcxproj b/examples/06.2DGraphics/2DGraphics_vc14.vcxproj deleted file mode 100644 index e4d22b1c..00000000 --- a/examples/06.2DGraphics/2DGraphics_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 06.2DGraphics - {E71B6F18-10DC-4101-A541-F6D33F71B2BD} - 2DGraphics - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/2DGraphics.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/2DGraphics.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\06.2DGraphics.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/06.2DGraphics/Makefile b/examples/06.2DGraphics/Makefile deleted file mode 100644 index 84cb831d..00000000 --- a/examples/06.2DGraphics/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 06.2DGraphics -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/06.2DGraphics/main.cpp b/examples/06.2DGraphics/main.cpp deleted file mode 100644 index 930fbea5..00000000 --- a/examples/06.2DGraphics/main.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/** Example 006 2D Graphics - -This tutorial shows how to do 2d graphics with the Irrlicht Engine. -It shows how to draw images, keycolor based sprites, -transparent rectangles, and different fonts. You may consider -this useful if you want to make a 2d game with the engine, or if -you want to draw a cool interface or head up display for your 3d game. - -As always, I include the header files, use the irr namespace, -and tell the linker to link with the .lib file. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* -At first, we let the user select the driver type, then start up the engine, set -a caption, and get a pointer to the video driver. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device - IrrlichtDevice *device = createDevice(driverType, - core::dimension2d(512, 384)); - - if (device == 0) - return 1; // could not create selected driver. - - device->setWindowCaption(L"Irrlicht Engine - 2D Graphics Demo"); - - video::IVideoDriver* driver = device->getVideoDriver(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - All 2d graphics in this example are put together into one texture, - 2ddemo.png. Because we want to draw colorkey based sprites, we need to - load this texture and tell the engine, which part of it should be - transparent based on a colorkey. - - In this example, we don't tell it the color directly, we just say "Hey - Irrlicht Engine, you'll find the color I want at position (0,0) on the - texture.". Instead, it would be also possible to call - driver->makeColorKeyTexture(images, video::SColor(0,0,0,0)), to make - e.g. all black pixels transparent. Please note that - makeColorKeyTexture just creates an alpha channel based on the color. - */ - video::ITexture* images = driver->getTexture(mediaPath + "2ddemo.png"); - driver->makeColorKeyTexture(images, core::position2d(0,0)); - - /* - To be able to draw some text with two different fonts, we first load - them. OK, we load just one. As the first font we just use the default - font which is built into the engine. Also, we define two rectangles - which specify the position of the images of the red imps (little flying - creatures) in the texture. - */ - gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont(); - gui::IGUIFont* font2 = - device->getGUIEnvironment()->getFont(mediaPath + "fonthaettenschweiler.bmp"); - - core::rect imp1(349,15,385,78); - core::rect imp2(387,15,423,78); - - /* - Prepare a nicely filtering 2d render mode for special cases. - */ - driver->getMaterial2D().TextureLayer[0].BilinearFilter=true; - driver->getMaterial2D().AntiAliasing=video::EAAM_FULL_BASIC; - - /* - Everything is prepared, now we can draw everything in the draw loop, - between the begin scene and end scene calls. In this example, we are - just doing 2d graphics, but it would be no problem to mix them with 3d - graphics. Just try it out, and draw some 3d vertices or set up a scene - with the scene manager and draw it. - */ - while(device->run() && driver) - { - if (device->isWindowActive()) - { - u32 time = device->getTimer()->getTime(); - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,120,102,136)); - - /* - First, we draw 3 sprites, using the alpha channel we - created with makeColorKeyTexture. The last parameter - specifies that the drawing method should use this alpha - channel. The last-but-one parameter specifies a - color, with which the sprite should be colored. - (255,255,255,255) is full white, so the sprite will - look like the original. The third sprite is drawn - with the red channel modulated based on the time. - */ - - // draw fire & dragons background world - driver->draw2DImage(images, core::position2d(50,50), - core::rect(0,0,342,224), 0, - video::SColor(255,255,255,255), true); - - // draw flying imp - driver->draw2DImage(images, core::position2d(164,125), - (time/500 % 2) ? imp1 : imp2, 0, - video::SColor(255,255,255,255), true); - - // draw second flying imp with color cycle - driver->draw2DImage(images, core::position2d(270,105), - (time/500 % 2) ? imp1 : imp2, 0, - video::SColor(255,(time) % 255,255,255), true); - - /* - Drawing text is really simple. The code should be self - explanatory. - */ - - // draw some text - if (font) - font->draw(L"This demo shows that Irrlicht is also capable of drawing 2D graphics.", - core::rect(130,10,300,50), - video::SColor(255,255,255,255)); - - // draw some other text - if (font2) - font2->draw(L"Also mixing with 3d graphics is possible.", - core::rect(130,20,300,60), - video::SColor(255,time % 255,time % 255,255)); - - /* - Next, we draw the Irrlicht Engine logo (without - using a color or an alpha channel). Since we slightly scale - the image we use the prepared filter mode. - */ - driver->enableMaterial2D(); - driver->draw2DImage(images, core::rect(10,10,108,48), - core::rect(354,87,442,118)); - driver->enableMaterial2D(false); - - /* - Finally draw a half-transparent rect under the mouse cursor. - */ - core::position2d m = device->getCursorControl()->getPosition(); - driver->draw2DRectangle(video::SColor(100,255,255,255), - core::rect(m.X-20, m.Y-20, m.X+20, m.Y+20)); - - driver->endScene(); - } - } - - device->drop(); - - return 0; -} - -/* -That's all. I hope it was not too difficult. -**/ diff --git a/examples/06.2DGraphics/tutorial.html b/examples/06.2DGraphics/tutorial.html deleted file mode 100644 index ea6291af..00000000 --- a/examples/06.2DGraphics/tutorial.html +++ /dev/null @@ -1,163 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
-
Tutorial 6. 2D Graphics
-
-
-
-

This Tutorial shows how to do 2d graphics with the Irrlicht Engine. - It shows how to draw images, keycolor based sprites, transparent rectangles - and different fonts. You will may consider this useful if you want to - make a 2d game with the engine, or if you want to draw a cool interface - or head up display for your 3d game.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
- Lets start!
-

As always, I include the header files, use the irr namespace, and tell - the linker to link with the .lib file.

- - - - -
#include <irrlicht.h>
#include <iostream>

using namespace irr;
-
#pragma comment(lib, "Irrlicht.lib")
-               
-

At first, we let the user select the driver type, then start up the - engine, set a caption, and get a pointer to the video driver.

- - - - -
int main()
{
// let user select driver type
video::E_DRIVER_TYPE driverType;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}

// create device
-
  IrrlichtDevice *device = createDevice(driverType,
-         core::dimension2d<s32>(512, 384));
-
  if (device == 0)
-      return 1;
- 
device->setWindowCaption(L"Irrlicht Engine - 2D Graphics Demo");
-
  video::IVideoDriver* driver = device->getVideoDriver();
-

All 2d graphics in this example are put together into one texture, - 2ddemo.bmp. Because we want to draw colorkey based sprites, we need - to load this texture and tell the engine, which part of it should be - transparent based on a colorkey. In this example, we don't tell it the - color directly, we just say "Hey Irrlicht Engine, you'll find the - color I want at position (0,0) on the texture.". Instead, it would - be also possible to call driver->makeColorKeyTexture(images, - video::SColor(0,0,0,0)), to make e.g. all black pixels transparent. - Please note, that makeColorKeyTexture just creates an alpha channel - based on the color.

- - - - -
video::ITexture* images = driver->getTexture("../../media/2ddemo.bmp");
driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));
-

To be able to draw some text with two different fonts, we load them. - Ok, we load just one, as first font we just use the default font which - is built into the engine.
- Also, we define two rectangles, which specify the position of the images - of the red imps (little flying creatures) in the texture.

- - - - -
gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont();
gui::IGUIFont* font2 = device->getGUIEnvironment()->getFont( - "../../media/fonthaettenschweiler.bmp");
-
core::rect<s32> imp1(349,15,385,78);
-core::rect<s32> imp2(387,15,423,78);
-

Everything is prepared, now we can draw everything in the draw loop, - between the begin scene and end scene calls. In this example, we are - just doing 2d graphics, but it would be no problem to mix them with - 3d graphics. Just try it out, and draw some 3d vertices or set up a - scene with the scene manager and draw it.

-
- - - - -
while(device->run() && driver)
{
if (device->isWindowActive())
{
u32 time = device->getTimer()->getTime();
driver->beginScene(true, true, video::SColor(0,120,102,136)); -
-

First, we draw 3 sprites, using the alpha channel we created with makeColorKeyTexture. - The last parameter specifiys that the drawing method should use thiw alpha - channel. The parameter before the last one specifies a color, with wich - the sprite should be colored. (255,255,255,255) is full white, so the - sprite will look like the original. The third sprite is drawed colored - based on the time.

- - - - -
// draw fire & dragons background world
driver->draw2DImage(images, core::position2d<s32>(50,50),
core::rect<s32>(0,0,342,224), 0,
video::SColor(255,255,255,255), true);
-
// draw flying imp 
-driver->draw2DImage(images, core::position2d<s32>(164,125),
-  (time/500 % 2) ? imp1 : imp2, 0, 
-   video::SColor(255,255,255,255), true);
-
// draw second flying imp with colorcylce
-driver->draw2DImage(images, core::position2d<s32>(270,105),
-  (time/500 % 2) ? imp1 : imp2, 0, 
-  video::SColor(255,(time) % 255,255,255), true);
-

Drawing text is really simple. The code should be self explanatory.

- - - - -
// draw some text
if (font)
font->draw(L"This is some text.",
core::rect<s32>(130,10,300,50),
video::SColor(255,255,255,255));
-
// draw some other text
-if (font2)
-   font2->draw(L"This is some other text.", 
-       core::rect<s32>(130,20,300,60),
-       video::SColor(255,time % 255,time % 255,255));
-

At last, we draw the Irrlicht Engine logo (without using a color or an - alpha channel) and a transparent 2d Rectangle at the position of the mouse - cursor.

- - - - -
    // draw logo
driver->draw2DImage(images, core::position2d<s32>(10,10),
core::rect<s32>(354,87,442,118));
-
    // draw transparent rect under cursor
-    core::position2d<s32> m = device->getCursorControl()->getPosition();
-    driver->draw2DRectangle(video::SColor(100,255,255,255),
-          core::rect<s32>(m.X-20, m.Y-20, m.X+20, m.Y+20));
-
    driver->endScene();
-  }
-}
-

That's all, it was not really difficult, I hope.

- - - - -
   device->drop();
-   return 0;
-}
-
-

 

-

 

- - diff --git a/examples/07.Collision/Collision.cbp b/examples/07.Collision/Collision.cbp deleted file mode 100644 index 1d735879..00000000 --- a/examples/07.Collision/Collision.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/07.Collision/Collision.vcproj b/examples/07.Collision/Collision.vcproj deleted file mode 100644 index a4e4b076..00000000 --- a/examples/07.Collision/Collision.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/07.Collision/Collision.xcodeproj/project.pbxproj b/examples/07.Collision/Collision.xcodeproj/project.pbxproj deleted file mode 100644 index 2dbe0680..00000000 --- a/examples/07.Collision/Collision.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 07.Collision.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 07.Collision.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 07.Collision.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 07.Collision */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "07.Collision" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 07.Collision; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 07.Collision.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Collision" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 07.Collision */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Collision" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "07.Collision" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/07.Collision/Collision.xcodeproj/xcshareddata/xcschemes/07.Collision.xcscheme b/examples/07.Collision/Collision.xcodeproj/xcshareddata/xcschemes/07.Collision.xcscheme deleted file mode 100644 index c9728c83..00000000 --- a/examples/07.Collision/Collision.xcodeproj/xcshareddata/xcschemes/07.Collision.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/07.Collision/Collision_vc10.vcxproj b/examples/07.Collision/Collision_vc10.vcxproj deleted file mode 100644 index 72fcae0a..00000000 --- a/examples/07.Collision/Collision_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 07.Collision - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E} - Collision - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/07.Collision/Collision_vc11.vcxproj b/examples/07.Collision/Collision_vc11.vcxproj deleted file mode 100644 index 72fcae0a..00000000 --- a/examples/07.Collision/Collision_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 07.Collision - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E} - Collision - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/07.Collision/Collision_vc12.vcxproj b/examples/07.Collision/Collision_vc12.vcxproj deleted file mode 100644 index 6434626b..00000000 --- a/examples/07.Collision/Collision_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 07.Collision - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E} - Collision - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/07.Collision/Collision_vc14.vcxproj b/examples/07.Collision/Collision_vc14.vcxproj deleted file mode 100644 index 06983f17..00000000 --- a/examples/07.Collision/Collision_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 07.Collision - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E} - Collision - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Collision.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\07.Collision.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Collision.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\07.Collision.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/07.Collision/Makefile b/examples/07.Collision/Makefile deleted file mode 100644 index 25efc238..00000000 --- a/examples/07.Collision/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 07.Collision -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/07.Collision/main.cpp b/examples/07.Collision/main.cpp deleted file mode 100644 index a52f493e..00000000 --- a/examples/07.Collision/main.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/** Example 007 Collision - -We will describe 2 methods: Automatic collision detection for moving through -3d worlds with stair climbing and sliding, and manual scene node and triangle -picking using a ray. In this case, we will use a ray coming out from the -camera, but you can use any ray. - -To start, we take the program from tutorial 2, which loads and displays a -quake 3 level. We will use the level to walk in it and to pick triangles from. -In addition we'll place 3 animated models into it for triangle picking. The -following code starts up the engine and loads the level, as per tutorial 2. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -enum -{ - // I use this ISceneNode ID to indicate a scene node that is - // not pickable by getSceneNodeAndCollisionPointFromRay() - ID_IsNotPickable = 0, - - // I use this flag in ISceneNode IDs to indicate that the - // scene node can be picked by ray selection. - IDFlag_IsPickable = 1 << 0, - - // I use this flag in ISceneNode IDs to indicate that the - // scene node can be highlighted. In this example, the - // homonids can be highlighted, but the level mesh can't. - IDFlag_IsHighlightable = 1 << 1 -}; - -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device - - IrrlichtDevice *device = - createDevice(driverType, core::dimension2d(640, 480), 16, false); - - if (device == 0) - return 1; // could not create selected driver. - - /* - If we want to receive information about the material of a hit triangle we have to get - collisions per meshbuffer. The only disadvantage of this is that getting them per - meshbuffer can be a little bit slower than per mesh, but usually that's not noticeable. - If you set this to false you will no longer get material names in the title bar. - */ - const bool separateMeshBuffers = true; - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - const io::path mediaPath = getExampleMediaPath(); - - device->getFileSystem()->addFileArchive(mediaPath + "map-20kdm2.pk3"); - - scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp"); - scene::IMeshSceneNode* q3node = 0; - - // The Quake mesh is pickable, but doesn't get highlighted. - if (q3levelmesh) - q3node = smgr->addOctreeSceneNode(q3levelmesh->getMesh(0), 0, IDFlag_IsPickable); - - /* - So far so good, we've loaded the quake 3 level like in tutorial 2. Now, - here comes something different: We create a triangle selector. A - triangle selector is a class which can fetch the triangles from scene - nodes for doing different things with them, for example collision - detection. There are different triangle selectors, and all can be - created with the ISceneManager. In this example, we create an - OctreeTriangleSelector, which optimizes the triangle output a little - bit by reducing it like an octree. This is very useful for huge meshes - like quake 3 levels. After we created the triangle selector, we attach - it to the q3node. This is not necessary, but in this way, we do not - need to care for the selector, for example dropping it after we do not - need it anymore. - */ - - scene::ITriangleSelector* selector = 0; - - if (q3node) - { - q3node->setPosition(core::vector3df(-1350,-130,-1400)); - - /* - There is currently no way to split an octree by material. - So if we need material infos we have to create one octree per - meshbuffer and put them together in a MetaTriangleSelector. - */ - if ( separateMeshBuffers && q3node->getMesh()->getMeshBufferCount() > 1) - { - scene::IMetaTriangleSelector * metaSelector = smgr->createMetaTriangleSelector(); - for ( irr::u32 m=0; m < q3node->getMesh()->getMeshBufferCount(); ++m ) - { - scene::ITriangleSelector* - bufferSelector = smgr->createOctreeTriangleSelector( - q3node->getMesh()->getMeshBuffer(m), m, q3node); - if ( bufferSelector ) - { - metaSelector->addTriangleSelector( bufferSelector ); - bufferSelector->drop(); - } - } - selector = metaSelector; - } - else - { - // If you don't need material infos just create one octree for the - // whole mesh. - selector = smgr->createOctreeTriangleSelector( - q3node->getMesh(), q3node, 128); - } - q3node->setTriangleSelector(selector); - // We're not done with this selector yet, so don't drop it. - } - - - /* - We add a first person shooter camera to the scene so that we can see and - move in the quake 3 level like in tutorial 2. But this, time, we add a - special animator to the camera: A collision response animator. This - animator modifies the scene node to which it is attached in order to - prevent it from moving through walls and to add gravity to the node. The - only things we have to tell the animator is how the world looks like, - how big the scene node is, how much gravity to apply and so on. After the - collision response animator is attached to the camera, we do not have to do - anything else for collision detection, it's all done automatically. - The rest of the collision detection code below is for picking. And please - note another cool feature: The collision response animator can be - attached also to all other scene nodes, not only to cameras. And it can - be mixed with other scene node animators. In this way, collision - detection and response in the Irrlicht engine is really easy. - - Now we'll take a closer look on the parameters of - createCollisionResponseAnimator(). The first parameter is the - TriangleSelector, which specifies how the world, against which collision - detection is done, looks like. The second parameter is the scene node, - which is the object which is affected by collision detection - in our - case it is the camera. The third defines how big the object is, it is - the radius of an ellipsoid. Try it out and change the radius to smaller - values, the camera will be able to move closer to walls after this. The - next parameter is the direction and speed of gravity. We'll set it to - (0, -1000, 0), which approximates realistic gravity (depends on the units - which are used in the scene model). You could set it to (0,0,0) to disable - gravity. And the last value is just an offset: Without it the ellipsoid with - which collision detection is done would be around the camera and the camera - would be in the middle of the ellipsoid. But as human beings, we are used to - have our eyes on top of the body, not in the middle of it. So we place the - scene node 50 units over the center of the ellipsoid with this parameter. - And that's it, collision detection works now. - */ - - // Set a jump speed of 300 units per second, which gives a fairly realistic jump - // when used with the gravity of (0, -1000, 0) in the collision response animator. - scene::ICameraSceneNode* camera = - smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, 0, 0, true, 300.f); - camera->setPosition(core::vector3df(50,50,-60)); - camera->setTarget(core::vector3df(-70,30,-60)); - - if (selector) - { - scene::ISceneNodeAnimatorCollisionResponse * anim = smgr->createCollisionResponseAnimator( - selector, camera, core::vector3df(30,50,30), - core::vector3df(0,-1000,0), core::vector3df(0,30,0)); - selector->drop(); // As soon as we're done with the selector, drop it. - camera->addAnimator(anim); - anim->drop(); // And likewise, drop the animator when we're done referring to it. - } - - // Now I create three animated characters which we can pick, a dynamic light for - // lighting them, and a billboard for drawing where we found an intersection. - - // First, let's get rid of the mouse cursor. We'll use a billboard to show - // what we're looking at. - device->getCursorControl()->setVisible(false); - - // Add the billboard. - scene::IBillboardSceneNode * bill = smgr->addBillboardSceneNode(); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particle.bmp")); - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialFlag(video::EMF_ZBUFFER, false); - bill->setSize(core::dimension2d(20.0f, 20.0f)); - bill->setID(ID_IsNotPickable); // This ensures that we don't accidentally ray-pick it - - /* Add 3 animated hominids, which we can pick using a ray-triangle intersection. - They all animate quite slowly, to make it easier to see that accurate triangle - selection is being performed. */ - scene::IAnimatedMeshSceneNode* node = 0; - - video::SMaterial material; - - // Add an MD2 node, which uses vertex-based animation. - node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "faerie.md2"), - 0, IDFlag_IsPickable | IDFlag_IsHighlightable); - node->setPosition(core::vector3df(-90,-15,-140)); // Put its feet on the floor. - node->setScale(core::vector3df(1.6f)); // Make it appear realistically scaled - node->setMD2Animation(scene::EMAT_POINT); - node->setAnimationSpeed(20.f); - material.setTexture(0, driver->getTexture(mediaPath + "faerie2.bmp")); - material.Lighting = true; - material.NormalizeNormals = true; - node->getMaterial(0) = material; - - // Now create a triangle selector for it. The selector will know that it - // is associated with an animated node, and will update itself as necessary. - selector = smgr->createTriangleSelector(node, separateMeshBuffers); - node->setTriangleSelector(selector); - selector->drop(); // We're done with this selector, so drop it now. - - // And this B3D file uses skinned skeletal animation. - node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "ninja.b3d"), - 0, IDFlag_IsPickable | IDFlag_IsHighlightable); - node->setScale(core::vector3df(10)); - node->setPosition(core::vector3df(-75,-66,-80)); - node->setRotation(core::vector3df(0,90,0)); - node->setAnimationSpeed(8.f); - node->getMaterial(0).NormalizeNormals = true; - node->getMaterial(0).Lighting = true; - // Just do the same as we did above. - selector = smgr->createTriangleSelector(node, separateMeshBuffers); - node->setTriangleSelector(selector); - selector->drop(); - - // This X files uses skeletal animation, but without skinning. - node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "dwarf.x"), - 0, IDFlag_IsPickable | IDFlag_IsHighlightable); - node->setPosition(core::vector3df(-70,-66,-30)); // Put its feet on the floor. - node->setRotation(core::vector3df(0,-90,0)); // And turn it towards the camera. - node->setAnimationSpeed(20.f); - node->getMaterial(0).Lighting = true; - selector = smgr->createTriangleSelector(node, separateMeshBuffers); - node->setTriangleSelector(selector); - selector->drop(); - - // And this mdl file uses skinned skeletal animation. - node = smgr->addAnimatedMeshSceneNode(smgr->getMesh(mediaPath + "yodan.mdl"), - 0, IDFlag_IsPickable | IDFlag_IsHighlightable); - node->setPosition(core::vector3df(-90,-25,20)); - node->setScale(core::vector3df(0.8f)); - node->getMaterial(0).Lighting = true; - node->setAnimationSpeed(20.f); - - // Just do the same as we did above. - selector = smgr->createTriangleSelector(node, separateMeshBuffers); - node->setTriangleSelector(selector); - selector->drop(); - - material.setTexture(0, 0); - material.Lighting = false; - - // Add a light, so that the unselected nodes aren't completely dark. - scene::ILightSceneNode * light = smgr->addLightSceneNode(0, core::vector3df(-60,100,400), - video::SColorf(1.0f,1.0f,1.0f,1.0f), 600.0f); - light->setID(ID_IsNotPickable); // Make it an invalid target for selection. - - // Remember which scene node is highlighted - scene::ISceneNode* highlightedSceneNode = 0; - scene::ISceneCollisionManager* collMan = smgr->getSceneCollisionManager(); - - // draw the selection triangle only as wireframe - material.Wireframe=true; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0)); - smgr->drawAll(); - - // Unlight any currently highlighted scene node - if (highlightedSceneNode) - { - highlightedSceneNode->setMaterialFlag(video::EMF_LIGHTING, true); - highlightedSceneNode = 0; - } - - // All intersections in this example are done with a ray cast out from the camera to - // a distance of 1000. You can easily modify this to check (e.g.) a bullet - // trajectory or a sword's position, or create a ray from a mouse click position using - // ISceneCollisionManager::getRayFromScreenCoordinates() - core::line3d ray; - ray.start = camera->getPosition(); - ray.end = ray.start + (camera->getTarget() - ray.start).normalize() * 1000.0f; - - - // This call is all you need to perform ray/triangle collision on every scene node - // that has a triangle selector, including the Quake level mesh. It finds the nearest - // collision point/triangle, and returns the scene node containing that point. - // Irrlicht provides other types of selection, including ray/triangle selector, - // ray/box and ellipse/triangle selector, plus associated helpers. - // You might also want to check the other methods of ISceneCollisionManager. - - irr::io::SNamedPath hitTextureName; - scene::SCollisionHit hitResult; - scene::ISceneNode * selectedSceneNode =collMan->getSceneNodeAndCollisionPointFromRay( - hitResult, // Returns all kind of info about the collision - ray, - IDFlag_IsPickable, // This ensures that only nodes that we have - // set up to be pickable are considered - 0); // Check the entire scene (this is actually the implicit default) - - - // If the ray hit anything, move the billboard to the collision position - // and draw the triangle that was hit. - if(selectedSceneNode) - { - bill->setPosition(hitResult.Intersection); // Show the current intersection point with the level or a mesh - - // We need to reset the transform before doing our own rendering. - driver->setTransform(video::ETS_WORLD, core::matrix4()); - driver->setMaterial(material); - driver->draw3DTriangle(hitResult.Triangle, video::SColor(0,255,0,0)); // Show which triangle has been hit - - // We can check the flags for the scene node that was hit to see if it should be - // highlighted. The animated nodes can be highlighted, but not the Quake level mesh - if((selectedSceneNode->getID() & IDFlag_IsHighlightable) == IDFlag_IsHighlightable) - { - highlightedSceneNode = selectedSceneNode; - - // Highlighting in this case means turning lighting OFF for this node, - // which means that it will be drawn with full brightness. - highlightedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false); - } - - // When separateMeshBuffers is set to true we can now find out which material was hit - if ( hitResult.MeshBuffer && hitResult.Node && hitResult.Node->getMaterial(hitResult.MaterialIndex).TextureLayer[0].Texture ) - { - // Note we are interested in the node material and not in the meshbuffer material. - // Otherwise we wouldn't get the fairy2 texture which is only set on the node. - hitTextureName = hitResult.Node->getMaterial(hitResult.MaterialIndex).TextureLayer[0].Texture->getName(); - } - } - - // We're all done drawing, so end the scene. - driver->endScene(); - - // Show some info in title-bar - int fps = driver->getFPS(); - static core::stringw lastString; - core::stringw str = L"Collision detection example - Irrlicht Engine ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - if ( !hitTextureName.getInternalName().empty() ) - { - str += " "; - irr::io::path texName(hitTextureName.getInternalName()); - str += core::deletePathFromFilename(texName); - } - if ( str != lastString ) // changing caption is somewhat expensive, so don't when nothing changed - { - device->setWindowCaption(str.c_str()); - lastString = str; - } - } - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/07.Collision/tutorial.html b/examples/07.Collision/tutorial.html deleted file mode 100644 index c04fce99..00000000 --- a/examples/07.Collision/tutorial.html +++ /dev/null @@ -1,308 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
-
Tutorial 7. Collision detection - and response
-
-
-
-

In this tutorial, I will show how to collision detection with the Irrlicht - Engine. I will describe 3 methods: Automatic collision detection for - moving through 3d worlds with stair climbing and sliding, manual triangle - picking and manual scene node picking.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
- Lets start!
-
-

To start, we take the program from tutorial 2, which loaded and displayed - a quake 3 level. We will use the level to walk in it and to pick triangles - from it. In addition we'll place 3 animated models into it for scene - node picking. The following code starts up the engine and loads a - quake 3 level. I will not explain it, because it should already be - known from tutorial 2.

- - - - -
#include <irrlicht.h>
-#include <iostream>
-
using namespace irr; - -#pragma comment(lib, "Irrlicht.lib") - -int main() -{ - // let user select driver type -
video::E_DRIVER_TYPE driverType;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}
- // create device
-
  IrrlichtDevice *device = createDevice(driverType,
-     core::dimension2d<s32>(640, 480), 16, false);
- if (device == 0)
return 1; // could not create selected driver.

video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();

device->getFileSystem()->addZipFileArchive
("../../media/map-20kdm2.pk3"); - - - scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp"); - scene::ISceneNode* q3node = 0; - - if (q3levelmesh) - q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0)); -
-
-

So far so good, we've loaded the quake 3 level like in tutorial - 2. Now, here comes something different: We create a triangle selector. - A triangle selector is a class which can fetch the triangles from - scene nodes for doing different things with them, for example collision - detection. There are different triangle selectors, and all can be - created with the ISceneManager. In this example, we create an OctTreeTriangleSelector, - which optimizes the triangle output a little bit by reducing it like - an octree. This is very useful for huge meshes like quake 3 levels.
- Afte we created the triangle selector, we attach it to the q3node. - This is not necessary, but in this way, we do not need to care for - the selector, for example dropping it after we do not need it anymore.

- - - - -
scene::ITriangleSelector* selector = 0;
-	
-	if (q3node)
-	{		
-		q3node->setPosition(core::vector3df(-1370,-130,-1400));
-
-		selector = smgr->createOctTreeTriangleSelector(
-            q3levelmesh->getMesh(0), q3node, 128);
-		q3node->setTriangleSelector(selector);
-	}
-

We add a first person shooter camera to the scene for being able - to move in the quake 3 level like in tutorial 2. But this, time, we - add a special animator to the camera: A Collision Response animator. - This thing modifies the scene node to which it is attached to in that - way, that it may no more move through walls and is affected by gravity. - The only thing we have to tell the animator is how the world looks - like, how big the scene node is, how gravity and so on. After the - collision response animator is attached to the camera, we do not have - to do anything more for collision detection, anything is done automaticly, - all other collision detection code below is for picking. And please - note another cool feature: The collsion response animator can be attached - also to all other scene nodes, not only to cameras. And it can be - mixed with other scene node animators. In this way, collision detection - and response in the Irrlicht
- engine is really, really easy.
- Now we'll take a closer look on the parameters of createCollisionResponseAnimator(). - The first parameter is the TriangleSelector, which specifies how the - world, against collision detection is done looks like. The second - parameter is the scene node, which is the object, which is affected - by collision detection, in our case it is the camera. The third defines - how big the object is, it is the radius of an ellipsoid. Try it out - and change the radius to smaller values, the camera will be able to - move closer to walls after this. The next parameter is the direction - and speed of gravity. You could set it to (0,0,0) to disable gravity. - And the last value is just a translation: Without this, the ellipsoid - with which collision detection is done would be around the camera, - and the camera would be in the middle of the ellipsoid. But as human - beings, we are used to have our eyes on top of the body, with which - we collide with our world, not in the middle of it. So we place the - scene node 50 units over the center of the ellipsoid with this parameter. - And that's it, collision detection works now.
-

- - - - -
	scene::ICameraSceneNode* camera = 	
camera = smgr->addCameraSceneNodeFPS(0,100.0f,300.0f); - camera->setPosition(core::vector3df(-100,50,-150)); - - scene::ISceneNodeAnimator* anim =
smgr->createCollisionResponseAnimator( - selector, camera, core::vector3df(30,50,30), - core::vector3df(0,-3,0), - core::vector3df(0,50,0));
- selector->drop();
- camera->addAnimator(anim); - anim->drop();
-

Because collision detection is no big deal in irrlicht, I'll describe - how to do two different types of picking in the next section. But - before this, I'll prepare the scene a little. I need three animated - characters which we
- could pick later, a dynamic light for lighting them, a billboard for - drawing where we found an intersection, and, yes, I need to get rid - of this mouse cursor. :)

- - - - -
	// disable mouse cursor
-
-	device->getCursorControl()->setVisible(false);
-
-	// add billboard
-
-	scene::IBillboardSceneNode * bill = smgr->addBillboardSceneNode();
-	bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );
-	bill->setMaterialTexture(0, driver->getTexture(
"../../media/particle.bmp")); - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setSize(core::dimension2d<f32>(20.0f, 20.0f)); - - // add 3 animated faeries. - - video::SMaterial material; - material.Texture1 = driver->getTexture(
"../../media/faerie2.bmp"
); - material.Lighting = true; - - scene::IAnimatedMeshSceneNode* node = 0; - scene::IAnimatedMesh* faerie = smgr->getMesh(
"../../media/faerie.md2"); - - if (faerie) - { - node = smgr->addAnimatedMeshSceneNode(faerie); - node->setPosition(core::vector3df(-70,0,-90)); - node->setMD2Animation(scene::EMAT_RUN); - node->getMaterial(0) = material; - - node = smgr->addAnimatedMeshSceneNode(faerie); - node->setPosition(core::vector3df(-70,0,-30)); - node->setMD2Animation(scene::EMAT_SALUTE); - node->getMaterial(0) = material; - - node = smgr->addAnimatedMeshSceneNode(faerie); - node->setPosition(core::vector3df(-70,0,-60)); - node->setMD2Animation(scene::EMAT_JUMP); - node->getMaterial(0) = material; - } - - material.Texture1 = 0; - material.Lighting = false; - - // Add a light - - smgr->addLightSceneNode(0, core::vector3df(-60,100,400), - video::SColorf(1.0f,1.0f,1.0f,1.0f), - 600.0f);
-

For not making it to complicated, I'm doing picking inside the drawing - loop. We take two pointers for storing the current and the last selected - scene node and start the loop.

-
- - - - -
	scene::ISceneNode* selectedSceneNode = 0;
-	scene::ISceneNode* lastSelectedSceneNode = 0;
-
-	
-	int lastFPS = -1;
-
-	while(device->run())
if (device->isWindowActive()) - { - driver->beginScene(true, true, 0); - - smgr->drawAll();
-

After we've drawn the whole scene whit smgr->drawAll(), we'll do - the first picking: We want to know which triangle of the world we are - looking at. In addition, we want the exact point of the quake 3 level - we are looking at. For this, we create a 3d line starting at the position - of the camera and going through the lookAt-target of it. Then we ask - the collision manager if this line collides with a triangle of the world - stored in the triangle selector. If yes, we draw the 3d triangle and - set the position of the billboard to the intersection point.

- - - - -
		core::line3d<f32> line;
-		line.start = camera->getPosition();
-		line.end = line.start +
-         (camera->getTarget() - line.start).normalize() * 1000.0f;
-
-		core::vector3df intersection;
-		core::triangle3df tri;
-
-		if (smgr->getSceneCollisionManager()->getCollisionPoint(
-			line, selector, intersection, tri))
-		{
-			bill->setPosition(intersection);
-				
-			driver->setTransform(video::ETS_WORLD, core::matrix4());
-			driver->setMaterial(material);
-			driver->draw3DTriangle(tri, video::SColor(0,255,0,0));
-		}
-

Another type of picking supported by the Irrlicht Engine is scene - node picking based on bouding boxes. Every scene node has got a bounding - box, and because of that, it's very fast for example to get the scene - node which the camera looks
- at. Again, we ask the collision manager for this, and if we've got a - scene node, we highlight it by disabling Lighting in its material, if - it is not the billboard or the quake 3 level.

- - - - -
		selectedSceneNode = smgr->getSceneCollisionManager()->
-          getSceneNodeFromCameraBB(camera);
-
-		if (lastSelectedSceneNode)
-			lastSelectedSceneNode->setMaterialFlag(
-                video::EMF_LIGHTING, true);
-
-		if (selectedSceneNode == q3node ||
-           selectedSceneNode == bill)
-			selectedSceneNode = 0;
-
-		if (selectedSceneNode)
-			selectedSceneNode->setMaterialFlag(
-               video::EMF_LIGHTING, false);
-
-		lastSelectedSceneNode = selectedSceneNode;
-

That's it, we just have to finish drawing.

- - - - -
		driver->endScene();
-
-		int fps = driver->getFPS();
-
-		if (lastFPS != fps)
-		{
-		  core::stringw str = L"Collision detection example - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;

device->setWindowCaption(str.c_str());
lastFPS = fps;
} - } - - device->drop(); - - return 0; -} - -
-

 

-

 

-
-
-

 

- - diff --git a/examples/08.SpecialFX/Makefile b/examples/08.SpecialFX/Makefile deleted file mode 100644 index 2a382f35..00000000 --- a/examples/08.SpecialFX/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 08.SpecialFX -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/08.SpecialFX/SpecialFX.cbp b/examples/08.SpecialFX/SpecialFX.cbp deleted file mode 100644 index c23c621f..00000000 --- a/examples/08.SpecialFX/SpecialFX.cbp +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - diff --git a/examples/08.SpecialFX/SpecialFX.vcproj b/examples/08.SpecialFX/SpecialFX.vcproj deleted file mode 100644 index e22266e3..00000000 --- a/examples/08.SpecialFX/SpecialFX.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/08.SpecialFX/SpecialFX.xcodeproj/project.pbxproj b/examples/08.SpecialFX/SpecialFX.xcodeproj/project.pbxproj deleted file mode 100644 index cc37ca7f..00000000 --- a/examples/08.SpecialFX/SpecialFX.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 08.SpecialFX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 08.SpecialFX.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 08.SpecialFX.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 08.SpecialFX */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "08.SpecialFX" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 08.SpecialFX; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 08.SpecialFX.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "SpecialFX" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 08.SpecialFX */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "SpecialFX" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "08.SpecialFX" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/08.SpecialFX/SpecialFX.xcodeproj/xcshareddata/xcschemes/08.SpecialFX.xcscheme b/examples/08.SpecialFX/SpecialFX.xcodeproj/xcshareddata/xcschemes/08.SpecialFX.xcscheme deleted file mode 100644 index 71ffc702..00000000 --- a/examples/08.SpecialFX/SpecialFX.xcodeproj/xcshareddata/xcschemes/08.SpecialFX.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/08.SpecialFX/SpecialFX_vc10.vcxproj b/examples/08.SpecialFX/SpecialFX_vc10.vcxproj deleted file mode 100644 index fd669a1a..00000000 --- a/examples/08.SpecialFX/SpecialFX_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 08.SpecialFX - {C869BF55-B9D6-4980-BC92-60FA0CF8411A} - SpecialFX - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/08.SpecialFX/SpecialFX_vc11.vcxproj b/examples/08.SpecialFX/SpecialFX_vc11.vcxproj deleted file mode 100644 index fd669a1a..00000000 --- a/examples/08.SpecialFX/SpecialFX_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 08.SpecialFX - {C869BF55-B9D6-4980-BC92-60FA0CF8411A} - SpecialFX - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/08.SpecialFX/SpecialFX_vc12.vcxproj b/examples/08.SpecialFX/SpecialFX_vc12.vcxproj deleted file mode 100644 index 45f60640..00000000 --- a/examples/08.SpecialFX/SpecialFX_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 08.SpecialFX - {C869BF55-B9D6-4980-BC92-60FA0CF8411A} - SpecialFX - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/08.SpecialFX/SpecialFX_vc14.vcxproj b/examples/08.SpecialFX/SpecialFX_vc14.vcxproj deleted file mode 100644 index d91a31f6..00000000 --- a/examples/08.SpecialFX/SpecialFX_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 08.SpecialFX - {C869BF55-B9D6-4980-BC92-60FA0CF8411A} - SpecialFX - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/SpecialFX.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/SpecialFX.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\08.SpecialFx.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/08.SpecialFX/main.cpp b/examples/08.SpecialFX/main.cpp deleted file mode 100644 index c72674b7..00000000 --- a/examples/08.SpecialFX/main.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/** Example 008 SpecialFX - -This tutorial describes how to do special effects. It shows how to use stencil -buffer shadows, the particle system, billboards, dynamic light, and the water -surface scene node. - -We start like in some tutorials before. Please note that this time, the -'shadows' flag in createDevice() is set to true, for we want to have a dynamic -shadow cast from an animated character. If this example runs too slow, -set it to false. The Irrlicht Engine also checks if your hardware doesn't -support the stencil buffer, and then disables shadows by itself. -*/ - -#include -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -int main() -{ - // ask if user would like shadows - char i = 'y'; - printf("Please press 'y' if you want to use realtime shadows.\n"); - - std::cin >> i; - - const bool shadows = (i == 'y'); - - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - - /* - Create device and exit if creation failed. We make the stencil flag - optional to avoid slow screen modes for runs without shadows. - */ - - IrrlichtDevice *device = - createDevice(driverType, core::dimension2d(640, 480), - 16, false, shadows); - - if (device == 0) - return 1; // could not create selected driver. - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - For our environment, we load a .3ds file. It is a small room I modeled - with Anim8or and exported into the 3ds format because the Irrlicht - Engine does not support the .an8 format. I am a very bad 3d graphic - artist, and so the texture mapping is not very nice in this model. - Luckily I am a better programmer than artist, and so the Irrlicht - Engine is able to create a cool texture mapping for me: Just use the - mesh manipulator and create a planar texture mapping for the mesh. If - you want to see the mapping I made with Anim8or, uncomment this line. I - also did not figure out how to set the material right in Anim8or, it - has a specular light color which I don't really like. I'll switch it - off too with this code. - */ - - scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "room.3ds"); - - smgr->getMeshManipulator()->makePlanarTextureMapping(mesh->getMesh(0), 0.004f); - - scene::ISceneNode* node = 0; - - node = smgr->addAnimatedMeshSceneNode(mesh); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.jpg")); - node->getMaterial(0).SpecularColor.set(0,0,0,0); - - /* - Now, for the first special effect: Animated water. It works like this: - The WaterSurfaceSceneNode takes a mesh as input and makes it wave like - a water surface. And if we let this scene node use a nice material like - the EMT_REFLECTION_2_LAYER, it looks really cool. We are doing this - with the next few lines of code. As input mesh, we create a hill plane - mesh, without hills. But any other mesh could be used for this, you - could even use the room.3ds (which would look really strange) if you - want to. - */ - - mesh = smgr->addHillPlaneMesh( "myHill", - core::dimension2d(20,20), - core::dimension2d(40,40), 0, 0, - core::dimension2d(0,0), - core::dimension2d(10,10)); - - node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0), 3.0f, 300.0f, 30.0f); - node->setPosition(core::vector3df(0,7,0)); - - node->setMaterialTexture(0, driver->getTexture(mediaPath + "stones.jpg")); - node->setMaterialTexture(1, driver->getTexture(mediaPath + "water.jpg")); - - node->setMaterialType(video::EMT_REFLECTION_2_LAYER); - - /* - The second special effect is very basic, I bet you saw it already in - some Irrlicht Engine demos: A transparent billboard combined with a - dynamic light. We simply create a light scene node, let it fly around, - and to make it look more cool, we attach a billboard scene node to it. - */ - - // create light - scene::ILightSceneNode * lightNode = smgr->addLightSceneNode(0, core::vector3df(0,0,0), - video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 800.0f); - scene::ISceneNodeAnimator* anim = 0; - anim = smgr->createFlyCircleAnimator (core::vector3df(0,150,0),250.0f, 0.0005f); - lightNode ->addAnimator(anim); - anim->drop(); - - // attach billboard to light - - node = smgr->addBillboardSceneNode(lightNode, core::dimension2d(50, 50)); - node->setMaterialFlag(video::EMF_LIGHTING, false); - node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "particlewhite.bmp")); - - /* - The next special effect is a lot more interesting: A particle system. - The particle system in the Irrlicht Engine is quite modular and - extensible, but yet easy to use. There is a particle system scene node - into which you can put a particle emitter, which makes particles come out - of nothing. These emitters are quite flexible and usually have lots of - parameters like direction, amount, and color of the particles they - create. - - There are different emitters, for example a point emitter which lets - particles pop out at a fixed point. If the particle emitters available - in the engine are not enough for you, you can easily create your own - ones, you'll simply have to create a class derived from the - IParticleEmitter interface and attach it to the particle system using - setEmitter(). In this example we create a box particle emitter, which - creates particles randomly inside a box. The parameters define the box, - direction of the particles, minimal and maximal new particles per - second, color, and minimal and maximal lifetime of the particles. - - Because only with emitters particle system would be a little bit - boring, there are particle affectors which modify particles while - they fly around. Affectors can be added to a particle system for - simulating additional effects like gravity or wind. - The particle affector we use in this example is an affector which - modifies the color of the particles: It lets them fade out. Like the - particle emitters, additional particle affectors can also be - implemented by you, simply derive a class from IParticleAffector and - add it with addAffector(). - - After we set a nice material to the particle system, we have a cool - looking camp fire. By adjusting material, texture, particle emitter, - and affector parameters, it is also easily possible to create smoke, - rain, explosions, snow, and so on. - */ - - // create a particle system - - scene::IParticleSystemSceneNode* ps = - smgr->addParticleSystemSceneNode(false); - - if (ps) - { - scene::IParticleEmitter* em = ps->createBoxEmitter( - core::aabbox3d(-7,0,-7,7,1,7), // emitter size - core::vector3df(0.0f,0.06f,0.0f), // initial direction - 80,100, // emit rate - video::SColor(0,255,255,255), // darkest color - video::SColor(0,255,255,255), // brightest color - 800,2000,0, // min and max age, angle - core::dimension2df(10.f,10.f), // min size - core::dimension2df(20.f,20.f)); // max size - - ps->setEmitter(em); // this grabs the emitter - em->drop(); // so we can drop it here without deleting it - - scene::IParticleAffector* paf = ps->createFadeOutParticleAffector(); - - ps->addAffector(paf); // same goes for the affector - paf->drop(); - - ps->setPosition(core::vector3df(-70,60,40)); - ps->setScale(core::vector3df(2,2,2)); - ps->setMaterialFlag(video::EMF_LIGHTING, false); - ps->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - ps->setMaterialTexture(0, driver->getTexture(mediaPath + "fire.bmp")); - ps->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - } - - /* - Next we add a volumetric light node, which adds a glowing fake area light to - the scene. Like with the billboards and particle systems we also assign a - texture for the desired effect, though this time we'll use a texture animator - to create the illusion of a magical glowing area effect. - */ - scene::IVolumeLightSceneNode * n = smgr->addVolumeLightSceneNode(0, -1, - 32, // Subdivisions on U axis - 32, // Subdivisions on V axis - video::SColor(0, 255, 255, 255), // foot color - video::SColor(0, 0, 0, 0)); // tail color - - if (n) - { - n->setScale(core::vector3df(56.0f, 56.0f, 56.0f)); - n->setPosition(core::vector3df(-120,50,40)); - - // load textures for animation - core::array textures; - for (s32 g=7; g > 0; --g) - { - core::stringc tmp(mediaPath); - tmp += "portal"; - tmp += g; - tmp += ".bmp"; - video::ITexture* t = driver->getTexture( tmp.c_str() ); - textures.push_back(t); - } - - // create texture animator - scene::ISceneNodeAnimator* glow = smgr->createTextureAnimator(textures, 150); - - // add the animator - n->addAnimator(glow); - - // drop the animator because it was created with a create() function - glow->drop(); - } - - /* - As our last special effect, we want a dynamic shadow be cast from an - animated character. For this we load a DirectX .x model and place it - into our world. For creating the shadow, we simply need to call - addShadowVolumeSceneNode(). The color of shadows is only adjustable - globally for all shadows, by calling ISceneManager::setShadowColor(). - Voila, here is our dynamic shadow. - - Because the character is a little bit too small for this scene, we make - it bigger using setScale(). And because the character is lighted by a - dynamic light, we need to normalize the normals to make the lighting on - it correct. This is always necessary if the scale of a dynamic lighted - model is not (1,1,1). Otherwise it would get too dark or too bright - because the normals will be scaled too. - */ - - // add animated character - - mesh = smgr->getMesh(mediaPath + "dwarf.x"); - scene::IAnimatedMeshSceneNode* anode = 0; - - anode = smgr->addAnimatedMeshSceneNode(mesh); - anode->setPosition(core::vector3df(-50,20,-60)); - anode->setAnimationSpeed(15); - - /* - Shadows still have to be drawn even then the node causing them is not visible itself. - We have to disable culling if the node is animated or it's transformations change - as otherwise the shadow is not updated correctly. - If you have many objects and this becomes a speed problem you will have to figure - out some manual culling (for exampling hiding all objects beyond a certain distance). - */ - anode->setAutomaticCulling(scene::EAC_OFF); - - // add shadow - anode->addShadowVolumeSceneNode(); - smgr->setShadowColor(video::SColor(150,0,0,0)); - - // make the model a bit bigger - anode->setScale(core::vector3df(2,2,2)); - // because of the scaling we have to normalize its normals for correct lighting - anode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); - - // let the dwarf slowly rotate around it's y axis - scene::ISceneNodeAnimator* ra = smgr->createRotationAnimator(irr::core::vector3df(0, 0.1f, 0)); - anode->addAnimator(ra); - ra->drop(); - - /* - Finally we simply have to draw everything, that's all. - */ - - scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(); - camera->setPosition(core::vector3df(-50,50,-150)); - camera->setFarValue(10000.0f); // this increase a shadow visible range. - - // disable mouse cursor - device->getCursorControl()->setVisible(false); - - s32 lastFPS = -1; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0)); - - smgr->drawAll(); - - driver->endScene(); - - const s32 fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw str = L"Irrlicht Engine - SpecialFX example ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/08.SpecialFX/project.properties b/examples/08.SpecialFX/project.properties deleted file mode 100644 index 6f9611b1..00000000 --- a/examples/08.SpecialFX/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt - -# Project target. -target=android-10 diff --git a/examples/08.SpecialFX/tutorial.html b/examples/08.SpecialFX/tutorial.html deleted file mode 100644 index 8c1fc51a..00000000 --- a/examples/08.SpecialFX/tutorial.html +++ /dev/null @@ -1,278 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 8. Special Effects
-
-
-
-

This tutorials describes how to do special effects. It shows how to - use stencil buffer shadows, the particle system, billboards, dynamic - light and the water surface scene node.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
Lets start!
-
-

We start like in some tutorials before. Please note that this time, - the 'shadows' flag in createDevice() is set to true, for we want to - have a dynamic shadow casted from an animated character. If your this - example runs to slow, set it to false. The Irrlicht Engine checks - if your hardware doesn't support the stencil buffer, and disables - shadows by itself, but just in case the demo runs slow on your hardware.

- - - - -
#include <irrlicht.h>
-#include <iostream>
-
using namespace irr; - -#pragma comment(lib, "Irrlicht.lib") - -int main() -{ - // ask user for driver
video::E_DRIVER_TYPE driverType;
- printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
} - - // create device and exit if creation failed
IrrlichtDevice *device = createDevice(driverType, - core::dimension2d<s32>(640, 480), 16, false, true); - - if (device == 0) - return 1; - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); -
-
-

For our environment, we load a .3ds file. It is a small room I modelled - with Anim8or and exported it into the 3ds format because the Irrlicht - Engine did not support the .an8 format when I wrote this tutorial. - I am a very bad 3d graphic artist, and so the texture mapping is not - very nice in this model. Luckily I am a better programmer than artist, - and so the Irrlicht Engine is able to create a cool texture mapping - for me: Just use the mesh manipulator and create a planar texture - mapping for the mesh. If you want to see the mapping I made with Anim8or, - uncomment this line. I also did not figure out how to
- set the material right in Anim8or, it has a specular light color - which I don't really
- like. I'll switch it off too with this code.

- - - - -
	scene::IAnimatedMesh* mesh = smgr->getMesh(
-		"../../media/room.3ds");
-
-	smgr->getMeshManipulator()->makePlanarTextureMapping(
-		mesh->getMesh(0), 0.008f);
-
-	scene::ISceneNode* node = 0;
-
-	node = smgr->addAnimatedMeshSceneNode(mesh);
-	node->setMaterialTexture(0,	driver->getTexture("../../media/wall.jpg"));
-	node->getMaterial(0).SpecularColor.set(0,0,0,0);
-

Now, for the first special effect: Animated water. It works like - this: The WaterSurfaceSceneNode takes a mesh as input and makes it - wave like a water surface. And if we let this scene node use a nice - material like the MT_REFLECTION_2_LAYER, it looks really cool. We - are doing this with the next few lines of code. As input mesh, we - create a hill plane mesh, without hills. But any other mesh could - be used for this, you could even use the room.3ds (which would look - really strange) if you wanted to.

- - - - -
	mesh = smgr->addHillPlaneMesh("myHill",
-		core::dimension2d<f32>(20,20),
-		core::dimension2d<s32>(40,40), 0, 0,
-		core::dimension2d<f32>(0,0),
-		core::dimension2d<f32>(10,10));
-
-	node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0), 3.0f, 300.0f, 30.0f);
-	node->setPosition(core::vector3df(0,7,0));
-
-	node->setMaterialTexture(0,	driver->getTexture("../../media/stones.jpg"));
-	node->setMaterialTexture(1,	driver->getTexture("../../media/water.jpg"));
-
-	node->setMaterialType(video::EMT_REFLECTION_2_LAYER);
-
-

The second special effect is very basic, I bet you saw it already - in some Irrlicht Engine demos: A transparent billboard combined with - a dynamic light. We simply create a light scene node, let it fly around, - an to make it look more cool, we attach a billboard scene node to - it.

- - - - -
	// create light
-
-	node = smgr->addLightSceneNode(0, core::vector3df(0,0,0), 
-		video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 600.0f);
-	scene::ISceneNodeAnimator* anim = 0;
-	anim = smgr->createFlyCircleAnimator (core::vector3df(0,150,0),250.0f);
-	node->addAnimator(anim);
-	anim->drop();
-
-	// attach billboard to light
-
-	node = smgr->addBillboardSceneNode(node, core::dimension2d<f32>(50, 50));
-	node->setMaterialFlag(video::EMF_LIGHTING, false);
-	node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
-	node->setMaterialTexture(0,	driver->getTexture("../../media/particlewhite.bmp"));
-
-
-

The next special effect is a lot more interesting: A particle system. - The particle system in the Irrlicht Engine is quit modular and extensible - and yet easy to use. There is a particle system scene node into which - you can put particle emitters, which make particles come out of nothing. - These emitters are quite flexible and usually have lots of parameters - like direction, amount and color of the particles they should create.
- There are different emitters, for example a point emitter which lets - particles pop out at a fixed point. If the particle emitters available - in the engine are not enough for you, you can easily create your own - ones, you'll simply have to create a class derived from the IParticleEmitter - interface and attach it to the particle system using setEmitter().
- In this example we create a box particle emitter, which creates particles - randomly inside a box. The parameters define the box, direction of - the particles, minimal and maximal new particles per second, color - and minimal and maximal livetime of the particles.

-

Because only with emitters particle system would be a little bit - boring, there are particle affectors, which modify particles during - they fly around. They can be added to the particle system, simulating - additional effects like gravity or wind. The particle affector we - use in this example is an affector, which modifies the color of the - particles: It lets them fade out. Like the particle emitters, additional - particle affectors can also be implemented by you, simply derive a - class from IParticleAffector and add it with addAffector(). After - we set a nice material to the particle system, we have a cool looking - camp fire. By adjusting material, texture, particle emitter and affector - parameters, it is also easily possible to create smoke, rain, explosions, - snow, and so on.
-

-
- - - - -
	scene::IParticleSystemSceneNode* ps = 0;
-	ps = smgr->addParticleSystemSceneNode(false);
-	ps->setPosition(core::vector3df(-70,60,40));
-	ps->setScale(core::vector3df(2,2,2));
-
-	ps->setParticleSize(core::dimension2d<f32>(20.0f, 10.0f));
-
-	scene::IParticleEmitter* em = ps->createBoxEmitter(
-		core::aabbox3d<f32>(-7,0,-7,7,1,7), 
-		core::vector3df(0.0f,0.03f,0.0f),
-		80,100, 
-		video::SColor(0,255,255,255), video::SColor(0,255,255,255),
-		800,2000);
-
-	ps->setEmitter(em);
-	em->drop();
-
-	scene::IParticleAffector* paf = 
-		ps->createFadeOutParticleAffector();
-
-	ps->addAffector(paf);
-	paf->drop();
-
-	ps->setMaterialFlag(video::EMF_LIGHTING, false);
-	ps->setMaterialTexture(0, driver->getTexture("../../media/particle.bmp"));
-	ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
-

As our last special effect, we want a dynamic shadow be casted from - an animated character. For this we load a DirectX .x model and place - it into our world. For creating the shadow, we simply need to call addShadowVolumeSceneNode(). - The color of shadows is only adjustable globally for all shadows, by - calling ISceneManager::setShadowColor(). Voila, here is our dynamic - shadow.
- Because the character is a little bit too small for this scene, we make - it bigger using setScale(). And because the character is lighted by - a dynamic light, we need to normalize the normals to make the lighting - on it correct. This is always necessary if the scale of a dynamic lighted - model is not (1,1,1). Otherwise it would get too dark or too bright - because the normals will be scaled too.

- - - - -
	mesh = smgr->getMesh("../../media/dwarf.x");
-	scene::IAnimatedMeshSceneNode* anode = 0;
-
-	anode = smgr->addAnimatedMeshSceneNode(mesh);
-	anode->setPosition(core::vector3df(-50,20,-60));
-	anode->setAnimationSpeed(15);
-
-	// add shadow
-	anode->addShadowVolumeSceneNode();	
-	smgr->setShadowColor(video::SColor(220,0,0,0));
-
-	// make the model a little bit bigger and normalize its normals 
// because of this for correct lighting

anode->setScale(core::vector3df(2,2,2));
anode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true);

-

Finally we simply have to draw everything, that's all.

- - - - -
	scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
-	camera->setPosition(core::vector3df(-50,50,-150));
-
-
-	int lastFPS = -1;
-
-	while(device->run())
-	{
-		driver->beginScene(true, true, 0);
-
-		smgr->drawAll();
-
-		driver->endScene();
-
-		int fps = driver->getFPS();
-
-		if (lastFPS != fps)
-		{
-		  core::stringw str = L"Irrlicht Engine - SpecialFX example [";
str += driver->getName();
str += "] FPS:";
str += fps;

device->setWindowCaption(str.c_str());
lastFPS = fps;
} - } - - device->drop(); - - return 0; -} - -
-
-

 

-

 

-

 

-
-
-

 

- - diff --git a/examples/09.Meshviewer/9.Meshviewer.rc b/examples/09.Meshviewer/9.Meshviewer.rc deleted file mode 100644 index 32085837..00000000 --- a/examples/09.Meshviewer/9.Meshviewer.rc +++ /dev/null @@ -1,84 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// German (Austria) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEA) -#ifdef _WIN32 -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICON1 ICON "icon.ico" -#endif // German (Austria) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/examples/09.Meshviewer/Makefile b/examples/09.Meshviewer/Makefile deleted file mode 100644 index e90ab524..00000000 --- a/examples/09.Meshviewer/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 09.Meshviewer -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/09.Meshviewer/Meshviewer.cbp b/examples/09.Meshviewer/Meshviewer.cbp deleted file mode 100644 index be11327b..00000000 --- a/examples/09.Meshviewer/Meshviewer.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/09.Meshviewer/Meshviewer.vcproj b/examples/09.Meshviewer/Meshviewer.vcproj deleted file mode 100644 index 4077b860..00000000 --- a/examples/09.Meshviewer/Meshviewer.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/09.Meshviewer/Meshviewer.xcodeproj/project.pbxproj b/examples/09.Meshviewer/Meshviewer.xcodeproj/project.pbxproj deleted file mode 100644 index e9137d14..00000000 --- a/examples/09.Meshviewer/Meshviewer.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 09.Meshviewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 09.Meshviewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 09.Meshviewer.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 09.Meshviewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "09.Meshviewer" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 09.Meshviewer; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 09.Meshviewer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Meshviewer" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 09.Meshviewer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Meshviewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "09.Meshviewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/09.Meshviewer/Meshviewer.xcodeproj/xcshareddata/xcschemes/09.Meshviewer.xcscheme b/examples/09.Meshviewer/Meshviewer.xcodeproj/xcshareddata/xcschemes/09.Meshviewer.xcscheme deleted file mode 100644 index 0625d5ee..00000000 --- a/examples/09.Meshviewer/Meshviewer.xcodeproj/xcshareddata/xcschemes/09.Meshviewer.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/09.Meshviewer/Meshviewer_vc10.vcxproj b/examples/09.Meshviewer/Meshviewer_vc10.vcxproj deleted file mode 100644 index eb918ccd..00000000 --- a/examples/09.Meshviewer/Meshviewer_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 09.Meshviewer - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06} - Meshviewer - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/09.Meshviewer/Meshviewer_vc11.vcxproj b/examples/09.Meshviewer/Meshviewer_vc11.vcxproj deleted file mode 100644 index eb918ccd..00000000 --- a/examples/09.Meshviewer/Meshviewer_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 09.Meshviewer - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06} - Meshviewer - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/09.Meshviewer/Meshviewer_vc12.vcxproj b/examples/09.Meshviewer/Meshviewer_vc12.vcxproj deleted file mode 100644 index effddf22..00000000 --- a/examples/09.Meshviewer/Meshviewer_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 09.Meshviewer - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06} - Meshviewer - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/09.Meshviewer/Meshviewer_vc14.vcxproj b/examples/09.Meshviewer/Meshviewer_vc14.vcxproj deleted file mode 100644 index f96053dd..00000000 --- a/examples/09.Meshviewer/Meshviewer_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 09.Meshviewer - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06} - Meshviewer - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Meshviewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Meshviewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\09.MeshViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/09.Meshviewer/icon.ico b/examples/09.Meshviewer/icon.ico deleted file mode 100644 index 49f8eabb414adaa1687bc1135a40c43e39ba5971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmc(gKWHOI6o;R|uto^|u_RXxI8GDSQ@IOXSCI{ufNOWtZRf*Sq;TarIAEAmDw2>C z*}|Ysg{v##sqH4NTpWlMyDKfokYe)9=wh7XxOBOZW_IWIX5R1HH!E9Yh0oTOg!b#2 z$Od;`(zobe(N_e~x7Fn(j4O=3hjuQ)SI*Cu7e;R7=H^Cj{=AXmk6&bUbye2Z)}&sq zOS|2cjg1Z2+}xDy?QPlF*^#58BRM=gl)b$@+1=fh^Y5IzdgbH?xf7RJd2^S`-P^bF z{cpcxr0AM%=yo|(XbMfCDX+QZ5{<6WHM&OE=zg0)H|U0mK{x1J#G+eti*6Atx?}E` zI~$x8qrzX2NU=$YlVH!FU{Ek97!(Wv2?hm&fRtB3I+v3K!-uWpkPoi zC>WGOgG0fgJco0k0w`Sl$IvYu-9Iuc8gq@2CaH!cl!2h;M#G|E31xvp!=d5OaA-I} zso>BsXc#mMzH}N64TFZk;^i1a3GrEen1}NE>Oh6JVO1zK-UcRvslmX&Wbifw4M_~% z2Jdhj!5bZagTKMwACbY|P#Xh-fx%D*e{57GJUt3mMt_Xdz~X0Nvv64a!qIvTYGC28 zo`VMq$IT`Si-pAkVKEG^04$b`mPHo9!ortM9?rzVVtqXVi+>yZDWJjNU~n)v7#s`^ zhVVMUU}11DI2bGpq@lAO1_y(K!NEXkIywvv1_y%!z~OI6=Gf?1q{*R~YdBoU?bm4e zTz;10<6}8JJ(Y`#3%RkYtd~libXSvY7^ouA7_z|N0oD()@6Nt zTvg+usCBbN`vY;Gmo^Ip{Xo3g8M`VUm$gY=#4qBw`22a&$fB%~jo#-A&5z3|Bu^(dD9;gE;roag^tIH2JUkHP_#7-S|ao#OeD@ z*Z3ds{MN*yMLHU>hQVLb(fW4(px6gX(CxhY8ob>mb4fcn4I-Y0C6yvnFe>U`O;8)Z`oB~uiabJk6_w_RV zoZ~T*=&C_>$-hVJ0oIU%e;aoi*`5k-*uf2DRM}%)Q yO{b&jbm|{HTzdQce!u6VA?|DPucklyVtZK~A8))U_VTv*T-*QShCc_NwEYe2vp9 -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; -using namespace gui; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - - -/* -Some global variables used later on -*/ -IrrlichtDevice *Device = 0; -io::path StartUpModelFile; -core::stringw MessageText; -core::stringw Caption; -scene::ISceneNode* Model = 0; -scene::ISceneNode* SkyBox = 0; -bool Octree=false; -bool UseLight=false; - -scene::ICameraSceneNode* Camera[2] = {0, 0}; - -// Values used to identify individual GUI elements -enum -{ - GUI_ID_DIALOG_ROOT_WINDOW = 0x10000, - - GUI_ID_X_SCALE, - GUI_ID_Y_SCALE, - GUI_ID_Z_SCALE, - - GUI_ID_OPEN_MODEL, - GUI_ID_SET_MODEL_ARCHIVE, - GUI_ID_LOAD_AS_OCTREE, - - GUI_ID_SKY_BOX_VISIBLE, - GUI_ID_TOGGLE_DEBUG_INFO, - - GUI_ID_DEBUG_OFF, - GUI_ID_DEBUG_BOUNDING_BOX, - GUI_ID_DEBUG_NORMALS, - GUI_ID_DEBUG_SKELETON, - GUI_ID_DEBUG_WIRE_OVERLAY, - GUI_ID_DEBUG_HALF_TRANSPARENT, - GUI_ID_DEBUG_BUFFERS_BOUNDING_BOXES, - GUI_ID_DEBUG_ALL, - - GUI_ID_MODEL_MATERIAL_SOLID, - GUI_ID_MODEL_MATERIAL_TRANSPARENT, - GUI_ID_MODEL_MATERIAL_REFLECTION, - - GUI_ID_CAMERA_MAYA, - GUI_ID_CAMERA_FIRST_PERSON, - - GUI_ID_POSITION_TEXT, - - GUI_ID_ABOUT, - GUI_ID_QUIT, - - GUI_ID_TEXTUREFILTER, - GUI_ID_SKIN_TRANSPARENCY, - GUI_ID_SKIN_ANIMATION_FPS, - - GUI_ID_BUTTON_SET_SCALE, - GUI_ID_BUTTON_SCALE_MUL10, - GUI_ID_BUTTON_SCALE_DIV10, - GUI_ID_BUTTON_OPEN_MODEL, - GUI_ID_BUTTON_SHOW_ABOUT, - GUI_ID_BUTTON_SHOW_TOOLBOX, - GUI_ID_BUTTON_SELECT_ARCHIVE, - - GUI_ID_ANIMATION_INFO, - - // And some magic numbers - MAX_FRAMERATE = 80, - DEFAULT_FRAMERATE = 30 -}; - - -/* -Toggle between various cameras -*/ -void setActiveCamera(scene::ICameraSceneNode* newActive) -{ - if (0 == Device) - return; - - scene::ICameraSceneNode * active = Device->getSceneManager()->getActiveCamera(); - active->setInputReceiverEnabled(false); - - newActive->setInputReceiverEnabled(true); - Device->getSceneManager()->setActiveCamera(newActive); -} - -/* - Set the skin transparency by changing the alpha values of all skin-colors -*/ -void setSkinTransparency(s32 alpha, irr::gui::IGUISkin * skin) -{ - for (s32 i=0; igetColor((EGUI_DEFAULT_COLOR)i); - col.setAlpha(alpha); - skin->setColor((EGUI_DEFAULT_COLOR)i, col); - } -} - -/* - Update the display of the model scaling -*/ -void updateScaleInfo(scene::ISceneNode* model) -{ - IGUIElement* toolboxWnd = Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId(GUI_ID_DIALOG_ROOT_WINDOW, true); - if (!toolboxWnd) - return; - if (!model) - { - toolboxWnd->getElementFromId(GUI_ID_X_SCALE, true)->setText( L"-" ); - toolboxWnd->getElementFromId(GUI_ID_Y_SCALE, true)->setText( L"-" ); - toolboxWnd->getElementFromId(GUI_ID_Z_SCALE, true)->setText( L"-" ); - } - else - { - core::vector3df scale = model->getScale(); - toolboxWnd->getElementFromId(GUI_ID_X_SCALE, true)->setText( core::stringw(scale.X).c_str() ); - toolboxWnd->getElementFromId(GUI_ID_Y_SCALE, true)->setText( core::stringw(scale.Y).c_str() ); - toolboxWnd->getElementFromId(GUI_ID_Z_SCALE, true)->setText( core::stringw(scale.Z).c_str() ); - } -} - -/* -Function showAboutText() displays a messagebox with a caption and -a message text. The texts will be stored in the MessageText and Caption -variables at startup. -*/ -void showAboutText() -{ - // create modal message box with the text - // loaded from the xml file. - Device->getGUIEnvironment()->addMessageBox( - Caption.c_str(), MessageText.c_str()); -} - - -/* -Function loadModel() loads a model and displays it using an -addAnimatedMeshSceneNode and the scene manager. Nothing difficult. It also -displays a short message box, if the model could not be loaded. -*/ -void loadModel(const io::path& filename) -{ - io::path extension; - core::getFileNameExtension(extension, filename); - extension.make_lower(); - - // if a texture is loaded apply it to the current model.. - if (extension == ".jpg" || extension == ".pcx" || - extension == ".png" || extension == ".ppm" || - extension == ".pgm" || extension == ".pbm" || - extension == ".psd" || extension == ".tga" || - extension == ".bmp" || extension == ".wal" || - extension == ".rgb" || extension == ".rgba") - { - // Ensure reloading texture by clearing old one out of cache - video::ITexture * texture = Device->getVideoDriver()->findTexture( filename ); - if ( texture ) - Device->getVideoDriver()->removeTexture(texture); - - // Load the new one and put int on the model - texture = Device->getVideoDriver()->getTexture( filename ); - if ( texture && Model ) - { - Model->setMaterialTexture(0, texture); - } - return; - } - // if a archive is loaded add it to the FileArchive.. - else if (extension == ".pk3" || extension == ".zip" || extension == ".pak" || extension == ".npk") - { - Device->getFileSystem()->addFileArchive(filename.c_str()); - return; - } - - // Remove old model - - if (Model) - { - Model->remove(); - Model = 0; - } - - // .irr is a scene format, so load as scene and set Model pointer to first object in the scene - - if (extension==".irr") - { - core::array outNodes; - Device->getSceneManager()->loadScene(filename); - Device->getSceneManager()->getSceneNodesFromType(scene::ESNT_ANIMATED_MESH, outNodes); - if (outNodes.size()) - Model = outNodes[0]; - return; - } - - // load a model into the engine. Also log the time it takes to load it. - - u32 then = Device->getTimer()->getRealTime(); - scene::IAnimatedMesh* mesh = Device->getSceneManager()->getMesh( filename.c_str() ); - Device->getLogger()->log("Loading time (ms): ", core::stringc(Device->getTimer()->getRealTime() - then).c_str()); - - if (!mesh) - { - // model could not be loaded - - if (StartUpModelFile != filename) - Device->getGUIEnvironment()->addMessageBox( - Caption.c_str(), L"The model could not be loaded. " \ - L"Maybe it is not a supported file format."); - return; - } - - // set default material properties - - if (Octree) - Model = Device->getSceneManager()->addOctreeSceneNode(mesh->getMesh(0)); - else - { - scene::IAnimatedMeshSceneNode* animModel = Device->getSceneManager()->addAnimatedMeshSceneNode(mesh); - Model = animModel; - } - Model->setMaterialFlag(video::EMF_LIGHTING, UseLight); - Model->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, UseLight); -// Model->setMaterialFlag(video::EMF_BACK_FACE_CULLING, false); - Model->setDebugDataVisible(scene::EDS_OFF); - - // we need to uncheck the menu entries. would be cool to fake a menu event, but - // that's not so simple. so we do it brute force - gui::IGUIContextMenu* menu = (gui::IGUIContextMenu*)Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId(GUI_ID_TOGGLE_DEBUG_INFO, true); - if (menu) - for(int item = 1; item < 6; ++item) - menu->setItemChecked(item, false); - updateScaleInfo(Model); -} - - -/* -Function createToolBox() creates a toolbox window. In this simple mesh -viewer, this toolbox only contains a controls to change the scale -and animation speed of the model and a control to set the transparency -of the GUI-elements. -*/ -void createToolBox() -{ - // remove tool box if already there - IGUIEnvironment* env = Device->getGUIEnvironment(); - IGUIElement* root = env->getRootGUIElement(); - IGUIElement* e = root->getElementFromId(GUI_ID_DIALOG_ROOT_WINDOW, true); - if (e) - e->remove(); - - // create the toolbox window - IGUIWindow* wnd = env->addWindow(core::rect(600,45,800,480), - false, L"Toolset", 0, GUI_ID_DIALOG_ROOT_WINDOW); - - // create tab control and tabs - IGUITabControl* tab = env->addTabControl( - core::rect(2,20,800-602,480-7), wnd, true, true); - - IGUITab* t1 = tab->addTab(L"Config"); - - // add some edit boxes and a button to tab one - env->addStaticText(L"Scale:", - core::rect(10,20,60,45), false, false, t1); - env->addStaticText(L"X:", core::rect(22,48,40,66), false, false, t1); - env->addEditBox(L"1.0", core::rect(40,46,130,66), true, t1, GUI_ID_X_SCALE); - env->addStaticText(L"Y:", core::rect(22,82,40,96), false, false, t1); - env->addEditBox(L"1.0", core::rect(40,76,130,96), true, t1, GUI_ID_Y_SCALE); - env->addStaticText(L"Z:", core::rect(22,108,40,126), false, false, t1); - env->addEditBox(L"1.0", core::rect(40,106,130,126), true, t1, GUI_ID_Z_SCALE); - - env->addButton(core::rect(10,134,85,165), t1, GUI_ID_BUTTON_SET_SCALE, L"Set"); - - // quick scale buttons - env->addButton(core::rect(65,20,95,40), t1, GUI_ID_BUTTON_SCALE_MUL10, L"* 10"); - env->addButton(core::rect(100,20,130,40), t1, GUI_ID_BUTTON_SCALE_DIV10, L"* 0.1"); - - updateScaleInfo(Model); - - // add transparency control - env->addStaticText(L"GUI Transparency Control:", - core::rect(10,200,150,225), true, false, t1); - IGUIScrollBar* scrollbar = env->addScrollBar(true, - core::rect(10,225,150,240), t1, GUI_ID_SKIN_TRANSPARENCY); - scrollbar->setMax(255); - scrollbar->setPos(255); - - // add framerate control - env->addStaticText(L":", core::rect(10,240,150,265), true, false, t1); - env->addStaticText(L"Framerate:", - core::rect(12,240,75,265), false, false, t1); - // current frame info - env->addStaticText(L"", core::rect(75,240,200,265), false, false, t1, - GUI_ID_ANIMATION_INFO); - scrollbar = env->addScrollBar(true, - core::rect(10,265,150,280), t1, GUI_ID_SKIN_ANIMATION_FPS); - scrollbar->setMax(MAX_FRAMERATE); - scrollbar->setMin(-MAX_FRAMERATE); - scrollbar->setPos(DEFAULT_FRAMERATE); - scrollbar->setSmallStep(1); -} - -/* -Function updateToolBox() is called each frame to update dynamic information in -the toolbox. -*/ -void updateToolBox() -{ - IGUIEnvironment* env = Device->getGUIEnvironment(); - IGUIElement* root = env->getRootGUIElement(); - IGUIElement* dlg = root->getElementFromId(GUI_ID_DIALOG_ROOT_WINDOW, true); - if (!dlg ) - return; - - // update the info we have about the animation of the model - IGUIStaticText * aniInfo = (IGUIStaticText *)(dlg->getElementFromId(GUI_ID_ANIMATION_INFO, true)); - if (aniInfo) - { - if ( Model && scene::ESNT_ANIMATED_MESH == Model->getType() ) - { - scene::IAnimatedMeshSceneNode* animatedModel = (scene::IAnimatedMeshSceneNode*)Model; - - core::stringw str( (s32)core::round_(animatedModel->getAnimationSpeed()) ); - str += L" Frame: "; - str += core::stringw((s32)animatedModel->getFrameNr()); - aniInfo->setText(str.c_str()); - } - else - aniInfo->setText(L""); - } -} - -void onKillFocus() -{ - // Avoid that the FPS-camera continues moving when the user presses alt-tab while - // moving the camera. - const core::list& animators = Camera[1]->getAnimators(); - core::list::ConstIterator iter = animators.begin(); - while ( iter != animators.end() ) - { - if ( (*iter)->getType() == scene::ESNAT_CAMERA_FPS ) - { - // we send a key-down event for all keys used by this animator - scene::ISceneNodeAnimatorCameraFPS * fpsAnimator = static_cast(*iter); - const core::array& keyMap = fpsAnimator->getKeyMap(); - for ( irr::u32 i=0; i< keyMap.size(); ++i ) - { - irr::SEvent event; - event.EventType = EET_KEY_INPUT_EVENT; - event.KeyInput.Key = keyMap[i].KeyCode; - event.KeyInput.PressedDown = false; - fpsAnimator->OnEvent(event); - } - } - ++iter; - } -} - -/* -Function hasModalDialog() checks if we currently have a modal dialog open. -*/ -bool hasModalDialog() -{ - if ( !Device ) - return false; - IGUIEnvironment* env = Device->getGUIEnvironment(); - IGUIElement * focused = env->getFocus(); - while ( focused ) - { - if ( focused->isVisible() && focused->hasType(EGUIET_MODAL_SCREEN) ) - return true; - focused = focused->getParent(); - } - return false; -} - -/* -To get all the events sent by the GUI Elements, we need to create an event -receiver. This one is really simple. If an event occurs, it checks the id of -the caller and the event type, and starts an action based on these values. For -example, if a menu item with id GUI_ID_OPEN_MODEL was selected, it opens a file-open-dialog. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - virtual bool OnEvent(const SEvent& event) - { - // Key events - if (event.EventType == EET_KEY_INPUT_EVENT && - event.KeyInput.PressedDown == false) - { - if ( OnKeyUp(event.KeyInput.Key) ) - return true; - } - - // GUI events - if (event.EventType == EET_GUI_EVENT) - { - s32 id = event.GUIEvent.Caller->getID(); - IGUIEnvironment* env = Device->getGUIEnvironment(); - - switch(event.GUIEvent.EventType) - { - case EGET_MENU_ITEM_SELECTED: - // a menu item was clicked - OnMenuItemSelected( (IGUIContextMenu*)event.GUIEvent.Caller ); - break; - - case EGET_FILE_SELECTED: - { - // load the model file, selected in the file open dialog - IGUIFileOpenDialog* dialog = - (IGUIFileOpenDialog*)event.GUIEvent.Caller; - loadModel(dialog->getFileNameP()); - } - break; - - case EGET_SCROLL_BAR_CHANGED: - - // control skin transparency - if (id == GUI_ID_SKIN_TRANSPARENCY) - { - const s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); - setSkinTransparency(pos, env->getSkin()); - } - // control animation speed - else if (id == GUI_ID_SKIN_ANIMATION_FPS) - { - const s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); - if (scene::ESNT_ANIMATED_MESH == Model->getType()) - ((scene::IAnimatedMeshSceneNode*)Model)->setAnimationSpeed((f32)pos); - } - break; - - case EGET_COMBO_BOX_CHANGED: - - // control anti-aliasing/filtering - if (id == GUI_ID_TEXTUREFILTER) - { - OnTextureFilterSelected( (IGUIComboBox*)event.GUIEvent.Caller ); - } - break; - - case EGET_BUTTON_CLICKED: - - switch(id) - { - case GUI_ID_BUTTON_SET_SCALE: - { - // set model scale - gui::IGUIElement* root = env->getRootGUIElement(); - core::vector3df scale; - core::stringc s; - - s = root->getElementFromId(GUI_ID_X_SCALE, true)->getText(); - scale.X = (f32)atof(s.c_str()); - s = root->getElementFromId(GUI_ID_Y_SCALE, true)->getText(); - scale.Y = (f32)atof(s.c_str()); - s = root->getElementFromId(GUI_ID_Z_SCALE, true)->getText(); - scale.Z = (f32)atof(s.c_str()); - - if (Model) - Model->setScale(scale); - updateScaleInfo(Model); - } - break; - case GUI_ID_BUTTON_SCALE_MUL10: - if (Model) - Model->setScale(Model->getScale()*10.f); - updateScaleInfo(Model); - break; - case GUI_ID_BUTTON_SCALE_DIV10: - if (Model) - Model->setScale(Model->getScale()*0.1f); - updateScaleInfo(Model); - break; - case GUI_ID_BUTTON_OPEN_MODEL: - env->addFileOpenDialog(L"Please select a model file to open"); - break; - case GUI_ID_BUTTON_SHOW_ABOUT: - showAboutText(); - break; - case GUI_ID_BUTTON_SHOW_TOOLBOX: - createToolBox(); - break; - case GUI_ID_BUTTON_SELECT_ARCHIVE: - env->addFileOpenDialog(L"Please select your game archive/directory"); - break; - } - - break; - default: - break; - } - } - - return false; - } - - - /* - Handle key-up events - */ - bool OnKeyUp(irr::EKEY_CODE keyCode) - { - // Don't handle keys if we have a modal dialog open as it would lead - // to unexpected application behaviour for the user. - if ( hasModalDialog() ) - return false; - - // Escape swaps Camera Input - if (keyCode == irr::KEY_ESCAPE) - { - if (Device) - { - scene::ICameraSceneNode * camera = - Device->getSceneManager()->getActiveCamera(); - if (camera) - { - camera->setInputReceiverEnabled( !camera->isInputReceiverEnabled() ); - } - return true; - } - } - else if (keyCode == irr::KEY_F1) - { - // Swap display of position information about the camera - if (Device) - { - IGUIElement* elem = Device->getGUIEnvironment()->getRootGUIElement()->getElementFromId(GUI_ID_POSITION_TEXT); - if (elem) - elem->setVisible(!elem->isVisible()); - } - } - else if (keyCode == irr::KEY_KEY_M) - { - if (Device) - Device->minimizeWindow(); - } - else if (keyCode == irr::KEY_KEY_L) - { - UseLight=!UseLight; - if (Model) - { - Model->setMaterialFlag(video::EMF_LIGHTING, UseLight); - Model->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, UseLight); - } - } - return false; - } - - - /* - Handle "menu item clicked" events. - */ - void OnMenuItemSelected( IGUIContextMenu* menu ) - { - s32 id = menu->getItemCommandId(menu->getSelectedItem()); - IGUIEnvironment* env = Device->getGUIEnvironment(); - - switch(id) - { - case GUI_ID_OPEN_MODEL: // File -> Open Model File & Texture - env->addFileOpenDialog(L"Please select a model file to open"); - break; - case GUI_ID_SET_MODEL_ARCHIVE: // File -> Set Model Archive - env->addFileOpenDialog(L"Please select your game archive/directory"); - break; - case GUI_ID_LOAD_AS_OCTREE: // File -> LoadAsOctree - Octree = !Octree; - menu->setItemChecked(menu->getSelectedItem(), Octree); - break; - case GUI_ID_QUIT: // File -> Quit - Device->closeDevice(); - break; - case GUI_ID_SKY_BOX_VISIBLE: // View -> Skybox - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - SkyBox->setVisible(!SkyBox->isVisible()); - break; - case GUI_ID_DEBUG_OFF: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem()+1, false); - menu->setItemChecked(menu->getSelectedItem()+2, false); - menu->setItemChecked(menu->getSelectedItem()+3, false); - menu->setItemChecked(menu->getSelectedItem()+4, false); - menu->setItemChecked(menu->getSelectedItem()+5, false); - menu->setItemChecked(menu->getSelectedItem()+6, false); - if (Model) - Model->setDebugDataVisible(scene::EDS_OFF); - break; - case GUI_ID_DEBUG_BOUNDING_BOX: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - if (Model) - Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_BBOX)); - break; - case GUI_ID_DEBUG_NORMALS: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - if (Model) - Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_NORMALS)); - break; - case GUI_ID_DEBUG_SKELETON: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - if (Model) - Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_SKELETON)); - break; - case GUI_ID_DEBUG_WIRE_OVERLAY: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - if (Model) - Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_MESH_WIRE_OVERLAY)); - break; - case GUI_ID_DEBUG_HALF_TRANSPARENT: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - if (Model) - Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_HALF_TRANSPARENCY)); - break; - case GUI_ID_DEBUG_BUFFERS_BOUNDING_BOXES: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem(), !menu->isItemChecked(menu->getSelectedItem())); - if (Model) - Model->setDebugDataVisible((scene::E_DEBUG_SCENE_TYPE)(Model->isDebugDataVisible()^scene::EDS_BBOX_BUFFERS)); - break; - case GUI_ID_DEBUG_ALL: // View -> Debug Information - menu->setItemChecked(menu->getSelectedItem()-1, true); - menu->setItemChecked(menu->getSelectedItem()-2, true); - menu->setItemChecked(menu->getSelectedItem()-3, true); - menu->setItemChecked(menu->getSelectedItem()-4, true); - menu->setItemChecked(menu->getSelectedItem()-5, true); - menu->setItemChecked(menu->getSelectedItem()-6, true); - if (Model) - Model->setDebugDataVisible(scene::EDS_FULL); - break; - case GUI_ID_ABOUT: // Help->About - showAboutText(); - break; - case GUI_ID_MODEL_MATERIAL_SOLID: // View -> Material -> Solid - if (Model) - Model->setMaterialType(video::EMT_SOLID); - break; - case GUI_ID_MODEL_MATERIAL_TRANSPARENT: // View -> Material -> Transparent - if (Model) - Model->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - break; - case GUI_ID_MODEL_MATERIAL_REFLECTION: // View -> Material -> Reflection - if (Model) - Model->setMaterialType(video::EMT_SPHERE_MAP); - break; - - case GUI_ID_CAMERA_MAYA: - setActiveCamera(Camera[0]); - break; - case GUI_ID_CAMERA_FIRST_PERSON: - setActiveCamera(Camera[1]); - break; - } - } - - /* - Handle the event that one of the texture-filters was selected in the corresponding combobox. - */ - void OnTextureFilterSelected( IGUIComboBox* combo ) - { - s32 pos = combo->getSelected(); - switch (pos) - { - case 0: - if (Model) - { - Model->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); - Model->setMaterialFlag(video::EMF_TRILINEAR_FILTER, false); - Model->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, false); - } - break; - case 1: - if (Model) - { - Model->setMaterialFlag(video::EMF_BILINEAR_FILTER, true); - Model->setMaterialFlag(video::EMF_TRILINEAR_FILTER, false); - } - break; - case 2: - if (Model) - { - Model->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); - Model->setMaterialFlag(video::EMF_TRILINEAR_FILTER, true); - } - break; - case 3: - if (Model) - { - Model->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, true); - } - break; - case 4: - if (Model) - { - Model->setMaterialFlag(video::EMF_ANISOTROPIC_FILTER, false); - } - break; - } - } -}; - - -/* -Most of the hard work is done. We only need to create the Irrlicht Engine -device and all the buttons, menus and toolbars. We start up the engine as -usual, using createDevice(). To make our application catch events, we set our -eventreceiver as parameter. As you can see, there is also a call to -IrrlichtDevice::setResizeable(). This makes the render window resizeable, which -is quite useful for a mesh viewer. -*/ -int main(int argc, char* argv[]) -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device and exit if creation failed - MyEventReceiver receiver; - Device = createDevice(driverType, core::dimension2d(800, 600), - 16, false, false, false, &receiver); - - if (Device == 0) - return 1; // could not create selected driver. - - Device->setResizable(true); - - Device->setWindowCaption(L"Irrlicht Engine - Loading..."); - - video::IVideoDriver* driver = Device->getVideoDriver(); - IGUIEnvironment* env = Device->getGUIEnvironment(); - scene::ISceneManager* smgr = Device->getSceneManager(); - smgr->getParameters()->setAttribute(scene::COLLADA_CREATE_SCENE_INSTANCES, true); - - driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true); - - smgr->addLightSceneNode(0, core::vector3df(200,200,200), - video::SColorf(1.0f,1.0f,1.0f),2000); - smgr->setAmbientLight(video::SColorf(0.3f,0.3f,0.3f)); - // add our media directory as "search path" - Device->getFileSystem()->addFileArchive(getExampleMediaPath()); - - // We can pass a model to load per command line parameter - if (argc > 1) - StartUpModelFile = argv[1]; - - // set a nicer font - IGUISkin* skin = env->getSkin(); - IGUIFont* font = env->getFont("fonthaettenschweiler.bmp"); - if (font) - skin->setFont(font); - - /* - Now create the Menu. - It is possible to create submenus for every menu item. The call - menu->addItem(L"File", -1, true, true); for example adds a new menu - Item with the name "File" and the id -1. The following parameter says - that the menu item should be enabled, and the last one says, that there - should be a submenu. The submenu can now be accessed with - menu->getSubMenu(0), because the "File" entry is the menu item with - index 0. - */ - gui::IGUIContextMenu* menu = env->addMenu(); - menu->addItem(L"File", -1, true, true); - menu->addItem(L"View", -1, true, true); - menu->addItem(L"Camera", -1, true, true); - menu->addItem(L"Help", -1, true, true); - - gui::IGUIContextMenu* submenu; - submenu = menu->getSubMenu(0); - submenu->addItem(L"Open Model File & Texture...", GUI_ID_OPEN_MODEL); - submenu->addItem(L"Set Model Archive...", GUI_ID_SET_MODEL_ARCHIVE); - submenu->addItem(L"Load as Octree", GUI_ID_LOAD_AS_OCTREE); - submenu->addSeparator(); - submenu->addItem(L"Quit", GUI_ID_QUIT); - - submenu = menu->getSubMenu(1); - submenu->addItem(L"sky box visible", GUI_ID_SKY_BOX_VISIBLE, true, false, true); - submenu->addItem(L"toggle model debug information", GUI_ID_TOGGLE_DEBUG_INFO, true, true); - submenu->addItem(L"model material", -1, true, true ); - - submenu = submenu->getSubMenu(1); - submenu->addItem(L"Off", GUI_ID_DEBUG_OFF); - submenu->addItem(L"Bounding Box", GUI_ID_DEBUG_BOUNDING_BOX); - submenu->addItem(L"Normals", GUI_ID_DEBUG_NORMALS); - submenu->addItem(L"Skeleton", GUI_ID_DEBUG_SKELETON); - submenu->addItem(L"Wire overlay", GUI_ID_DEBUG_WIRE_OVERLAY); - submenu->addItem(L"Half-Transparent", GUI_ID_DEBUG_HALF_TRANSPARENT); - submenu->addItem(L"Buffers bounding boxes", GUI_ID_DEBUG_BUFFERS_BOUNDING_BOXES); - submenu->addItem(L"All", GUI_ID_DEBUG_ALL); - - submenu = menu->getSubMenu(1)->getSubMenu(2); - submenu->addItem(L"Solid", GUI_ID_MODEL_MATERIAL_SOLID); - submenu->addItem(L"Transparent", GUI_ID_MODEL_MATERIAL_TRANSPARENT); - submenu->addItem(L"Reflection", GUI_ID_MODEL_MATERIAL_REFLECTION); - - submenu = menu->getSubMenu(2); - submenu->addItem(L"Maya Style", GUI_ID_CAMERA_MAYA); - submenu->addItem(L"First Person", GUI_ID_CAMERA_FIRST_PERSON); - - submenu = menu->getSubMenu(3); - submenu->addItem(L"About", GUI_ID_ABOUT); - - /* - Below the menu we want a toolbar, onto which we can place colored - buttons and important looking stuff like a senseless combobox. - */ - - // create toolbar - - gui::IGUIToolBar* bar = env->addToolBar(); - - video::ITexture* image = driver->getTexture("open.png"); - bar->addButton(GUI_ID_BUTTON_OPEN_MODEL, 0, L"Open a model",image, 0, false, true); - - image = driver->getTexture("tools.png"); - bar->addButton(GUI_ID_BUTTON_SHOW_TOOLBOX, 0, L"Open Toolset",image, 0, false, true); - - image = driver->getTexture("zip.png"); - bar->addButton(GUI_ID_BUTTON_SELECT_ARCHIVE, 0, L"Set Model Archive",image, 0, false, true); - - image = driver->getTexture("help.png"); - bar->addButton(GUI_ID_BUTTON_SHOW_ABOUT, 0, L"Open Help", image, 0, false, true); - - // create a combobox for texture filters - - gui::IGUIComboBox* box = env->addComboBox(core::rect(250,4,350,23), bar, GUI_ID_TEXTUREFILTER); - box->addItem(L"No filtering"); - box->addItem(L"Bilinear"); - box->addItem(L"Trilinear"); - box->addItem(L"Anisotropic"); - box->addItem(L"Isotropic"); - - /* - To make the editor look a little bit better, we disable transparent gui - elements, and add an Irrlicht Engine logo. In addition, a text showing - the current frames per second value is created and the window caption is - changed. - */ - - // disable alpha - - for (s32 i=0; igetSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i); - col.setAlpha(255); - env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col); - } - - // add a tabcontrol - - createToolBox(); - - // create fps text - - IGUIStaticText* fpstext = env->addStaticText(L"", - core::rect(400,4,570,23), true, false, bar); - - IGUIStaticText* postext = env->addStaticText(L"", - core::rect(10,50,470,80),false, false, 0, GUI_ID_POSITION_TEXT); - postext->setVisible(false); - - // set window caption - Caption += " - ["; - Caption += driver->getName(); - Caption += "]"; - Device->setWindowCaption(Caption.c_str()); - - /* - Now we show the about message box at start up, and load the first model. - To make everything look better a skybox is created. We also add a user - controlled camera, to make the application more interactive. - Finally, everything is drawn in a standard drawing loop. - */ - - // show about message box and load default model - if (argc==1) - showAboutText(); - loadModel(StartUpModelFile.c_str()); - - // add skybox - SkyBox = smgr->addSkyBoxSceneNode( - driver->getTexture("irrlicht2_up.jpg"), - driver->getTexture("irrlicht2_dn.jpg"), - driver->getTexture("irrlicht2_lf.jpg"), - driver->getTexture("irrlicht2_rt.jpg"), - driver->getTexture("irrlicht2_ft.jpg"), - driver->getTexture("irrlicht2_bk.jpg")); - - // add a camera scene node - Camera[0] = smgr->addCameraSceneNodeMaya(); - Camera[0]->setFarValue(20000.f); - // Maya cameras reposition themselves relative to their target, so target the location - // where the mesh scene node is placed. - Camera[0]->setTarget(core::vector3df(0,30,0)); - - Camera[1] = smgr->addCameraSceneNodeFPS(); - Camera[1]->setFarValue(20000.f); - Camera[1]->setPosition(core::vector3df(0,0,-70)); - Camera[1]->setTarget(core::vector3df(0,30,0)); - - setActiveCamera(Camera[0]); - - // load the irrlicht engine logo - IGUIImage *img = - env->addImage(driver->getTexture("irrlichtlogo3.png"), - core::position2d(10, driver->getScreenSize().Height - 128)); - - // lock the logo's edges to the bottom left corner of the screen - img->setAlignment(EGUIA_UPPERLEFT, EGUIA_UPPERLEFT, - EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT); - - // remember state so we notice when the window does lose the focus - bool hasFocus = Device->isWindowFocused(); - - // draw everything - while(Device->run() && driver) - { - // Catch focus changes (workaround until Irrlicht has events for this) - bool focused = Device->isWindowFocused(); - if ( hasFocus && !focused ) - onKillFocus(); - hasFocus = focused; - - if (Device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(150,50,50,50)); - - smgr->drawAll(); - env->drawAll(); - - driver->endScene(); - - // update information about current frame-rate - core::stringw str(L"FPS: "); - str.append(core::stringw(driver->getFPS())); - str += L" Tris: "; - str.append(core::stringw(driver->getPrimitiveCountDrawn())); - fpstext->setText(str.c_str()); - - // update information about the active camera - scene::ICameraSceneNode* cam = Device->getSceneManager()->getActiveCamera(); - str = L"Pos: "; - str.append(core::stringw(cam->getPosition().X)); - str += L" "; - str.append(core::stringw(cam->getPosition().Y)); - str += L" "; - str.append(core::stringw(cam->getPosition().Z)); - str += L" Tgt: "; - str.append(core::stringw(cam->getTarget().X)); - str += L" "; - str.append(core::stringw(cam->getTarget().Y)); - str += L" "; - str.append(core::stringw(cam->getTarget().Z)); - postext->setText(str.c_str()); - - // update the tool dialog - updateToolBox(); - } - else - Device->yield(); - } - - Device->drop(); - return 0; -} - -/* -**/ diff --git a/examples/09.Meshviewer/resource.h b/examples/09.Meshviewer/resource.h deleted file mode 100644 index a8e8616a..00000000 --- a/examples/09.Meshviewer/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by 9.Meshviewer.rc -// -#define IDI_ICON1 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/examples/09.Meshviewer/tutorial.html b/examples/09.Meshviewer/tutorial.html deleted file mode 100644 index d296b6ca..00000000 --- a/examples/09.Meshviewer/tutorial.html +++ /dev/null @@ -1,182 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 9. Mesh Viewer
-
-
-
-

This tutorial shows how to create a more complex application with - the engine. We construct a simple mesh viewer using the user interface - API and the scenemanagement of Irrlicht.
- The tutorial shows how to create and use Buttons, Windows, Toolbars, - Menus, ComboBoxes, Tabcontrols, Editboxes, Images, MessageBoxes, SkyBoxes, - and how to parse XML files with the integrated XML reader of the engine.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
Lets start!
-
-

We start like in most other tutorials: Include all nesessary header - files, add a comment to let the engine be linked with the right .lib - file in Visual Studio, and deklare some global variables. We also - add two 'using namespece' statements, so we do not need to write the - whole names of all classes. In this tutorial, we use a lot stuff from - the gui namespace.

- - - - -
#include <irrlicht.h>
#include <iostream>

using namespace irr;
using namespace gui;

#pragma comment(lib, "Irrlicht.lib")

IrrlichtDevice *Device = 0;
core::stringc StartUpModelFile;
core::stringw MessageText;
core::stringw Caption;
scene::IAnimatedMeshSceneNode* Model = 0;
scene::ISceneNode* SkyBox = 0;
-

The three following functions do several stuff used by the mesh - viewer. The first function showAboutText() simply displays a messagebox - with a caption and a message text. The texts will be stored in the - MessageText and Caption variables at startup.

- - - - -
void showAboutText()
{
// create modal message box with the text
// loaded from the xml file
.
Device->getGUIEnvironment()->addMessageBox(
Caption.c_str(), MessageText.c_str());
}
-

The second function loadModel() loads a model and displays it using - an addAnimatedMeshSceneNode and the scene manager. Nothing difficult. - It also displays a short message box, if the model could not be loaded. -

- - - - -
void loadModel(const c8* filename)
{
// load a model into the engine
if (Model)
Model->remove();
Model = 0;

scene::IAnimatedMesh* m = Device->getSceneManager()->getMesh(filename);
if (!m)
{
// model could not be loaded
if (StartUpModelFile != filename)
Device->getGUIEnvironment()->addMessageBox(
Caption.c_str(), L"The model could not be loaded. " \
L"Maybe it is not a supported file format.");
return;
}

// set default material properties
Model = Device->getSceneManager()->addAnimatedMeshSceneNode(m);
Model->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
Model->setMaterialFlag(video::EMF_LIGHTING, false);
Model->setDebugDataVisible(true);
}
-

Finally, the third function creates a toolbox window. In this simple - mesh viewer, this toolbox only contains a tab control with three edit - boxes for changing the scale of the displayed model.

- - - - -
void createToolBox()
{
// remove tool box if already there
IGUIEnvironment* env = Device->getGUIEnvironment();
IGUIElement* root = env->getRootGUIElement();
IGUIElement* e = root->getElementFromId(5000, true);
if (e) e->remove();

// create the toolbox window
IGUIWindow* wnd = env->addWindow(core::rect<s32>(450,25,640,480),
false, L"Toolset", 0, 5000);

// create tab control and tabs
IGUITabControl* tab = env->addTabControl(
core::rect<s32>(2,20,640-452,480-7), wnd, true, true);
IGUITab* t1 = tab->addTab(L"Scale");
IGUITab* t2 = tab->addTab(L"Empty Tab");

// add some edit boxes and a button to tab one
env->addEditBox(L"1.0", core::rect<s32>(40,50,130,70), true, t1, 901);
env->addEditBox(L"1.0", core::rect<s32>(40,80,130,100), true, t1, 902);
env->addEditBox(L"1.0", core::rect<s32>(40,110,130,130), true, t1, 903);
env->addButton(core::rect<s32>(10,150,100,190), t1, 1101, L"set");

// bring irrlicht engine logo to front, because it
// now may be below the newly created toolbox
root->bringToFront(root->getElementFromId(666, true));
}
-

To get all the events sent by the GUI Elements, we need to create - an event receiver. This one is really simple. If an event occurs, - it checks the id of the caller and the event type, and starts an action - based on these values. For example, if a menu item with id 100 was - selected, if opens a file-open-dialog.

-
- - - - -
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == EET_GUI_EVENT)
{
s32 id = event.GUIEvent.Caller->getID();
IGUIEnvironment* env = Device->getGUIEnvironment();
switch(event.GUIEvent.EventType)
{
case EGET_MENU_ITEM_SELECTED:
{
// a menu item was clicked
IGUIContextMenu* menu = (IGUIContextMenu*)event.GUIEvent.Caller;
s32 id = menu->getItemCommandId(menu->getSelectedItem());

switch(id)
{
case 100: // File -> Open Model
env->addFileOpenDialog(L"Please select a model file to open");
break;
case 200: // File -> Quit
Device->closeDevice();
break;
case 300: // View -> Skybox
SkyBox->setVisible(!SkyBox->isVisible());
break;
case 400: // View -> Debug Information
if (Model)
Model->setDebugDataVisible(!Model->isDebugDataVisible());
break;
case 500: // Help->About
showAboutText();
break;
case 610: // View -> Material -> Solid
if (Model)
Model->setMaterialType(video::EMT_SOLID);
break;
case 620: // View -> Material -> Transparent
if (Model)
Model->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
break;
case 630: // View -> Material -> Reflection
if (Model)
Model->setMaterialType(video::EMT_SPHERE_MAP);
break;
}
break;
}
case EGET_FILE_SELECTED:
{
// load the model file, selected in the file open dialog
IGUIFileOpenDialog* dialog =
(IGUIFileOpenDialog*)event.GUIEvent.Caller;
loadModel(core::stringc(dialog->getFilename()).c_str());
}
case EGET_BUTTON_CLICKED:
switch(id)
{
case 1101:
{
// set scale
gui::IGUIElement* root = env->getRootGUIElement();
core::vector3df scale;
core::stringc s;
s = root->getElementFromId(901, true)->getText();
scale.X = (f32)atof(s.c_str());
s = root->getElementFromId(902, true)->getText();
scale.Y = (f32)atof(s.c_str());
s = root->getElementFromId(903, true)->getText();
scale.Z = (f32)atof(s.c_str());
if (Model)
Model->setScale(scale);
}
break;
case 1102:
env->addFileOpenDialog(L"Please select a model file to open");
break;
case 1103:
showAboutText();
break;
case 1104:
createToolBox();
break;
}
break;
}
}
return false;
}
};
-

Most of the hard work is done. We only need to create the Irrlicht - Engine device and all the buttons, menus and toolbars. We start up the - engine as usual, using createDevice(). To make our application catch - events, we set our eventreceiver as parameter. The #ifdef WIN32 preprocessor - commands are not necesarry, but I included them to make the tutorial - use DirectX on Windows and OpenGL on all other platforms like Linux. - As you can see, there is also a unusual call to IrrlichtDevice::setResizeAble(). - This makes the render window resizeable, which is quite useful for a - mesh viewer.

- - - - -
int main()
{
// ask user for driver -
video::E_DRIVER_TYPE driverType; -
printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char key;
std::cin >> key;

switch(key)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
} -
// create device and exit if creation failed -
MyEventReceiver receiver;
Device = createDevice(driverType, core::dimension2d<s32>(640, 480),
16, false, false, false, &receiver); -
if (Device == 0)
return 1; // could not create selected driver.

Device->setResizable(true);
Device->setWindowCaption(L"Irrlicht Engine - Loading...");

video::IVideoDriver* driver = Device->getVideoDriver();
IGUIEnvironment* env = Device->getGUIEnvironment();
scene::ISceneManager* smgr = Device->getSceneManager();
-

The next step is to read the configuration file. It is stored in the - xml format and looks a little bit like this:
-
- <?xml version="1.0"?>
- <config>
- <startUpModel file="some filename" />
- <messageText caption="Irrlicht Engine Mesh Viewer">
- Hello!
- </messageText>
- </config>

-
- We need the data stored in there to be written into the global variables - StartUpModelFile, MessageText and Caption. This is now done using the - Irrlicht Engine integrated XML parser:

- - - - -
	// read configuration from xml file
io::IXMLReader* xml =
Device->getFileSystem()->createXMLReader("../../media/config.xml");
while(xml && xml->read())
{
switch(xml->getNodeType())
{
case io::EXN_TEXT:
// in this xml file, the only text which occurs is the messageText
MessageText = xml->getNodeData();
break;
case io::EXN_ELEMENT:
{
if (core::stringw("startUpModel") == xml->getNodeName())
StartUpModelFile = xml->getAttributeValue(L"file");
else
if (core::stringw("messageText") == xml->getNodeName())
Caption = xml->getAttributeValue(L"caption");
}
break;
}
}
if (xml)
xml->drop(); // don't forget to delete the xml reader
-
-

That wasn't difficult. Now we'll set a nicer font and create the Menu. - It is possible to create submenus for every menu item. The call menu->addItem(L"File", - -1, true, true); for example adds a new menu Item with the name "File" - and the id -1. The following parameter says that the menu item should - be enabled, and the last one says, that there should be a submenu. The - submenu can now be accessed with menu->getSubMenu(0), because the - "File" entry is the menu item with index 0.

- - - - -
	// set a nicer font
IGUISkin* skin = env->getSkin();
IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
if (font)
skin->setFont(font);

// create menu
gui::IGUIContextMenu* menu = env->addMenu();
menu->addItem(L"File", -1, true, true);
menu->addItem(L"View", -1, true, true);
menu->addItem(L"Help", -1, true, true);

gui::IGUIContextMenu* submenu;
submenu = menu->getSubMenu(0);
submenu->addItem(L"Open Model File...", 100);
submenu->addSeparator();
submenu->addItem(L"Quit", 200);

submenu = menu->getSubMenu(1);
submenu->addItem(L"toggle sky box visibility", 300);
submenu->addItem(L"toggle model debug information", 400);
submenu->addItem(L"model material", -1, true, true );

submenu = submenu->getSubMenu(2);
submenu->addItem(L"Solid", 610);
submenu->addItem(L"Transparent", 620);
submenu->addItem(L"Reflection", 630);

submenu = menu->getSubMenu(2);
submenu->addItem(L"About", 500); -
-
- We want a toolbar, onto which we can place colored buttons and important - looking stuff like a senseless combobox.
-
- - - - -
	// create toolbar
gui::IGUIToolBar* bar = env->addToolBar();
bar->addButton(1102, 0, driver->getTexture("../../media/open.bmp"));
bar->addButton(1103, 0, driver->getTexture("../../media/help.bmp"));
bar->addButton(1104, 0, driver->getTexture("../../media/tools.bmp"));

// create a combobox with some senseless texts
gui::IGUIComboBox* box = env->addComboBox(core::rect<s32>(100,5,200,25), bar);
box->addItem(L"Bilinear");
box->addItem(L"Trilinear");
box->addItem(L"Anisotropic");
box->addItem(L"Isotropic");
box->addItem(L"Psychedelic");
box->addItem(L"No filtering");
-
- To make the editor look a little bit better, we disable transparent gui - elements, and add a Irrlicht Engine logo. In addition, a text, which will - show the current frame per second value is created, and the window caption - changed.
-
- - - - -
	// disable alpha
for (s32 i=0; i<gui::EGDC_COUNT ; ++i)
{
video::SColor col = env->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);
col.setAlpha(255);
env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col);
}

// add a tabcontrol
createToolBox();

// add the irrlicht engine logo
IGUIImage* img = env->addImage(core::rect<s32>(22,429,108,460), 0, 666);
img->setImage(driver->getTexture("../../media/irrlichtlogoaligned.jpg"));

// create fps text
IGUIStaticText* fpstext =
env->addStaticText(L"", core::rect<s32>(210,26,270,41), true);

// set window caption
Caption += " - [";
Caption += driver->getName();
Caption += "]";
Device->setWindowCaption(Caption.c_str());
-
- That's nearly the whole application. We simply show the about message - box at start up, and load the first model. To make everything look better, - a skybox is created and a user controled camera, to make the application - a little bit more interactive. Finally, everything is drawed in a standard - drawing loop.
-
- - - - -
	// show about message box and load default model
showAboutText();
loadModel(StartUpModelFile.c_str());

// add skybox

SkyBox = smgr->addSkyBoxSceneNode(
driver->getTexture("../../media/irrlicht2_up.bmp"),
driver->getTexture("../../media/irrlicht2_dn.bmp"),
driver->getTexture("../../media/irrlicht2_lf.bmp"),
driver->getTexture("../../media/irrlicht2_rt.bmp"),
driver->getTexture("../../media/irrlicht2_ft.bmp"),
driver->getTexture("../../media/irrlicht2_bk.bmp"));

// add a camera scene node
smgr->addCameraSceneNodeMaya();

// draw everything
while(Device->run() && driver)
if (Device->isWindowActive())
{
driver->beginScene(true, true, video::SColor(150,50,50,50));
smgr->drawAll();
env->drawAll();

driver->endScene();

core::stringw str = L"FPS: ";
str += driver->getFPS();
fpstext->setText(str.c_str());
}
Device->drop();
return 0;
}
-
- Compile and run this, and you have a fully functional 3d Mesh viewer.
-
-
-

 

- - diff --git a/examples/10.Shaders/Makefile b/examples/10.Shaders/Makefile deleted file mode 100644 index fc57b656..00000000 --- a/examples/10.Shaders/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 10.Shaders -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/10.Shaders/Shaders.cbp b/examples/10.Shaders/Shaders.cbp deleted file mode 100644 index b4f9dc53..00000000 --- a/examples/10.Shaders/Shaders.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/10.Shaders/Shaders.vcproj b/examples/10.Shaders/Shaders.vcproj deleted file mode 100644 index e730a2f9..00000000 --- a/examples/10.Shaders/Shaders.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/10.Shaders/Shaders.xcodeproj/project.pbxproj b/examples/10.Shaders/Shaders.xcodeproj/project.pbxproj deleted file mode 100644 index 6c36ed9a..00000000 --- a/examples/10.Shaders/Shaders.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 10.Shaders.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 10.Shaders.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 10.Shaders.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 10.Shaders */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "10.Shaders" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 10.Shaders; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 10.Shaders.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Shaders" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 10.Shaders */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Shaders" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "10.Shaders" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/10.Shaders/Shaders.xcodeproj/xcshareddata/xcschemes/10.Shaders.xcscheme b/examples/10.Shaders/Shaders.xcodeproj/xcshareddata/xcschemes/10.Shaders.xcscheme deleted file mode 100644 index b6111a44..00000000 --- a/examples/10.Shaders/Shaders.xcodeproj/xcshareddata/xcschemes/10.Shaders.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/10.Shaders/Shaders_vc10.vcxproj b/examples/10.Shaders/Shaders_vc10.vcxproj deleted file mode 100644 index 55e1e888..00000000 --- a/examples/10.Shaders/Shaders_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 10.Shaders - {27158C82-CD15-4A9B-9848-35E7065B209F} - Shaders - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/10.Shaders/Shaders_vc11.vcxproj b/examples/10.Shaders/Shaders_vc11.vcxproj deleted file mode 100644 index 55e1e888..00000000 --- a/examples/10.Shaders/Shaders_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 10.Shaders - {27158C82-CD15-4A9B-9848-35E7065B209F} - Shaders - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/10.Shaders/Shaders_vc12.vcxproj b/examples/10.Shaders/Shaders_vc12.vcxproj deleted file mode 100644 index b7dedf0a..00000000 --- a/examples/10.Shaders/Shaders_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 10.Shaders - {27158C82-CD15-4A9B-9848-35E7065B209F} - Shaders - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/10.Shaders/Shaders_vc14.vcxproj b/examples/10.Shaders/Shaders_vc14.vcxproj deleted file mode 100644 index dfc7ff69..00000000 --- a/examples/10.Shaders/Shaders_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 10.Shaders - {27158C82-CD15-4A9B-9848-35E7065B209F} - Shaders - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Shaders.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\10.Shaders.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Shaders.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\10.Shaders.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/10.Shaders/main.cpp b/examples/10.Shaders/main.cpp deleted file mode 100644 index ff80bd51..00000000 --- a/examples/10.Shaders/main.cpp +++ /dev/null @@ -1,466 +0,0 @@ -/** Example 010 Shaders - -This tutorial shows how to use shaders for D3D9, and OpenGL with the -engine and how to create new material types with them. It also shows how to -disable the generation of mipmaps at texture loading, and how to use text scene -nodes. - -This tutorial does not explain how shaders work. I would recommend to read the -D3D or OpenGL, documentation, to search a tutorial, or to read a book about -this. - -At first, we need to include all headers and do the stuff we always do, like in -nearly all other tutorials: -*/ -#include -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* -Because we want to use some interesting shaders in this tutorials, we need to -set some data for them to make them able to compute nice colors. In this -example, we'll use a simple vertex shader which will calculate the color of the -vertex based on the position of the camera. -For this, the shader needs the following data: The inverted world matrix for -transforming the normal, the clip matrix for transforming the position, the -camera position and the world position of the object for the calculation of the -angle of light, and the color of the light. To be able to tell the shader all -this data every frame, we have to derive a class from the -IShaderConstantSetCallBack interface and override its only method, namely -OnSetConstants(). This method will be called every time the material is set. -The method setVertexShaderConstant() of the IMaterialRendererServices interface -is used to set the data the shader needs. If the user chose to use a High Level -shader language like HLSL instead of Assembler in this example, you have to set -the variable name as parameter instead of the register index. -*/ - -IrrlichtDevice* device = 0; -bool UseHighLevelShaders = false; - -class MyShaderCallBack : public video::IShaderConstantSetCallBack -{ -public: - MyShaderCallBack() : WorldViewProjID(-1), TransWorldID(-1), InvWorldID(-1), PositionID(-1), - ColorID(-1), TextureID(-1), FirstUpdate(true) - { - } - - virtual void OnSetConstants(video::IMaterialRendererServices* services, - s32 userData) - { - video::IVideoDriver* driver = services->getVideoDriver(); - - // get shader constants id. - - if (UseHighLevelShaders && FirstUpdate) - { - WorldViewProjID = services->getVertexShaderConstantID("mWorldViewProj"); - TransWorldID = services->getVertexShaderConstantID("mTransWorld"); - InvWorldID = services->getVertexShaderConstantID("mInvWorld"); - PositionID = services->getVertexShaderConstantID("mLightPos"); - ColorID = services->getVertexShaderConstantID("mLightColor"); - - // Textures ID are important only for OpenGL interface. - - if(driver->getDriverType() == video::EDT_OPENGL) - TextureID = services->getVertexShaderConstantID("myTexture"); - - FirstUpdate = false; - } - - // set inverted world matrix - // if we are using highlevel shaders (the user can select this when - // starting the program), we must set the constants by name. - - core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD); - invWorld.makeInverse(); - - if (UseHighLevelShaders) - services->setVertexShaderConstant(InvWorldID, invWorld.pointer(), 16); - else - services->setVertexShaderConstant(invWorld.pointer(), 0, 4); - - // set clip matrix - - core::matrix4 worldViewProj; - worldViewProj = driver->getTransform(video::ETS_PROJECTION); - worldViewProj *= driver->getTransform(video::ETS_VIEW); - worldViewProj *= driver->getTransform(video::ETS_WORLD); - - if (UseHighLevelShaders) - services->setVertexShaderConstant(WorldViewProjID, worldViewProj.pointer(), 16); - else - services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4); - - // set camera position - - core::vector3df pos = device->getSceneManager()-> - getActiveCamera()->getAbsolutePosition(); - - if (UseHighLevelShaders) - services->setVertexShaderConstant(PositionID, reinterpret_cast(&pos), 3); - else - services->setVertexShaderConstant(reinterpret_cast(&pos), 8, 1); - - // set light color - - video::SColorf col(0.0f,1.0f,1.0f,0.0f); - - if (UseHighLevelShaders) - services->setVertexShaderConstant(ColorID, - reinterpret_cast(&col), 4); - else - services->setVertexShaderConstant(reinterpret_cast(&col), 9, 1); - - // set transposed world matrix - - core::matrix4 world = driver->getTransform(video::ETS_WORLD); - world = world.getTransposed(); - - if (UseHighLevelShaders) - { - services->setVertexShaderConstant(TransWorldID, world.pointer(), 16); - - // set texture, for textures you can use both an int and a float setPixelShaderConstant interfaces (You need it only for an OpenGL driver). - s32 TextureLayerID = 0; - services->setPixelShaderConstant(TextureID, &TextureLayerID, 1); - } - else - services->setVertexShaderConstant(world.pointer(), 10, 4); - } - -private: - s32 WorldViewProjID; - s32 TransWorldID; - s32 InvWorldID; - s32 PositionID; - s32 ColorID; - s32 TextureID; - - bool FirstUpdate; -}; - -/* -The next few lines start up the engine just like in most other tutorials -before. But in addition, we ask the user if he wants to use high level shaders -in this example, if he selected a driver which is capable of doing so. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // ask the user if we should use high level shaders for this example - if (driverType == video::EDT_DIRECT3D9 || - driverType == video::EDT_OPENGL) - { - char i = 'y'; - printf("Please press 'y' if you want to use high level shaders.\n"); - std::cin >> i; - if (i == 'y') - { - UseHighLevelShaders = true; - } - } - - // create device - - device = createDevice(driverType, core::dimension2d(640, 480)); - - if (device == 0) - return 1; // could not create selected driver. - - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* gui = device->getGUIEnvironment(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - Now for the more interesting parts. If we are using Direct3D, we want - to load vertex and pixel shader programs, if we have OpenGL, we want to - use ARB fragment and vertex programs. I wrote the corresponding - programs down into the files d3d9.ps, d3d9.vs, opengl.ps and opengl.vs. - We only need the right filenames now. This is done in the following switch. - Note, that it is not necessary to write the shaders into text files, - like in this example. You can even write the shaders directly as strings - into the cpp source file, and use later addShaderMaterial() instead of - addShaderMaterialFromFiles(). - */ - - io::path vsFileName; // filename for the vertex shader - io::path psFileName; // filename for the pixel shader - - switch(driverType) - { - case video::EDT_DIRECT3D9: - if (UseHighLevelShaders) - { - psFileName = mediaPath + "d3d9.hlsl"; - vsFileName = psFileName; // both shaders are in the same file - } - else - { - psFileName = mediaPath + "d3d9.psh"; - vsFileName = mediaPath + "d3d9.vsh"; - } - break; - - case video::EDT_OGLES1: - case video::EDT_OGLES2: - UseHighLevelShaders=true; - { - psFileName = "../../media/ogles2.frag"; - vsFileName = "../../media/ogles2.vert"; - } - break; - case video::EDT_OPENGL: - if (UseHighLevelShaders) - { - psFileName = mediaPath + "opengl.frag"; - vsFileName = mediaPath + "opengl.vert"; - } - else - { - psFileName = mediaPath + "opengl.psh"; - vsFileName = mediaPath + "opengl.vsh"; - } - break; - default: - break; - } - - /* - In addition, we check if the hardware and the selected renderer is - capable of executing the shaders we want. If not, we simply set the - filename string to 0. This is not necessary, but useful in this - example: For example, if the hardware is able to execute vertex shaders - but not pixel shaders, we create a new material which only uses the - vertex shader, and no pixel shader. Otherwise, if we would tell the - engine to create this material and the engine sees that the hardware - wouldn't be able to fulfill the request completely, it would not - create any new material at all. So in this example you would see at - least the vertex shader in action, without the pixel shader. - */ - - if (!driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1)) - { - device->getLogger()->log("WARNING: Pixel shaders disabled "\ - "because of missing driver/hardware support."); - psFileName = ""; - } - - if (!driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1)) - { - device->getLogger()->log("WARNING: Vertex shaders disabled "\ - "because of missing driver/hardware support."); - vsFileName = ""; - } - - /* - Now lets create the new materials. As you maybe know from previous - examples, a material type in the Irrlicht engine is set by simply - changing the MaterialType value in the SMaterial struct. And this value - is just a simple 32 bit value, like video::EMT_SOLID. So we only need - the engine to create a new value for us which we can set there. To do - this, we get a pointer to the IGPUProgrammingServices and call - addShaderMaterialFromFiles(), which returns such a new 32 bit value. - That's all. - - The parameters to this method are the following: First, the names of - the files containing the code of the vertex and the pixel shader. If - you would use addShaderMaterial() instead, you would not need file - names, then you could write the code of the shader directly as string. - The following parameter is a pointer to the IShaderConstantSetCallBack - class we wrote at the beginning of this tutorial. If you don't want to - set constants, set this to 0. The last parameter tells the engine which - material it should use as base material. - - To demonstrate this, we create two materials with a different base - material, one with EMT_SOLID and one with EMT_TRANSPARENT_ADD_COLOR. - */ - - // create materials - - video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices(); - s32 newMaterialType1 = 0; - s32 newMaterialType2 = 0; - - if (gpu) - { - /* - Create one callback instance for each shader material you add. - Reason is that the getVertexShaderConstantID returns ID's which are - only valid per added material (The ID's tend to be identical - as long as the shader code is exactly identical, but it's not good - style to depend on that). - */ - MyShaderCallBack* mcSolid = new MyShaderCallBack(); - MyShaderCallBack* mcTransparentAdd = new MyShaderCallBack(); - - // create the shaders depending on if the user wanted high level - // or low level shaders: - - if (UseHighLevelShaders) - { - // create material from high level shaders (hlsl, glsl) - - newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles( - vsFileName, "vertexMain", video::EVST_VS_1_1, - psFileName, "pixelMain", video::EPST_PS_1_1, - mcSolid, video::EMT_SOLID, 0); - - newMaterialType2 = gpu->addHighLevelShaderMaterialFromFiles( - vsFileName, "vertexMain", video::EVST_VS_1_1, - psFileName, "pixelMain", video::EPST_PS_1_1, - mcTransparentAdd, video::EMT_TRANSPARENT_ADD_COLOR, 0); - } - else - { - // create material from low level shaders (asm or arb_asm) - - newMaterialType1 = gpu->addShaderMaterialFromFiles(vsFileName, - psFileName, mcSolid, video::EMT_SOLID); - - newMaterialType2 = gpu->addShaderMaterialFromFiles(vsFileName, - psFileName, mcTransparentAdd, video::EMT_TRANSPARENT_ADD_COLOR); - } - - mcSolid->drop(); - mcTransparentAdd->drop(); - } - - /* - Now it's time for testing the materials. We create a test cube and set - the material we created. In addition, we add a text scene node to the - cube and a rotation animator to make it look more interesting and - important. - */ - - // create test scene node 1, with the new created material type 1 - - scene::ISceneNode* node = smgr->addCubeSceneNode(50); - node->setPosition(core::vector3df(0,0,0)); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.bmp")); - node->setMaterialFlag(video::EMF_LIGHTING, false); - node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType1); - - smgr->addTextSceneNode(gui->getBuiltInFont(), - L"PS & VS & EMT_SOLID", - video::SColor(255,255,255,255), node); - - scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator( - core::vector3df(0,0.3f,0)); - node->addAnimator(anim); - anim->drop(); - - /* - Same for the second cube, but with the second material we created. - */ - - // create test scene node 2, with the new created material type 2 - - node = smgr->addCubeSceneNode(50); - node->setPosition(core::vector3df(0,-10,50)); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.bmp")); - node->setMaterialFlag(video::EMF_LIGHTING, false); - node->setMaterialFlag(video::EMF_BLEND_OPERATION, true); - node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType2); - - smgr->addTextSceneNode(gui->getBuiltInFont(), - L"PS & VS & EMT_TRANSPARENT", - video::SColor(255,255,255,255), node); - - anim = smgr->createRotationAnimator(core::vector3df(0,0.3f,0)); - node->addAnimator(anim); - anim->drop(); - - /* - Then we add a third cube without a shader on it, to be able to compare - the cubes. - */ - - // add a scene node with no shader - - node = smgr->addCubeSceneNode(50); - node->setPosition(core::vector3df(0,50,25)); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.bmp")); - node->setMaterialFlag(video::EMF_LIGHTING, false); - smgr->addTextSceneNode(gui->getBuiltInFont(), L"NO SHADER", - video::SColor(255,255,255,255), node); - - /* - And last, we add a skybox and a user controlled camera to the scene. - For the skybox textures, we disable mipmap generation, because we don't - need mipmaps on it. - */ - - // add a nice skybox - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - - smgr->addSkyBoxSceneNode( - driver->getTexture(mediaPath + "irrlicht2_up.jpg"), - driver->getTexture(mediaPath + "irrlicht2_dn.jpg"), - driver->getTexture(mediaPath + "irrlicht2_lf.jpg"), - driver->getTexture(mediaPath + "irrlicht2_rt.jpg"), - driver->getTexture(mediaPath + "irrlicht2_ft.jpg"), - driver->getTexture(mediaPath + "irrlicht2_bk.jpg")); - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true); - - // add a camera and disable the mouse cursor - - scene::ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(); - cam->setPosition(core::vector3df(-100,50,100)); - cam->setTarget(core::vector3df(0,0,0)); - device->getCursorControl()->setVisible(false); - - /* - Now draw everything. That's all. - */ - - int lastFPS = -1; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,0,0,0)); - smgr->drawAll(); - driver->endScene(); - - int fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw str = L"Irrlicht Engine - Vertex and pixel shader example ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - - device->drop(); - - return 0; -} - -/* -Compile and run this, and I hope you have fun with your new little shader -writing tool :). -**/ diff --git a/examples/10.Shaders/tutorial.html b/examples/10.Shaders/tutorial.html deleted file mode 100644 index 05c4f08a..00000000 --- a/examples/10.Shaders/tutorial.html +++ /dev/null @@ -1,566 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 10. Shaders
-
-
-
-

This tutorial shows how to use shaders for D3D8, D3D9 and OpenGL with - the engine and how to create new material types with them. It also shows - how to disable the generation of mipmaps at texture loading, and how - to use text scene nodes.

-

This tutorial does not explain how shaders work. I would recommend - to read the D3D or OpenGL documentation, to search a tutorial, or to - read a book about this.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
Lets start!
-
-

At first, we need to include all headers and do the stuff we always - do, like in nearly all other tutorials:

- - - - -
#include <irrlicht.h>
#include <iostream>

using namespace irr;

#pragma comment(lib, "Irrlicht.lib")
-

Because we want to use some interesting shaders in this tutorials, - we need to set some data for them to make them able to compute nice - colors. In this example, we'll use a simple vertex shader which will - calculate the color of the vertex based on the position of the camera. - For this, the shader needs the following data: The inverted world - matrix for transforming the normal, the clip matrix for transforming - the position, the camera position and the world position of the object - for the calculation of the angle of light, and the color of the light. - To be able to tell the shader all this data every frame, we have to - derive a class from the IShaderConstantSetCallBack interface and override - its only method, namely OnSetConstants(). This method will be called - every time the material is set.
- The method setVertexShaderConstant() of the IMaterialRendererServices - interface is used to set the data the shader needs. If the user chose - to use a High Level shader language like HLSL instead of Assembler - in this example, you have to set the variable name as parameter instead - of the register index.

- - - - -
IrrlichtDevice* device = 0;
bool UseHighLevelShaders = false;

class MyShaderCallBack : public video::IShaderConstantSetCallBack
{
public: -
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();

// set inverted world matrix
// if we are using highlevel shaders (the user can select this when
// starting the program), we must set the constants by name.

core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD);
invWorld.makeInverse();

if (UseHighLevelShaders)
services->setVertexShaderConstant("mInvWorld", &invWorld.M[0], 16);
else
services->setVertexShaderConstant(&invWorld.M[0], 0, 4);

// set clip matrix
core::matrix4 worldViewProj;
worldViewProj = driver->getTransform(video::ETS_PROJECTION);
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);

if (UseHighLevelShaders)
services->setVertexShaderConstant("mWorldViewProj", &worldViewProj.M[0], 16);
else
services->setVertexShaderConstant(&worldViewProj.M[0], 4, 4);

// set camera position
core::vector3df pos = device->getSceneManager()->
getActiveCamera()->getAbsolutePosition();

if (UseHighLevelShaders)
services->setVertexShaderConstant("mLightPos", reinterpret_cast<f32*>(&pos), 3);
else
services->setVertexShaderConstant(reinterpret_cast<f32*>(&pos), 8, 1);

// set light color
video::SColorf col(0.0f,1.0f,1.0f,0.0f);

if (UseHighLevelShaders)
services->setVertexShaderConstant("mLightColor", reinterpret_cast<f32*>(&col), 4);
else
services->setVertexShaderConstant(reinterpret_cast<f32*>(&col), 9, 1);

// set transposed world matrix
core::matrix4 world = driver->getTransform(video::ETS_WORLD);
world = world.getTransposed();

if (UseHighLevelShaders)
services->setVertexShaderConstant("mTransWorld", &world.M[0], 16);
else
services->setVertexShaderConstant(&world.M[0], 10, 4);
}
};
-

The next few lines start up the engine. Just like in most other - tutorials before. But in addition, we ask the user if he wants this - example to use high level shaders if he selected a driver which is - capable of doing so.

- - - - -
int main()
{
// let user select driver type

video::E_DRIVER_TYPE driverType = video::EDT_DIRECTX9;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
}

// ask the user if we should use high level shaders for this example
if (driverType == video::EDT_DIRECT3D9 ||
driverType == video::EDT_OPENGL) - {
printf("Please press 'y' if you want to use high level shaders.\n");
std::cin >> i;
if (i == 'y')
UseHighLevelShaders = true;
}

// create device

device = createDevice(driverType, core::dimension2d<s32>(640, 480));

if (device == 0)
{
printf("\nWas not able to create driver.\n"\
"Please restart and select another driver.\n"
);
getch();
return 1;
}

video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* gui = device->getGUIEnvironment();
-

Now for the more interesting parts. If we are using Direct3D, we - want to load vertex and pixel shader programs, if we have
- OpenGL, we want to use ARB fragment and vertex programs. I wrote the - corresponding programs down into the files d3d8.ps, d3d8.vs, d3d9.ps, - d3d9.vs, opengl.ps and opengl.vs. We only need the right filenames - now. This is done in the following switch. Note, that it is not necessary - to write the shaders into text files, like in this example. You can - even write the shaders directly as strings into the cpp source file, - and use later addShaderMaterial() instead of addShaderMaterialFromFiles().

- - - - -
	c8* vsFileName = 0; // filename for the vertex shader
c8* psFileName = 0; // filename for the pixel shader

switch(driverType)
{
case video::EDT_DIRECT3D8:
psFileName = "../../media/d3d8.psh";
vsFileName = "../../media/d3d8.vsh";
break;
case video::EDT_DIRECT3D9:
if (UseHighLevelShaders)
{
psFileName = "../../media/d3d9.hlsl";
vsFileName = psFileName; // both shaders are in the same file
}
else
{
psFileName = "../../media/d3d9.psh";
vsFileName = "../../media/d3d9.vsh";
}
break;
case video::EDT_OPENGL:
if (UseHighLevelShaders)
{
psFileName = "../../media/opengl.frag";
vsFileName = "../../media/opengl.vert";
}
else
{
psFileName = "../../media/opengl.psh";
vsFileName = "../../media/opengl.vsh";
}
break;
}
-
-

In addition, we check if the hardware and the selected renderer - is capable of executing the shaders we want. If not, we simply set - the filename string to 0. This is not necessary, but useful in this - example: For example, if the hardware is able to execute vertex shaders - but not pixel shaders, we create a new material which only uses the - vertex shader, and no pixel shader. Otherwise, if we would tell the - engine to create this material and the engine sees that the hardware - wouldn't be able to fullfill the request completely,
- it would not create any new material at all. So in this example you - would see at least the vertex shader in action, without the pixel - shader.

-
- - - - -
	if (!driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) &&
!driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1))
{
device->getLogger()->log("WARNING: Pixel shaders disabled "\
"because of missing driver/hardware support.");
psFileName = 0;
}

if (!driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1) &&
!driver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1))
{
device->getLogger()->log("WARNING: Vertex shaders disabled "\
"because of missing driver/hardware support.");
vsFileName = 0;
}
-

Now lets create the new materials.
- As you maybe know from previous examples, a material type in the Irrlicht - engine is set by simply changing the MaterialType value in the SMaterial - struct. And this value is just a simple 32 bit value, like video::EMT_SOLID. - So we only need the engine to create a new value for us which we can - set there. To do this, we get a pointer to the IGPUProgrammingServices - and call addShaderMaterialFromFiles(), which returns such a new 32 bit - value. That's all.
- The parameters to this method are the following: First, the names of - the files containing the code of the vertex and the pixel shader.
- If you would use addShaderMaterial() instead, you would not need file - names, then you could write the code of the shader directly as string. - The following parameter is a pointer to the IShaderConstantSetCallBack - class we wrote at the beginning of this tutorial. If you don't want - to set constants, set this to 0. The last paramter tells the engine - which material it should use as base material.
- To demonstrate this, we create two materials with a different base material, - one with EMT_SOLID and one with EMT_TRANSPARENT_ADD_COLOR.

- - - - -
	// create materials

video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();

s32 newMaterialType1 = 0;
s32 newMaterialType2 = 0;

if (gpu)
{
MyShaderCallBack* mc = new MyShaderCallBack();
- // create the shaders depending on if the user wanted high level
// or low level shaders:


if (UseHighLevelShaders)
{
// create material from high level shaders (hlsl or glsl)

newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(
vsFileName, "vertexMain", video::EVST_VS_1_1,
psFileName, "pixelMain", video::EPST_PS_1_1,
mc, video::EMT_SOLID);

newMaterialType2 = gpu->addHighLevelShaderMaterialFromFiles(
vsFileName, "vertexMain", video::EVST_VS_1_1,
psFileName, "pixelMain", video::EPST_PS_1_1,
mc, video::EMT_TRANSPARENT_ADD_COLOR);
}
else
{
// create material from low level shaders (asm or arb_asm)

newMaterialType1 = gpu->addShaderMaterialFromFiles(vsFileName,
psFileName, mc, video::EMT_SOLID);

newMaterialType2 = gpu->addShaderMaterialFromFiles(vsFileName,
psFileName, mc, video::EMT_TRANSPARENT_ADD_COLOR);
}

mc->drop();
}
-

Now its time for testing out the materials. We create a test cube - and set the material we created. In addition, we add a text scene node - to the cube and a rotatation animator, to make it look more interesting - and important.

- - - - -

-	// create test scene node 1, with the new created material type 1
-
-	scene::ISceneNode* node = smgr->addCubeSceneNode(50);
-	node->setPosition(core::vector3df(0,0,0));
-	node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
-	node->setMaterialFlag(video::EMF_LIGHTING, false);
-	node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType1);
-
-	smgr->addTextSceneNode(gui->getBuiltInFont(),
-			L"PS & VS & EMT_SOLID",
-			video::SColor(255,255,255,255),	node);
-
-	scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
-			core::vector3df(0,0.3f,0));
-	node->addAnimator(anim);
-	anim->drop();
-

Same for the second cube, but with the second material we created.

- - - - -
	// create test scene node 2, with the new created material type 2
-
-	node = smgr->addCubeSceneNode(50);
-	node->setPosition(core::vector3df(0,-10,50));
-	node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
-	node->setMaterialFlag(video::EMF_LIGHTING, false);
-	node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType2);
-
-	smgr->addTextSceneNode(gui->getBuiltInFont(),
-			L"PS & VS & EMT_TRANSPARENT",
-			video::SColor(255,255,255,255),	node);
-
-	anim = smgr->createRotationAnimator(core::vector3df(0,0.3f,0));
-	node->addAnimator(anim);
-	anim->drop();
-
- Then we add a third cube without a shader on it, to be able to compare - the cubes.
-
- - - - -
	// add a scene node with no shader 
-
-	node = smgr->addCubeSceneNode(50);
-	node->setPosition(core::vector3df(0,50,25));
-	node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
-	node->setMaterialFlag(video::EMF_LIGHTING, false);
-	smgr->addTextSceneNode(gui->getBuiltInFont(), L"NO SHADER",
-		video::SColor(255,255,255,255), node);
-            
-
- And last, we add a skybox and a user controlled camera to the scene. For - the skybox textures, we disable mipmap generation, because we don't need - mipmaps on it.
-
- - - - -
	// add a nice skybox

driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);

smgr->addSkyBoxSceneNode(
driver->getTexture("../../media/irrlicht2_up.jpg"),
driver->getTexture("../../media/irrlicht2_dn.jpg"),
driver->getTexture("../../media/irrlicht2_lf.jpg"),
driver->getTexture("../../media/irrlicht2_rt.jpg"),
driver->getTexture("../../media/irrlicht2_ft.jpg"),
driver->getTexture("../../media/irrlicht2_bk.jpg"));

driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);

// add a camera and disable the mouse cursor

scene::ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS(0, 100.0f, 100.0f);
cam->setPosition(core::vector3df(-100,50,100));
cam->setTarget(core::vector3df(0,0,0));
device->getCursorControl()->setVisible(false);
-
- Now draw everything. That's all.
-
- - - - -
	int lastFPS = -1;

while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, video::SColor(255,0,0,0));
smgr->drawAll();
driver->endScene();

int fps = driver->getFPS();

if (lastFPS != fps)
{
core::stringw str = L"Irrlicht Engine - Vertex and pixel shader example [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}

device->drop();

return 0;
-
- Compile and run this, and I hope you have fun with your new little shader - writing tool :).
-
-
-
- - - - - - - -
Shader files
-
-

The files containing the shaders can be found in the media directory - of the SDK. However, they look like this:

- - - - - - - -
D3D9.HLSL
-
-// part of the Irrlicht Engine Shader example.
-// These simple Direct3D9 pixel and vertex shaders will be loaded by the shaders
-// example. Please note that these example shaders don't do anything really useful. 
-// They only demonstrate that shaders can be used in Irrlicht.
-
-//-----------------------------------------------------------------------------
-// Global variables
-//-----------------------------------------------------------------------------
-float4x4 mWorldViewProj;  // World * View * Projection transformation
-float4x4 mInvWorld;       // Inverted world matrix
-float4x4 mTransWorld;     // Transposed world matrix
-float3 mLightPos;         // Light position
-float4 mLightColor;       // Light color
-
-
-// Vertex shader output structure
-struct VS_OUTPUT
-{
-	float4 Position   : POSITION;   // vertex position 
-	float4 Diffuse    : COLOR0;     // vertex diffuse color
-	float2 TexCoord   : TEXCOORD0;  // tex coords
-};
-
-
-VS_OUTPUT vertexMain( in float4 vPosition : POSITION,
-                      in float3 vNormal   : NORMAL,
-                      float2 texCoord     : TEXCOORD0 )
-{
-	VS_OUTPUT Output;
-
-	// transform position to clip space 
-	Output.Position = mul(vPosition, mWorldViewProj);
-	
-	// transform normal 
-	float3 normal = mul(vNormal, mInvWorld);
-	
-	// renormalize normal 
-	normal = normalize(normal);
-	
-	// position in world coodinates
-	float3 worldpos = mul(mTransWorld, vPosition);
-	
-	// calculate light vector, vtxpos - lightpos
-	float3 lightVector = worldpos - mLightPos;
-	
-	// normalize light vector 
-	lightVector = normalize(lightVector);
-	
-	// calculate light color 
-	float3 tmp = dot(-lightVector, normal);
-	tmp = lit(tmp.x, tmp.y, 1.0);
-	
-	tmp = mLightColor * tmp.y;
-	Output.Diffuse = float4(tmp.x, tmp.y, tmp.z, 0);
-	Output.TexCoord = texCoord;
-	
-	return Output;
-}
-
-
-
-// Pixel shader output structure
-struct PS_OUTPUT
-{
-    float4 RGBColor : COLOR0;  // Pixel color    
-};
-
-
-sampler2D tex0;
-	
-PS_OUTPUT pixelMain( float2 TexCoord : TEXCOORD0,
-                     float4 Position : POSITION,
-                     float4 Diffuse  : COLOR0 ) 
-{ 
-	PS_OUTPUT Output;
-
-	float4 col = tex2D( tex0, TexCoord );  // sample color map
-	
-	// multiply with diffuse and do other senseless operations
-	Output.RGBColor = Diffuse * col;
-	Output.RGBColor *= 4.0;
-
-	return Output;
-}
-
- - - - - - - -
D3D9.VSH
-; part of the Irrlicht Engine Shader example.
-; This Direct3D9 vertex shader will be loaded by the engine.
-; Please note that these example shaders don't do anything really useful. 
-; They only demonstrate that shaders can be used in Irrlicht.
-vs.1.1 - -dcl_position v0; ; declare position -dcl_normal v1; ; declare normal -dcl_color v2; ; declare color -dcl_texcoord0 v3; ; declare texture coordinate
-; transpose and transform position to clip space -mul r0, v0.x, c4 -mad r0, v0.y, c5, r0 -mad r0, v0.z, c6, r0 -add oPos, c7, r0 - -; transform normal -dp3 r1.x, v1, c0 -dp3 r1.y, v1, c1 -dp3 r1.z, v1, c2 - -; renormalize normal -dp3 r1.w, r1, r1 -rsq r1.w, r1.w -mul r1, r1, r1.w - -; calculate light vector -m4x4 r6, v0, c10 ; vertex into world position -add r2, c8, -r6 ; vtxpos - lightpos - -; normalize light vector -dp3 r2.w, r2, r2 -rsq r2.w, r2.w -mul r2, r2, r2.w - -; calculate light color -dp3 r3, r1, r2 ; dp3 with negative light vector -lit r5, r3 ; clamp to zero if r3 < 0, r5 has diffuce component in r5.y -mul oD0, r5.y, c9 ; ouput diffuse color -mov oT0, v3 ; store texture coordinates
-
- - - - - - - -
D3D9.PSH
-; part of the Irrlicht Engine Shader example.
-; This simple Direct3D9 pixel shader will be loaded by the engine.
-; Please note that these example shaders don't do anything really useful. 
-; They only demonstrate that shaders can be used in Irrlicht.
-ps.1.1 - -tex t0 ; sample color map -add r0, v0, v0 ; mulitply with color -mul t0, t0, r0 ; mulitply with color -add r0, t0, t0 ; make it brighter and store result -
-
- - - - - - - -
D3D8.VSH
-; part of the Irrlicht Engine Shader example.
-; This Direct3D9 vertex shader will be loaded by the engine.
-; Please note that these example shaders don't do anything really useful. 
-; They only demonstrate that shaders can be used in Irrlicht.
-vs.1.1 - -; transpose and transform position to clip space -mul r0, v0.x, c4 -mad r0, v0.y, c5, r0 -mad r0, v0.z, c6, r0 -add oPos, c7, r0 - -; transform normal -dp3 r1.x, v1, c0 -dp3 r1.y, v1, c1 -dp3 r1.z, v1, c2 - -; renormalize normal -dp3 r1.w, r1, r1 -rsq r1.w, r1.w -mul r1, r1, r1.w - -; calculate light vector -m4x4 r6, v0, c10 ; vertex into world position -add r2, c8, -r6 ; vtxpos - lightpos - -; normalize light vector -dp3 r2.w, r2, r2 -rsq r2.w, r2.w -mul r2, r2, r2.w - -; calculate light color -dp3 r3, r1, r2 ; dp3 with negative light vector -lit r5, r3 ; clamp to zero if r3 < 0, r5 has diffuce component in r5.y -mul oD0, r5.y, c9 ; ouput diffuse color -mov oT0, v3 ; store texture coordinates
-
- - - - - - - -
D3D8.PSH
-; part of the Irrlicht Engine Shader example.
-; This simple Direct3D9 pixel shader will be loaded by the engine.
-; Please note that these example shaders don't do anything really useful. 
-; They only demonstrate that shaders can be used in Irrlicht.
-ps.1.1 - -tex t0 ; sample color map -mul_x2 t0, t0, v0 ; mulitply with color -add r0, t0, t0 ; make it brighter and store result
-
- - - - - - - -
OPENGL.VSH
-!!ARBvp1.0
-# part of the Irrlicht Engine Shader example.
-# Please note that these example shaders don't do anything really useful. 
-# They only demonstrate that shaders can be used in Irrlicht.
-#input -ATTRIB InPos = vertex.position; -ATTRIB InColor = vertex.color; -ATTRIB InNormal = vertex.normal; -ATTRIB InTexCoord = vertex.texcoord; - -#output -OUTPUT OutPos = result.position; -OUTPUT OutColor = result.color; -OUTPUT OutTexCoord = result.texcoord; - -PARAM MVP[4] = { state.matrix.mvp }; # modelViewProjection matrix. -TEMP Temp; -TEMP TempColor; -TEMP TempNormal; -TEMP TempPos; - -#transform position to clip space -DP4 Temp.x, MVP[0], InPos; -DP4 Temp.y, MVP[1], InPos; -DP4 Temp.z, MVP[2], InPos; -DP4 Temp.w, MVP[3], InPos; - -#transform normal -DP3 TempNormal.x, InNormal.x, program.local[0]; -DP3 TempNormal.y, InNormal.y, program.local[1]; -DP3 TempNormal.z, InNormal.z, program.local[2]; - -#renormalize normal -DP3 TempNormal.w, TempNormal, TempNormal; -RSQ TempNormal.w, TempNormal.w; -MUL TempNormal, TempNormal, TempNormal.w; - -# calculate light vector -DP4 TempPos.x, InPos, program.local[10]; # vertex into world position -DP4 TempPos.y, InPos, program.local[11]; -DP4 TempPos.z, InPos, program.local[12]; -DP4 TempPos.w, InPos, program.local[13]; - -ADD TempPos, program.local[8], -TempPos; # vtxpos - lightpos - -# normalize light vector -DP3 TempPos.w, TempPos, TempPos; -RSQ TempPos.w, TempPos.w; -MUL TempPos, TempPos, TempPos.w; - -# calculate light color -DP3 TempColor, TempNormal, TempPos; # dp3 with negative light vector -LIT OutColor, TempColor; # clamp to zero if r3 < 0, r5 has diffuce component in r5.y -MUL OutColor, TempColor.y, program.local[9]; # ouput diffuse color -MOV OutColor.w, 1.0; # we want alpha to be always 1 -MOV OutTexCoord, InTexCoord; # store texture coordinate -MOV OutPos, Temp; - -END
-
- - - - - - - -
OPENGL.PSH
-!!ARBfp1.0
-# part of the Irrlicht Engine Shader example.
-# Please note that these example shaders don't do anything really useful. 
-# They only demonstrate that shaders can be used in Irrlicht.
-#Input -ATTRIB inTexCoord = fragment.texcoord; # texture coordinates -ATTRIB inColor = fragment.color.primary; # interpolated diffuse color - -#Output -OUTPUT outColor = result.color; - -TEMP texelColor; -TEMP tmp; -TXP texelColor, inTexCoord, texture, 2D; - -ADD tmp, inColor, inColor; # mulitply with color -MUL texelColor, texelColor, tmp; # mulitply with color -ADD outColor, texelColor, texelColor; # make it brighter and store result - -END
-

 

-
-
-

 

-

 

- - diff --git a/examples/11.PerPixelLighting/Makefile b/examples/11.PerPixelLighting/Makefile deleted file mode 100644 index fddcd343..00000000 --- a/examples/11.PerPixelLighting/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 11.PerPixelLighting -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/11.PerPixelLighting/PerPixelLighting.cbp b/examples/11.PerPixelLighting/PerPixelLighting.cbp deleted file mode 100644 index 709dd850..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/11.PerPixelLighting/PerPixelLighting.vcproj b/examples/11.PerPixelLighting/PerPixelLighting.vcproj deleted file mode 100644 index 94d7e6a7..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/project.pbxproj b/examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/project.pbxproj deleted file mode 100644 index cac51bca..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 11.PerPixelLighting.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 11.PerPixelLighting.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 11.PerPixelLighting.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 11.PerPixelLighting */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "11.PerPixelLighting" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 11.PerPixelLighting; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 11.PerPixelLighting.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "PerPixelLighting" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 11.PerPixelLighting */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "PerPixelLighting" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "11.PerPixelLighting" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/xcshareddata/xcschemes/11.PerPixelLighting.xcscheme b/examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/xcshareddata/xcschemes/11.PerPixelLighting.xcscheme deleted file mode 100644 index ddd1fcf4..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting.xcodeproj/xcshareddata/xcschemes/11.PerPixelLighting.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/11.PerPixelLighting/PerPixelLighting_vc10.vcxproj b/examples/11.PerPixelLighting/PerPixelLighting_vc10.vcxproj deleted file mode 100644 index 2179bc44..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 11.PerPixelLighting - {C4B42409-542D-4EFC-9E6B-44713FD47A33} - PerPixelLighting - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/11.PerPixelLighting/PerPixelLighting_vc11.vcxproj b/examples/11.PerPixelLighting/PerPixelLighting_vc11.vcxproj deleted file mode 100644 index 2179bc44..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 11.PerPixelLighting - {C4B42409-542D-4EFC-9E6B-44713FD47A33} - PerPixelLighting - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/11.PerPixelLighting/PerPixelLighting_vc12.vcxproj b/examples/11.PerPixelLighting/PerPixelLighting_vc12.vcxproj deleted file mode 100644 index ca2c3f4c..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 11.PerPixelLighting - {C4B42409-542D-4EFC-9E6B-44713FD47A33} - PerPixelLighting - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/11.PerPixelLighting/PerPixelLighting_vc14.vcxproj b/examples/11.PerPixelLighting/PerPixelLighting_vc14.vcxproj deleted file mode 100644 index 3e6da846..00000000 --- a/examples/11.PerPixelLighting/PerPixelLighting_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 11.PerPixelLighting - {C4B42409-542D-4EFC-9E6B-44713FD47A33} - PerPixelLighting - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PerPixelLighting.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PerPixelLighting.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\11.PerPixelLighting.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/11.PerPixelLighting/main.cpp b/examples/11.PerPixelLighting/main.cpp deleted file mode 100644 index afa59cb5..00000000 --- a/examples/11.PerPixelLighting/main.cpp +++ /dev/null @@ -1,483 +0,0 @@ -/** Example 011 Per-Pixel Lighting - -This tutorial shows how to use one of the built in more complex materials in -irrlicht: Per pixel lighted surfaces using normal maps and parallax mapping. It -will also show how to use fog and moving particle systems. And don't panic: You -do not need any experience with shaders to use these materials in Irrlicht. - -At first, we need to include all headers and do the stuff we always do, like in -nearly all other tutorials. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* -For this example, we need an event receiver, to make it possible for the user -to switch between the three available material types. In addition, the event -receiver will create some small GUI window which displays what material is -currently being used. There is nothing special done in this class, so maybe you -want to skip reading it. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - - MyEventReceiver(scene::ISceneNode* room,scene::ISceneNode* earth, - gui::IGUIEnvironment* env, video::IVideoDriver* driver) - { - // store pointer to room so we can change its drawing mode - Room = room; - Earth = earth; - Driver = driver; - - // set a nicer font - gui::IGUISkin* skin = env->getSkin(); - gui::IGUIFont* font = env->getFont(getExampleMediaPath() + "fonthaettenschweiler.bmp"); - if (font) - skin->setFont(font); - - // add window and listbox - gui::IGUIWindow* window = env->addWindow( - core::rect(460,375,630,470), false, L"Use 'E' + 'R' to change"); - - ListBox = env->addListBox( - core::rect(2,22,165,88), window); - - ListBox->addItem(L"Diffuse"); - ListBox->addItem(L"Bump mapping"); - ListBox->addItem(L"Parallax mapping"); - ListBox->setSelected(1); - - // create problem text - ProblemText = env->addStaticText( - L"Your hardware or this renderer is not able to use the "\ - L"needed shaders for this material. Using fall back materials.", - core::rect(150,20,470,80)); - - ProblemText->setOverrideColor(video::SColor(100,255,255,255)); - - // set start material (prefer parallax mapping if available) - video::IMaterialRenderer* renderer = - Driver->getMaterialRenderer(video::EMT_PARALLAX_MAP_SOLID); - if (renderer && renderer->getRenderCapability() == 0) - ListBox->setSelected(2); - - // set the material which is selected in the listbox - setMaterial(); - } - - bool OnEvent(const SEvent& event) - { - // check if user presses the key 'E' or 'R' - if (event.EventType == irr::EET_KEY_INPUT_EVENT && - !event.KeyInput.PressedDown && Room && ListBox) - { - // change selected item in listbox - - int sel = ListBox->getSelected(); - if (event.KeyInput.Key == irr::KEY_KEY_R) - ++sel; - else - if (event.KeyInput.Key == irr::KEY_KEY_E) - --sel; - else - return false; - - if (sel > 2) sel = 0; - if (sel < 0) sel = 2; - ListBox->setSelected(sel); - - // set the material which is selected in the listbox - setMaterial(); - } - - return false; - } - -private: - - // sets the material of the room mesh the the one set in the - // list box. - void setMaterial() - { - video::E_MATERIAL_TYPE type = video::EMT_SOLID; - - // change material setting - switch(ListBox->getSelected()) - { - case 0: type = video::EMT_SOLID; - break; - case 1: type = video::EMT_NORMAL_MAP_SOLID; - break; - case 2: type = video::EMT_PARALLAX_MAP_SOLID; - break; - } - - Room->setMaterialType(type); - - // change material setting - switch(ListBox->getSelected()) - { - case 0: type = video::EMT_TRANSPARENT_VERTEX_ALPHA; - break; - case 1: type = video::EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA; - break; - case 2: type = video::EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA; - break; - } - - Earth->setMaterialType(type); - - /* - We need to add a warning if the materials will not be able to - be displayed 100% correctly. This is no problem, they will be - rendered using fall back materials, but at least the user - should know that it would look better on better hardware. We - simply check if the material renderer is able to draw at full - quality on the current hardware. The - IMaterialRenderer::getRenderCapability() returns 0 if this is - the case. - */ - video::IMaterialRenderer* renderer = Driver->getMaterialRenderer(type); - - // display some problem text when problem - if (!renderer || renderer->getRenderCapability() != 0) - ProblemText->setVisible(true); - else - ProblemText->setVisible(false); - } - -private: - - gui::IGUIStaticText* ProblemText; - gui::IGUIListBox* ListBox; - - scene::ISceneNode* Room; - scene::ISceneNode* Earth; - video::IVideoDriver* Driver; -}; - - -/* -Now for the real fun. We create an Irrlicht Device and start to setup the scene. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device - - IrrlichtDevice* device = createDevice(driverType, - core::dimension2d(640, 480)); - - if (device == 0) - return 1; // could not create selected driver. - - /* - Before we start with the interesting stuff, we do some simple things: - Store pointers to the most important parts of the engine (video driver, - scene manager, gui environment) to safe us from typing too much, add an - irrlicht engine logo to the window and a user controlled first person - shooter style camera. Also, we let the engine know that it should store - all textures in 32 bit. This necessary because for parallax mapping, we - need 32 bit textures. - */ - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* env = device->getGUIEnvironment(); - - driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true); - - const io::path mediaPath = getExampleMediaPath(); - - // add irrlicht logo - env->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), - core::position2d(10,10)); - - // add camera - scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(); - camera->setPosition(core::vector3df(-200,200,-200)); - - // disable mouse cursor - device->getCursorControl()->setVisible(false); - - /* - Because we want the whole scene to look a little bit scarier, we add - some fog to it. This is done by a call to IVideoDriver::setFog(). There - you can set various fog settings. In this example, we use pixel fog, - because it will work well with the materials we'll use in this example. - Please note that you will have to set the material flag EMF_FOG_ENABLE - to 'true' in every scene node which should be affected by this fog. - */ - driver->setFog(video::SColor(0,138,125,81), video::EFT_FOG_LINEAR, 250, 1000, .003f, true, false); - - /* - To be able to display something interesting, we load a mesh from a .3ds - file which is a room I modeled with anim8or. It is the same room as - from the specialFX example. Maybe you remember from that tutorial, I am - no good modeler at all and so I totally messed up the texture mapping - in this model, but we can simply repair it with the - IMeshManipulator::makePlanarTextureMapping() method. - */ - - scene::IAnimatedMesh* roomMesh = smgr->getMesh(mediaPath + "room.3ds"); - scene::ISceneNode* room = 0; - scene::ISceneNode* earth = 0; - - if (roomMesh) - { - // The room mesh doesn't have proper texture mapping on the - // floor, so we can recreate the mapping on runtime. - smgr->getMeshManipulator()->makePlanarTextureMapping( - roomMesh->getMesh(0), 0.003f); - - /* - Now for the first exciting thing: If we successfully loaded the - mesh we need to apply textures to it. Because we want this room - to be displayed with a very cool material, we have to do a - little bit more than just set the textures. Instead of only - loading a color map as usual, we also load a height map which - is simply a grayscale texture. From this height map, we create - a normal map which we will set as second texture of the room. - If you already have a normal map, you could directly set it, - but I simply didn't find a nice normal map for this texture. - The normal map texture is being generated by the - makeNormalMapTexture method of the VideoDriver. The second - parameter specifies the height of the heightmap. If you set it - to a bigger value, the map will look more rocky. - */ - - video::ITexture* normalMap = - driver->getTexture(mediaPath + "rockwall_height.bmp"); - - if (normalMap) - driver->makeNormalMapTexture(normalMap, 9.0f); - - /* - But just setting color and normal map is not everything. The - material we want to use needs some additional information per - vertex like tangents and binormals. Because we are too lazy to - calculate that information now, we let Irrlicht do this for us. - That's why we call IMeshManipulator::createMeshWithTangents(). - It creates a mesh copy with tangents and binormals from another - mesh. After we've done that, we simply create a standard - mesh scene node with this mesh copy, set color and normal map - and adjust some other material settings. Note that we set - EMF_FOG_ENABLE to true to enable fog in the room. - */ - - scene::IMesh* tangentMesh = smgr->getMeshManipulator()-> - createMeshWithTangents(roomMesh->getMesh(0)); - - room = smgr->addMeshSceneNode(tangentMesh); - room->setMaterialTexture(0, - driver->getTexture(mediaPath + "rockwall.jpg")); - room->setMaterialTexture(1, normalMap); - - // Stones don't glitter.. (but specular highlight for EMT_SOLID) - //room->getMaterial(0).SpecularColor.set(0,0,0,0); - //room->getMaterial(0).Shininess = 0.f; - - room->setMaterialFlag(video::EMF_FOG_ENABLE, true); - room->setMaterialType(video::EMT_PARALLAX_MAP_SOLID); - // adjust height for parallax effect - room->getMaterial(0).MaterialTypeParam = 1.f / 64.f; - - // drop mesh because we created it with a create.. call. - tangentMesh->drop(); - } - - /* - After we've created a room shaded by per pixel lighting, we add a - sphere into it with the same material, but we'll make it transparent. - In addition, because the sphere looks somehow like a familiar planet, - we make it rotate. The procedure is similar as before. The difference - is that we are loading the mesh from an .x file which already contains - a color map so we do not need to load it manually. But the sphere is a - little bit too small for our needs, so we scale it by the factor 50. - */ - - // add earth sphere - - scene::IAnimatedMesh* earthMesh = smgr->getMesh(mediaPath + "earth.x"); - if (earthMesh) - { - //perform various tasks with the mesh manipulator - scene::IMeshManipulator *manipulator = smgr->getMeshManipulator(); - - // create mesh copy with tangent information from original earth.x mesh - scene::IMesh* tangentSphereMesh = - manipulator->createMeshWithTangents(earthMesh->getMesh(0)); - - // set the alpha value of all vertices to 200 - manipulator->setVertexColorAlpha(tangentSphereMesh, 200); - - // scale the mesh by factor 50 - core::matrix4 m; - m.setScale ( core::vector3df(50,50,50) ); - manipulator->transform( tangentSphereMesh, m ); - - earth = smgr->addMeshSceneNode(tangentSphereMesh); - - earth->setPosition(core::vector3df(-70,130,45)); - - // load heightmap, create normal map from it and set it - video::ITexture* earthNormalMap = driver->getTexture(mediaPath + "earthbump.jpg"); - if (earthNormalMap) - { - driver->makeNormalMapTexture(earthNormalMap, 20.0f); - earth->setMaterialTexture(1, earthNormalMap); - earth->setMaterialType(video::EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA); - } - - // adjust material settings - earth->setMaterialFlag(video::EMF_FOG_ENABLE, true); - - // add rotation animator - scene::ISceneNodeAnimator* anim = - smgr->createRotationAnimator(core::vector3df(0,0.1f,0)); - earth->addAnimator(anim); - anim->drop(); - - // drop mesh because we created it with a create.. call. - tangentSphereMesh->drop(); - } - - /* - Per pixel lighted materials only look cool when there are moving - lights. So we add some. And because moving lights alone are so boring, - we add billboards to them, and a whole particle system to one of them. - We start with the first light which is red and has only the billboard - attached. - */ - - // add light 1 (more green) - scene::ILightSceneNode* light1 = - smgr->addLightSceneNode(0, core::vector3df(0,0,0), - video::SColorf(0.5f, 1.0f, 0.5f, 0.0f), 400.0f); - - // add fly circle animator to light 1 - scene::ISceneNodeAnimator* anim = - smgr->createFlyCircleAnimator (core::vector3df(50,300,0),190.0f, -0.003f); - light1->addAnimator(anim); - anim->drop(); - - // attach billboard to the light - scene::IBillboardSceneNode* bill = - smgr->addBillboardSceneNode(light1, core::dimension2d(60, 60)); - - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particlegreen.jpg")); - - /* - Now the same again, with the second light. The difference is that we - add a particle system to it too. And because the light moves, the - particles of the particle system will follow. If you want to know more - about how particle systems are created in Irrlicht, take a look at the - SpecialFX example. Maybe you will have noticed that we only add 2 - lights, this has a simple reason: The low end version of this material - was written in ps1.1 and vs1.1, which doesn't allow more lights. You - could add a third light to the scene, but it won't be used to shade the - walls. But of course, this will change in future versions of Irrlicht - where higher versions of pixel/vertex shaders will be implemented too. - */ - - // add light 2 (red) - scene::ISceneNode* light2 = - smgr->addLightSceneNode(0, core::vector3df(0,0,0), - video::SColorf(1.0f, 0.2f, 0.2f, 0.0f), 400.0f); - - // add fly circle animator to light 2 - anim = smgr->createFlyCircleAnimator(core::vector3df(0,150,0), 200.0f, - 0.001f, core::vector3df(0.2f, 0.9f, 0.f)); - light2->addAnimator(anim); - anim->drop(); - - // attach billboard to light - bill = smgr->addBillboardSceneNode(light2, core::dimension2d(120, 120)); - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particlered.bmp")); - - // add particle system - scene::IParticleSystemSceneNode* ps = - smgr->addParticleSystemSceneNode(false, light2); - - // create and set emitter - scene::IParticleEmitter* em = ps->createBoxEmitter( - core::aabbox3d(-3,0,-3,3,1,3), - core::vector3df(0.0f,0.03f,0.0f), - 80,100, - video::SColor(10,255,255,255), video::SColor(10,255,255,255), - 400,1100); - em->setMinStartSize(core::dimension2d(30.0f, 40.0f)); - em->setMaxStartSize(core::dimension2d(30.0f, 40.0f)); - - ps->setEmitter(em); - em->drop(); - - // create and set affector - scene::IParticleAffector* paf = ps->createFadeOutParticleAffector(); - ps->addAffector(paf); - paf->drop(); - - // adjust some material settings - ps->setMaterialFlag(video::EMF_LIGHTING, false); - ps->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - ps->setMaterialTexture(0, driver->getTexture(mediaPath + "fireball.bmp")); - ps->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - - MyEventReceiver receiver(room, earth, env, driver); - device->setEventReceiver(&receiver); - - /* - Finally, draw everything. That's it. - */ - - int lastFPS = -1; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0)); - - smgr->drawAll(); - env->drawAll(); - - driver->endScene(); - - int fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw str = L"Per pixel lighting example - Irrlicht Engine ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/11.PerPixelLighting/tutorial.html b/examples/11.PerPixelLighting/tutorial.html deleted file mode 100644 index 89e87bd8..00000000 --- a/examples/11.PerPixelLighting/tutorial.html +++ /dev/null @@ -1,502 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 11. Per pixel lighting
-
-
-
-

This tutorial shows how to use one of the built in more complex materials - in irrlicht: Per pixel lighted surfaces using normal maps and parallax - mapping. It will also show how to use fog and moving particle systems. - And don't panic: You dont need any experience with shaders to use these - materials in Irrlicht.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
Lets start!
-
-

At first, we need to include all headers and do the stuff we always - do, like in nearly all other tutorials.

- - - - -
#include <irrlicht.h>
#include <iostream>

using namespace irr;

#pragma comment(lib, "Irrlicht.lib")
-

For this example, we need an event receiver, to make it possible - for the user to switch between the three available material types. - In addition, the event receiver will create some small GUI window - which displays what material is currently being used. There is nothing - special done in this class, so maybe you want to skip reading it.

- - - - -
class MyEventReceiver : public IEventReceiver
-{
-public:
-
-	MyEventReceiver(scene::ISceneNode* room, 
-		gui::IGUIEnvironment* env, video::IVideoDriver* driver)
-	{
-		// store pointer to room so we can change its drawing mode
-		Room = room;
-		Driver = driver;
-
-		// set a nicer font
-		gui::IGUISkin* skin = env->getSkin();
-		gui::IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
-		if (font)
-			skin->setFont(font);
-
-		// add window and listbox
-		gui::IGUIWindow* window = env->addWindow(
-			core::rect(490,390,630,470), false, L"Use 'E' + 'R' to change");
-
-		ListBox = env->addListBox(
-			core::rect(2,22,135,78), window);
-
-		ListBox->addItem(L"Diffuse");
-		ListBox->addItem(L"Bump mapping");
-		ListBox->addItem(L"Parallax mapping");
-		ListBox->setSelected(1);
-
-		// create problem text
-		ProblemText = env->addStaticText(
-			L"Your hardware or this renderer is not able to use the "\
-			L"needed shaders for this material. Using fall back materials.",
-			core::rect(150,20,470,60));
-
-		ProblemText->setOverrideColor(video::SColor(100,255,255,255));
-
-		// set start material (prefer parallax mapping if available)
-		video::IMaterialRenderer* renderer = 
-			Driver->getMaterialRenderer(video::EMT_PARALLAX_MAP_SOLID);
-		if (renderer && renderer->getRenderCapability() == 0)
-			ListBox->setSelected(2);
-
-		// set the material which is selected in the listbox
-		setMaterial();
-	}
-
-	bool OnEvent(const SEvent& event)
-	{
-		// check if user presses the key 'E' or 'R'
-		if (event.EventType == irr::EET_KEY_INPUT_EVENT &&
-			!event.KeyInput.PressedDown && Room && ListBox)
-		{
-			// change selected item in listbox 
-
-			int sel = ListBox->getSelected();
-			if (event.KeyInput.Key == irr::KEY_KEY_R)
-				++sel;
-			else
-			if (event.KeyInput.Key == irr::KEY_KEY_E)
-				--sel;
-			else 
-				return false;
-
-			if (sel > 2) sel = 0;
-			if (sel < 0) sel = 2;
-			ListBox->setSelected(sel);
-			
-			// set the material which is selected in the listbox
-			setMaterial();
-		}
-
-		return false;
-	}
-
-private:
-
-	// sets the material of the room mesh the the one set in the 
-	// list box.
-	void setMaterial()
-	{
-		video::E_MATERIAL_TYPE type = video::EMT_SOLID;
-
-		// change material setting
-		switch(ListBox->getSelected())
-		{
-		case 0: type = video::EMT_SOLID;
-			break;
-		case 1: type = video::EMT_NORMAL_MAP_SOLID;
-			break;
-		case 2: type = video::EMT_PARALLAX_MAP_SOLID;
-			break;
-		}
-
-		Room->setMaterialType(type);
-
-

We need to add a warning if the materials will not be able to be - displayed 100% correctly. This is no problem, they will be renderered - using fall back materials, but at least the user should know that - it would look better on better hardware. We simply check if the material - renderer is able to draw at full quality on the current hardware. - The IMaterialRenderer::getRenderCapability() returns 0 if this is - the case.
-

- - - - -
video::IMaterialRenderer* renderer = Driver->getMaterialRenderer(type);
-
-		// display some problem text when problem
-		if (!renderer || renderer->getRenderCapability() != 0)
-			ProblemText->setVisible(true);
-		else
-			ProblemText->setVisible(false);
-	}
-
-private:
-
-	gui::IGUIStaticText* ProblemText;
-	gui::IGUIListBox* ListBox;
-
-	scene::ISceneNode* Room;	
-	video::IVideoDriver* Driver;
-};
-


- Now for the real fun. We create an Irrlicht Device and start to setup - the scene.
-

- - - - -
int main()
-{
-	// let user select driver type
-
-	video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;
-
printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");
- char i; - std::cin >> i; - - switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
} - - // create device - - IrrlichtDevice* device = createDevice(driverType, core::dimension2d(640, 480)); - - if (device == 0) - return 1; // could not create selected driver. -
-
- Before we start with the interesting stuff, we do some simple things: - Store pointers to the most important parts of the engine (video driver,
- scene manager, gui environment) to safe us from typing too much, add - an irrlicht engine logo to the window and a user controlled first person - shooter style camera. Also, we let the engine now that it should store - all textures in 32 bit. This necessary because for parallax mapping, - we need 32 bit textures.
-
- - - - -
-	video::IVideoDriver* driver = device->getVideoDriver();
-	scene::ISceneManager* smgr = device->getSceneManager();
-	gui::IGUIEnvironment* env = device->getGUIEnvironment();
-
-	driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
-
-	// add irrlicht logo
-	env->addImage(driver->getTexture("../../media/irrlichtlogoalpha.tga"),
-		core::position2d(10,10));
-		
-	// add camera
-	scene::ICameraSceneNode* camera = 
-		smgr->addCameraSceneNodeFPS(0,100.0f,300.0f);
-	camera->setPosition(core::vector3df(-200,200,-200));
-
-	// disable mouse cursor
-	device->getCursorControl()->setVisible(false);
-
- Because we want the whole scene to look a little bit scarier, we add - some fog to it. This is done by a call to IVideoDriver::setFog(). There - you can set
- various fog settings. In this example, we use pixel fog, because it - will work well with the materials we'll use in this example. Please - note that you will have to set the material flag EMF_FOG_ENABLE to 'true' - in every scene node which should be affected by this fog.
-
- - - - -
driver->setFog(video::SColor(0,138,125,81), true, 250, 1000, 0, true);
-
- To be able to display something interesting, we load a mesh from a .3ds - file which is a room I modeled with anim8or. It is the same room as -
- from the specialFX example. Maybe you remember from that tutorial, I - am no good modeler at all and so I totally messed up the texture mapping - in this model, but we can simply repair it with the IMeshManipulator::makePlanarTextureMapping() - method.
-
- - - - -
	scene::IAnimatedMesh* roomMesh = smgr->getMesh(
-		"../../media/room.3ds");
-	scene::ISceneNode* room = 0;
-
-	if (roomMesh)
-	{
-		smgr->getMeshManipulator()->makePlanarTextureMapping(
-				roomMesh->getMesh(0), 0.003f);
-
- Now for the first exciting thing: If we successfully loaded the mesh - we need to apply textures to it. Because we want this room to be displayed - with a very cool material, we have to do a little bit more than just - set the textures. Instead of only loading a color map as usual, we also - load a height map which is simply a grayscale texture. From this height - map, we create a normal map which we will set as second texture of the - room. If you already have a normal map, you could directly set it, but - I simply didn´t find a nice normal map for this texture. The normal - map texture is being generated by the makeNormalMapTexture method
- of the VideoDriver. The second parameter specifies the height of the - heightmap. If you set it to a bigger value, the map will look more rocky.
-
- - - - -
		video::ITexture* colorMap = driver->getTexture("../../media/rockwall.bmp");
-		video::ITexture* normalMap = driver->getTexture("../../media/rockwall_height.bmp");
-		
-		driver->makeNormalMapTexture(normalMap, 9.0f);
-
- But just setting color and normal map is not everything. The material - we want to use needs some additional informations per vertex like tangents - and binormals.
- Because we are too lazy to calculate that information now, we let Irrlicht - do this for us. That's why we call IMeshManipulator::createMeshWithTangents(). - It
- creates a mesh copy with tangents and binormals from any other mesh. - After we've done that, we simply create a standard mesh scene node with - this
- mesh copy, set color and normal map and adjust some other material settings. - Note that we set EMF_FOG_ENABLE to true to enable fog in the room.
-
- - - - -
scene::IMesh* tangentMesh = smgr->getMeshManipulator()->createMeshWithTangents(
roomMesh->getMesh(0));

room = smgr->addMeshSceneNode(tangentMesh);
room->setMaterialTexture(0, colorMap);
room->setMaterialTexture(1, normalMap);
room->getMaterial(0).SpecularColor.set(0,0,0,0);
room->setMaterialFlag(video::EMF_FOG_ENABLE, true);
room->setMaterialType(video::EMT_PARALLAX_MAP_SOLID);
room->getMaterial(0).MaterialTypeParam = 0.02f; // adjust height for parallax effect
// drop mesh because we created it with a create.. call.
tangentMesh->drop();
}
-
- After we've created a room shaded by per pixel lighting, we add a sphere - into it with the same material, but we'll make it transparent. In addition,
- because the sphere looks somehow like a familiar planet, we make it - rotate. The procedure is similar as before. The difference is that we - are loading
- the mesh from an .x file which already contains a color map so we do - not need to load it manually. But the sphere is a little bit too small - for our needs, so we scale it by the factor 50.
-
- - - - -
// add earth sphere
-
-	scene::IAnimatedMesh* earthMesh = smgr->getMesh("../../media/earth.x");
-	if (earthMesh)
-	{
-		// create mesh copy with tangent informations from original earth.x mesh
-		scene::IMesh* tangentSphereMesh = 
-			smgr->getMeshManipulator()->createMeshWithTangents(earthMesh->getMesh(0));
-
-		// set the alpha value of all vertices to 200
-		smgr->getMeshManipulator()->setVertexColorAlpha(tangentSphereMesh, 200);
-		
-		// scale the mesh by factor 50
-		smgr->getMeshManipulator()->scaleMesh(
-			tangentSphereMesh, core::vector3df(50,50,50));
-
-		// create mesh scene node
-		scene::ISceneNode* sphere = smgr->addMeshSceneNode(tangentSphereMesh);
-		sphere->setPosition(core::vector3df(-70,130,45));
-
-		// load heightmap, create normal map from it and set it
-		video::ITexture* earthNormalMap = driver->getTexture("../../media/earthbump.bmp");
-		driver->makeNormalMapTexture(earthNormalMap, 20.0f);
-		sphere->setMaterialTexture(1, earthNormalMap);
-
-		// adjust material settings
-		sphere->setMaterialFlag(video::EMF_FOG_ENABLE, true);
-		sphere->setMaterialType(video::EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA); 
-
-		// add rotation animator
-		scene::ISceneNodeAnimator* anim =
-			smgr->createRotationAnimator(core::vector3df(0,0.1f,0));	
-		sphere->addAnimator(anim);
-		anim->drop();
-
-		// drop mesh because we created it with a create.. call.
-		tangentSphereMesh->drop();
-	}
-
- Per pixel lighted materials only look cool when there are moving lights. - So we add some. And because moving lights alone are so boring, we add - billboards
- to them, and a whole particle system to one of them. We start with the - first light which is red and has only the billboard attached.
-
- - - - -
// add light 1 (nearly red)
-	scene::ILightSceneNode* light1 = 
-		smgr->addLightSceneNode(0, core::vector3df(0,0,0), 
-		video::SColorf(0.5f, 1.0f, 0.5f, 0.0f), 200.0f);
-
-	// add fly circle animator to light 1
-	scene::ISceneNodeAnimator* anim = 
-		smgr->createFlyCircleAnimator (core::vector3df(50,300,0),190.0f, -0.003f);
-	light1->addAnimator(anim);
-	anim->drop();
-
-	// attach billboard to the light
-	scene::ISceneNode* bill = 
-		smgr->addBillboardSceneNode(light1, core::dimension2d(60, 60));
-
-	bill->setMaterialFlag(video::EMF_LIGHTING, false);
-	bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
-	bill->setMaterialTexture(0, driver->getTexture("../../media/particlered.bmp"));
-
- Now the same again, with the second light. The difference is that we - add a particle system to it too. And because the light moves, the particles - of the particlesystem will follow. If you want to know more about how - particle systems are created in Irrlicht, take a look at the specialFx - example.
- Maybe you will have noticed that we only add 2 lights, this has a simple - reason: The low end version of this material was written in ps1.1 and - vs1.1, which doesn't allow more lights. You could add a third light - to the scene, but it won't be used to shade the walls. But of course, - this will change in future versions of Irrlicht were higher versions - of pixel/vertex shaders will be implemented too.
-
- - - - -
// add light 2 (gray)
-	scene::ISceneNode* light2 = 
-		smgr->addLightSceneNode(0, core::vector3df(0,0,0), 
-		video::SColorf(1.0f, 0.2f, 0.2f, 0.0f), 200.0f);
-
-	// add fly circle animator to light 2
-	anim = smgr->createFlyCircleAnimator (core::vector3df(0,150,0),200.0f); 
-	light2->addAnimator(anim);
-	anim->drop();
-
-	// attach billboard to light
-	bill = smgr->addBillboardSceneNode(light2, core::dimension2d(120, 120));
-	bill->setMaterialFlag(video::EMF_LIGHTING, false);
-	bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
-	bill->setMaterialTexture(0, driver->getTexture("../../media/particlewhite.bmp"));
-
-	// add particle system
-	scene::IParticleSystemSceneNode* ps = 
-		smgr->addParticleSystemSceneNode(false, light2);
-
-	ps->setParticleSize(core::dimension2d(30.0f, 40.0f));
-
-	// create and set emitter
-	scene::IParticleEmitter* em = ps->createBoxEmitter(
-		core::aabbox3d(-3,0,-3,3,1,3), 
-		core::vector3df(0.0f,0.03f,0.0f),
-		80,100, 
-		video::SColor(0,255,255,255), video::SColor(0,255,255,255),
-		400,1100);
-	ps->setEmitter(em);
-	em->drop();
-
-	// create and set affector
-	scene::IParticleAffector* paf = ps->createFadeOutParticleAffector();
-	ps->addAffector(paf);
-	paf->drop();
-
-	// adjust some material settings
-	ps->setMaterialFlag(video::EMF_LIGHTING, false);
-	ps->setMaterialTexture(0, driver->getTexture("../../media/fireball.bmp"));
-	ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
-
-
-	MyEventReceiver receiver(room, env, driver);
-	device->setEventReceiver(&receiver);
-
- Finally, draw everything. That's it.
-
- - - - -
int lastFPS = -1;
-
-	while(device->run())
-	if (device->isWindowActive())
-	{
-		driver->beginScene(true, true, 0);
-
-		smgr->drawAll();
-		env->drawAll();
-
-		driver->endScene();
-
-		int fps = driver->getFPS();
-
-		if (lastFPS != fps)
-		{
-		  core::stringw str = L"Per pixel lighting example - Irrlicht Engine [";
-		  str += driver->getName();
-		  str += "] FPS:";
-		  str += fps;
-
-		  device->setWindowCaption(str.c_str());
-		  lastFPS = fps;
-		}
-	}
-
-	device->drop();
-	
-	return 0;
-}
-
-
-
-
-
-

 

- - diff --git a/examples/12.TerrainRendering/Makefile b/examples/12.TerrainRendering/Makefile deleted file mode 100644 index 362bf06e..00000000 --- a/examples/12.TerrainRendering/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 12.TerrainRendering -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/12.TerrainRendering/TerrainRendering.cbp b/examples/12.TerrainRendering/TerrainRendering.cbp deleted file mode 100644 index 2bf6dead..00000000 --- a/examples/12.TerrainRendering/TerrainRendering.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/12.TerrainRendering/TerrainRendering.vcproj b/examples/12.TerrainRendering/TerrainRendering.vcproj deleted file mode 100644 index 22005623..00000000 --- a/examples/12.TerrainRendering/TerrainRendering.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/12.TerrainRendering/TerrainRendering.xcodeproj/project.pbxproj b/examples/12.TerrainRendering/TerrainRendering.xcodeproj/project.pbxproj deleted file mode 100644 index 63b8efe1..00000000 --- a/examples/12.TerrainRendering/TerrainRendering.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 12.TerrainRendering.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 12.TerrainRendering.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 12.TerrainRendering.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 12.TerrainRendering */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "12.TerrainRendering" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 12.TerrainRendering; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 12.TerrainRendering.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "TerrainRendering" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 12.TerrainRendering */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "TerrainRendering" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "12.TerrainRendering" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/12.TerrainRendering/TerrainRendering.xcodeproj/xcshareddata/xcschemes/12.TerrainRendering.xcscheme b/examples/12.TerrainRendering/TerrainRendering.xcodeproj/xcshareddata/xcschemes/12.TerrainRendering.xcscheme deleted file mode 100644 index 13efddb9..00000000 --- a/examples/12.TerrainRendering/TerrainRendering.xcodeproj/xcshareddata/xcschemes/12.TerrainRendering.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/12.TerrainRendering/TerrainRendering_vc10.vcxproj b/examples/12.TerrainRendering/TerrainRendering_vc10.vcxproj deleted file mode 100644 index 22bd8b6d..00000000 --- a/examples/12.TerrainRendering/TerrainRendering_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 12.TerrainRendering - {3A5B74E5-6390-43B0-A459-2793B81FFD31} - TerrainRendering - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/12.TerrainRendering/TerrainRendering_vc11.vcxproj b/examples/12.TerrainRendering/TerrainRendering_vc11.vcxproj deleted file mode 100644 index 22bd8b6d..00000000 --- a/examples/12.TerrainRendering/TerrainRendering_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 12.TerrainRendering - {3A5B74E5-6390-43B0-A459-2793B81FFD31} - TerrainRendering - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/12.TerrainRendering/TerrainRendering_vc12.vcxproj b/examples/12.TerrainRendering/TerrainRendering_vc12.vcxproj deleted file mode 100644 index 4fb6b9b8..00000000 --- a/examples/12.TerrainRendering/TerrainRendering_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 12.TerrainRendering - {3A5B74E5-6390-43B0-A459-2793B81FFD31} - TerrainRendering - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/12.TerrainRendering/TerrainRendering_vc14.vcxproj b/examples/12.TerrainRendering/TerrainRendering_vc14.vcxproj deleted file mode 100644 index bf067fa2..00000000 --- a/examples/12.TerrainRendering/TerrainRendering_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 12.TerrainRendering - {3A5B74E5-6390-43B0-A459-2793B81FFD31} - TerrainRendering - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/TerrainRendering.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/TerrainRendering.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\12.TerrainRendering.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/12.TerrainRendering/main.cpp b/examples/12.TerrainRendering/main.cpp deleted file mode 100644 index f9bc97e6..00000000 --- a/examples/12.TerrainRendering/main.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/** Example 012 Terrain Rendering - -This tutorial will briefly show how to use the terrain renderer of Irrlicht. It -will also show the terrain renderer triangle selector to be able to do -collision detection with terrain. - -Note that the Terrain Renderer in Irrlicht is based on Spintz' -GeoMipMapSceneNode, lots of thanks go to him. DeusXL provided a new elegant -simple solution for building larger area on small heightmaps -> terrain -smoothing. - -In the beginning there is nothing special. We include the needed header files -and create an event listener to listen if the user presses certain keys. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - - -class MyEventReceiver : public IEventReceiver -{ -public: - - MyEventReceiver(scene::ISceneNode* terrain, scene::ISceneNode* skybox, scene::ISceneNode* skydome) : - Terrain(terrain), Skybox(skybox), Skydome(skydome), showBox(true), showDebug(false) - { - Skybox->setVisible(showBox); - Skydome->setVisible(!showBox); - } - - bool OnEvent(const SEvent& event) - { - // check if user presses the key 'W' or 'D' - if (event.EventType == irr::EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown) - { - switch (event.KeyInput.Key) - { - case irr::KEY_KEY_W: // switch wire frame mode - Terrain->setMaterialFlag(video::EMF_WIREFRAME, - !Terrain->getMaterial(0).Wireframe); - Terrain->setMaterialFlag(video::EMF_POINTCLOUD, false); - return true; - case irr::KEY_KEY_P: // switch point cloud mode - Terrain->setMaterialFlag(video::EMF_POINTCLOUD, - !Terrain->getMaterial(0).PointCloud); - Terrain->setMaterialFlag(video::EMF_WIREFRAME, false); - return true; - case irr::KEY_KEY_D: // toggle detail map - Terrain->setMaterialType( - Terrain->getMaterial(0).MaterialType == video::EMT_SOLID ? - video::EMT_DETAIL_MAP : video::EMT_SOLID); - return true; - case irr::KEY_KEY_S: // toggle skies - showBox=!showBox; - Skybox->setVisible(showBox); - Skydome->setVisible(!showBox); - return true; - case irr::KEY_KEY_X: // toggle debug information - showDebug=!showDebug; - Terrain->setDebugDataVisible(showDebug?scene::EDS_BBOX_ALL:scene::EDS_OFF); - return true; - default: - break; - } - } - - return false; - } - -private: - scene::ISceneNode* Terrain; - scene::ISceneNode* Skybox; - scene::ISceneNode* Skydome; - bool showBox; - bool showDebug; -}; - - -/* -The start of the main function starts like in most other example. We ask the -user for the desired renderer and start it up. This time with the advanced -parameter handling. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device with full flexibility over creation parameters - // you can add more parameters if desired, check irr::SIrrlichtCreationParameters - irr::SIrrlichtCreationParameters params; - params.DriverType=driverType; - params.WindowSize=core::dimension2d(640, 480); - IrrlichtDevice* device = createDeviceEx(params); - - if (device == 0) - return 1; // could not create selected driver. - - - /* - First, we add standard stuff to the scene: A nice irrlicht engine - logo, a small help text, a user controlled camera, and we disable - the mouse cursor. - */ - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* env = device->getGUIEnvironment(); - - driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true); - - const io::path mediaPath = getExampleMediaPath(); - - // add irrlicht logo - env->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), - core::position2d(10,10)); - - //set other font - env->getSkin()->setFont(env->getFont(mediaPath + "fontlucida.png")); - - // add some help text (let's ignore 'P' and 'X' which are more about debugging) - env->addStaticText( - L"Press 'W' to change wireframe mode\nPress 'D' to toggle detail map\nPress 'S' to toggle skybox/skydome", - core::rect(10,421,250,475), true, true, 0, -1, true); - - // add camera - scene::ICameraSceneNode* camera = - smgr->addCameraSceneNodeFPS(0,100.0f,1.2f); - - camera->setPosition(core::vector3df(2700*2,255*2,2600*2)); - camera->setTarget(core::vector3df(2397*2,343*2,2700*2)); - camera->setFarValue(42000.0f); - - // disable mouse cursor - device->getCursorControl()->setVisible(false); - - /* - Here comes the terrain renderer scene node: We add it just like any - other scene node to the scene using - ISceneManager::addTerrainSceneNode(). The first parameter is a - file name to the heightmap we use. A heightmap is simply a gray scale - texture. The terrain renderer loads it and creates the 3D terrain from - it. - - To make the terrain look bigger, we change it's scale factor to - (40, 4.4, 40). Because we don't have any dynamic lights in the - scene, we switch off the lighting, and we set the file - terrain-texture.jpg as texture for the terrain and detailmap3.jpg as - second texture, called detail map. At last, we set the scale values for - the texture: The first texture will be repeated only one time over the - whole terrain, and the second one (detail map) 20 times. - */ - - // add terrain scene node - scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode( - mediaPath + "terrain-heightmap.bmp", - 0, // parent node - -1, // node id - core::vector3df(0.f, 0.f, 0.f), // position - core::vector3df(0.f, 0.f, 0.f), // rotation - core::vector3df(40.f, 4.4f, 40.f), // scale - video::SColor ( 255, 255, 255, 255 ), // vertexColor - 5, // maxLOD - scene::ETPS_17, // patchSize - 4 // smoothFactor - ); - - terrain->setMaterialFlag(video::EMF_LIGHTING, false); - - terrain->setMaterialTexture(0, - driver->getTexture(mediaPath + "terrain-texture.jpg")); - terrain->setMaterialTexture(1, - driver->getTexture(mediaPath + "detailmap3.jpg")); - - terrain->setMaterialType(video::EMT_DETAIL_MAP); - - terrain->scaleTexture(1.0f, 20.0f); - - /* - To be able to do collision with the terrain, we create a triangle selector. - If you want to know what triangle selectors do, just take a look into the - collision tutorial. The terrain triangle selector works together with the - terrain. To demonstrate this, we create a collision response animator - and attach it to the camera, so that the camera will not be able to fly - through the terrain. - */ - - // create triangle selector for the terrain - scene::ITriangleSelector* selector - = smgr->createTerrainTriangleSelector(terrain, 0); - terrain->setTriangleSelector(selector); - - // create collision response animator and attach it to the camera - scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( - selector, camera, core::vector3df(60,100,60), - core::vector3df(0,0,0), - core::vector3df(0,50,0)); - selector->drop(); - camera->addAnimator(anim); - anim->drop(); - - /* If you need access to the terrain data you can also do this directly via the following code fragment. - */ - scene::CDynamicMeshBuffer* buffer = new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT); - terrain->getMeshBufferForLOD(*buffer, 0); - video::S3DVertex2TCoords* data = (video::S3DVertex2TCoords*)buffer->getVertexBuffer().getData(); - // Work on data or get the IndexBuffer with a similar call. - (void)data; // disable unused variable warnings - buffer->drop(); // When done drop the buffer again. - - /* - To make the user be able to switch between normal and wireframe mode, - we create an instance of the event receiver from above and let Irrlicht - know about it. In addition, we add the skybox which we already used in - lots of Irrlicht examples and a skydome, which is shown mutually - exclusive with the skybox by pressing 'S'. - */ - - // create skybox and skydome - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - - scene::ISceneNode* skybox=smgr->addSkyBoxSceneNode( - driver->getTexture(mediaPath + "irrlicht2_up.jpg"), - driver->getTexture(mediaPath + "irrlicht2_dn.jpg"), - driver->getTexture(mediaPath + "irrlicht2_lf.jpg"), - driver->getTexture(mediaPath + "irrlicht2_rt.jpg"), - driver->getTexture(mediaPath + "irrlicht2_ft.jpg"), - driver->getTexture(mediaPath + "irrlicht2_bk.jpg")); - scene::ISceneNode* skydome=smgr->addSkyDomeSceneNode(driver->getTexture(mediaPath + "skydome.jpg"),16,8,0.95f,2.0f); - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true); - - // create event receiver - MyEventReceiver receiver(terrain, skybox, skydome); - device->setEventReceiver(&receiver); - - /* - That's it, draw everything. - */ - - int lastFPS = -1; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0)); - - smgr->drawAll(); - env->drawAll(); - - driver->endScene(); - - // display frames per second in window title - int fps = driver->getFPS(); - if (lastFPS != fps) - { - core::stringw str = L"Terrain Renderer - Irrlicht Engine ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - // Also print terrain height of current camera position - // We can use camera position because terrain is located at coordinate origin - str += " Height: "; - str += terrain->getHeight(camera->getAbsolutePosition().X, - camera->getAbsolutePosition().Z); - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - - device->drop(); - - return 0; -} - -/* -Now you know how to use terrain in Irrlicht. -**/ diff --git a/examples/12.TerrainRendering/tutorial.html b/examples/12.TerrainRendering/tutorial.html deleted file mode 100644 index f3d765f9..00000000 --- a/examples/12.TerrainRendering/tutorial.html +++ /dev/null @@ -1,122 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 12. Terrain Rendering
-
-
-
-

This tutorial will briefly show how to use the terrain renderer of - Irrlicht. It will also show the terrain renderer triangle selector to - be able to do collision detection with terrain.

-

The program which is described here will look like this:

-

-


- Note that the terrain renderer in Irrlicht is based the terrain renderer - by Soconne and the GeoMipMapSceneNode developed by Spinz, lots of thanks - go to them.

-
-
-
- - - - - - - -
Lets start!
-
-

In the beginning there is nothing special. We include the needed - header files and create an event listener to listen if the user presses - the 'W' key so we can switch to wireframe mode and if he presses 'D' - we toggle to material between solid and detail mapped.

- - - - -
#include <irrlicht.h>
#include <iostream>
using namespace irr;

#pragma comment(lib, "Irrlicht.lib")

class MyEventReceiver : public IEventReceiver
{
public:
MyEventReceiver(scene::ISceneNode* terrain)
{
// store pointer to terrain so we can change its drawing mode
Terrain = terrain;
}

bool OnEvent(const SEvent& event)
{
// check if user presses the key 'W' or 'D'
if (event.EventType == irr::EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown)
{
switch (event.KeyInput.Key)
{
case irr::KEY_KEY_W: // switch wire frame mode
Terrain->setMaterialFlag(video::EMF_WIREFRAME, !Terrain->getMaterial(0).Wireframe);
return true;
case irr::KEY_KEY_D: // toggle detail map
Terrain->setMaterialType(
Terrain->getMaterial(0).MaterialType == video::EMT_SOLID ?
video::EMT_DETAIL_MAP : video::EMT_SOLID);
return true;
}
}
return false;
}

private:
scene::ISceneNode* Terrain;
};

-

The start of the main function starts like in most other example. - We ask the user for the desired renderer and start it up.

- - - - -
int main()
{
// let user select driver type

video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
}

// create device
IrrlichtDevice* device = createDevice(driverType, core::dimension2d<s32>(640, 480));

if (device == 0)
return 1; // could not create selected driver.
-

First, we add standard stuff to the scene: A nice irrlicht engine - logo, a small help text, a user controlled camera, and we disable - the mouse cursor.

- - - - -
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* env = device->getGUIEnvironment();

driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);

// add irrlicht logo
env->addImage(driver->getTexture("../../media/irrlichtlogoalpha.tga"),
core::position2d<s32>(10,10));
-// add some help text
gui::IGUIStaticText* text = env->addStaticText(
L"Press 'W' to change wireframe mode\nPress 'D' to toggle detail map",
core::rect<s32>(10,453,200,475), true, true, 0, -1, true);
-// add camera
scene::ICameraSceneNode* camera =
smgr->addCameraSceneNodeFPS(0,100.0f,1200.0f);
camera->setPosition(core::vector3df(1900*2,255*2,3700*2));
camera->setTarget(core::vector3df(2397*2,343*2,2700*2));
camera->setFarValue(12000.0f);

// disable mouse cursor
device->getCursorControl()->setVisible(false);
-

Here comes the terrain renderer scene node: We add it just like - any other scene node to the scene using ISceneManager::addTerrainSceneNode(). - The only parameter we use is a file name to the heightmap we use. - A heightmap is simply a gray scale texture. The terrain renderer loads - it and creates the 3D terrain from it.
- To make the terrain look more big, we change the scale factor of it - to (40, 4.4, 40). Because we don't have any dynamic lights in the - scene, we switch off the lighting, and we set the file terrain-texture.jpg - as texture for the terrain and detailmap3.jpg as second texture, called - detail map. At last, we set the scale values for the texture: The - first texture will be repeated only one time over the whole terrain, - and the second one (detail map) 20 times.

- - - - -
// add terrain scene node
scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
"../../media/terrain-heightmap.bmp");

terrain->setScale(core::vector3df(40, 4.4f, 40));
terrain->setMaterialFlag(video::EMF_LIGHTING, false);

terrain->setMaterialTexture(0, driver->getTexture("../../media/terrain-texture.jpg"));
terrain->setMaterialTexture(1, driver->getTexture("../../media/detailmap3.jpg"));

terrain->setMaterialType(video::EMT_DETAIL_MAP);
terrain->scaleTexture(1.0f, 20.0f);
-

To be able to do collision with the terrain, we create a triangle - selector. If you want to know what triangle selectors do, just take - a look into the collision tutorial. The terrain triangle selector - works together with the terrain. To demonstrate this, we create a - collision response animator and attach it to the camera, so that the - camera will not be able to fly through the terrain.

-
- - - - -
// create triangle selector for the terrain	
scene::ITriangleSelector* selector =
smgr->createTerrainTriangleSelector(terrain, 0);
terrain->setTriangleSelector(selector);

// create collision response animator and attach it to the camera
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(60,100,60),
core::vector3df(0,0,0),
core::vector3df(0,50,0));
selector->drop();
camera->addAnimator(anim);
anim->drop();
-

To make the user be able to switch between normal and wireframe mode, - we create an instance of the event reciever from above and let Irrlicht - know about it. In addition, we add the skybox which we already used - in lots of Irrlicht examples.

- - - - -
// create event receiver
MyEventReceiver receiver(terrain);
device->setEventReceiver(&receiver);

// create skybox
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);

smgr->addSkyBoxSceneNode(
driver->getTexture("../../media/irrlicht2_up.jpg"),
driver->getTexture("../../media/irrlicht2_dn.jpg"),
driver->getTexture("../../media/irrlicht2_lf.jpg"),
driver->getTexture("../../media/irrlicht2_rt.jpg"),
driver->getTexture("../../media/irrlicht2_ft.jpg"),
driver->getTexture("../../media/irrlicht2_bk.jpg"));
-driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
-

That's it, draw everything. Now you know how to use terrain in Irrlicht.

- - - - -
	int lastFPS = -1;

while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, 0 );

smgr->drawAll();
env->drawAll();

driver->endScene(); -
// display frames per second in window title - int fps = driver->getFPS();

if (lastFPS != fps)
{
core::stringw str = L"Terrain Renderer - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}

device->drop();

return 0;
}
-

 

-
-
-

 

- - diff --git a/examples/13.RenderToTexture/Makefile b/examples/13.RenderToTexture/Makefile deleted file mode 100644 index 1022075a..00000000 --- a/examples/13.RenderToTexture/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 13.RenderToTexture -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/13.RenderToTexture/RenderToTexture.cbp b/examples/13.RenderToTexture/RenderToTexture.cbp deleted file mode 100644 index 78c760b6..00000000 --- a/examples/13.RenderToTexture/RenderToTexture.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/13.RenderToTexture/RenderToTexture.vcproj b/examples/13.RenderToTexture/RenderToTexture.vcproj deleted file mode 100644 index 8fd8e6c2..00000000 --- a/examples/13.RenderToTexture/RenderToTexture.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/13.RenderToTexture/RenderToTexture.xcodeproj/project.pbxproj b/examples/13.RenderToTexture/RenderToTexture.xcodeproj/project.pbxproj deleted file mode 100644 index f2f6fb31..00000000 --- a/examples/13.RenderToTexture/RenderToTexture.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 13.RenderToTexture.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 13.RenderToTexture.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 13.RenderToTexture.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 13.RenderToTexture */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "13.RenderToTexture" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 13.RenderToTexture; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 13.RenderToTexture.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "RenderToTexture" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 13.RenderToTexture */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "RenderToTexture" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "13.RenderToTexture" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/13.RenderToTexture/RenderToTexture.xcodeproj/xcshareddata/xcschemes/13.RenderToTexture.xcscheme b/examples/13.RenderToTexture/RenderToTexture.xcodeproj/xcshareddata/xcschemes/13.RenderToTexture.xcscheme deleted file mode 100644 index 3c99c7ce..00000000 --- a/examples/13.RenderToTexture/RenderToTexture.xcodeproj/xcshareddata/xcschemes/13.RenderToTexture.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/13.RenderToTexture/RenderToTexture_vc10.vcxproj b/examples/13.RenderToTexture/RenderToTexture_vc10.vcxproj deleted file mode 100644 index b41b2772..00000000 --- a/examples/13.RenderToTexture/RenderToTexture_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 13.RenderToTexture - {0914E5C8-5352-467B-8421-C9EB35BD5596} - RenderToTexture - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/13.RenderToTexture/RenderToTexture_vc11.vcxproj b/examples/13.RenderToTexture/RenderToTexture_vc11.vcxproj deleted file mode 100644 index b41b2772..00000000 --- a/examples/13.RenderToTexture/RenderToTexture_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 13.RenderToTexture - {0914E5C8-5352-467B-8421-C9EB35BD5596} - RenderToTexture - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/13.RenderToTexture/RenderToTexture_vc12.vcxproj b/examples/13.RenderToTexture/RenderToTexture_vc12.vcxproj deleted file mode 100644 index 5ede2aee..00000000 --- a/examples/13.RenderToTexture/RenderToTexture_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 13.RenderToTexture - {0914E5C8-5352-467B-8421-C9EB35BD5596} - RenderToTexture - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/13.RenderToTexture/RenderToTexture_vc14.vcxproj b/examples/13.RenderToTexture/RenderToTexture_vc14.vcxproj deleted file mode 100644 index 5316976e..00000000 --- a/examples/13.RenderToTexture/RenderToTexture_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 13.RenderToTexture - {0914E5C8-5352-467B-8421-C9EB35BD5596} - RenderToTexture - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/RenderToTexture.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/RenderToTexture.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\13.RenderToTexture.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/13.RenderToTexture/main.cpp b/examples/13.RenderToTexture/main.cpp deleted file mode 100644 index 99a18eac..00000000 --- a/examples/13.RenderToTexture/main.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/** Example 013 Render To Texture - -This tutorial shows how to render to a texture using Irrlicht. Render to -texture is a feature where everything which would usually be rendered to -the screen is instead written to a (special) texture. This can be used to -create nice special effects. -In addition, this tutorial shows how to enable specular highlights. - -In the beginning, everything as usual. Include the needed headers, ask the user -for the rendering driver, create the Irrlicht device: -*/ - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device and exit if creation failed - - IrrlichtDevice *device = - createDevice(driverType, core::dimension2d(640, 480), - 16, false, false); - - if (device == 0) - return 1; // could not create selected driver. - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* env = device->getGUIEnvironment(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - Now, we load an animated mesh to be displayed. As in most examples, - we'll take the fairy md2 model. The difference here: We set the - shininess of the model to a value other than 0 which is the default - value. This enables specular highlights on the model if dynamic - lighting is on. The value influences the size of the highlights. - */ - - // load and display animated fairy mesh - - scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode( - smgr->getMesh(mediaPath + "faerie.md2")); - - if (fairy) - { - fairy->setMaterialTexture(0, - driver->getTexture(mediaPath + "faerie2.bmp")); // set diffuse texture - fairy->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting - fairy->getMaterial(0).Shininess = 20.0f; // set size of specular highlights - fairy->setPosition(core::vector3df(-10,0,-100)); - fairy->setMD2Animation ( scene::EMAT_STAND ); - } - - /* - To make specular highlights appear on the model, we need a dynamic - light in the scene. We add one directly in vicinity of the model. In - addition, to make the model not that dark, we set the ambient light to - gray. - */ - - // add white light - smgr->addLightSceneNode(0, core::vector3df(-15,5,-105), - video::SColorf(1.0f, 1.0f, 1.0f)); - - // set ambient light - smgr->setAmbientLight(video::SColor(0,60,60,60)); - - /* - The next is just some standard stuff: Add a test cube and let it rotate - to make the scene more interesting. The user defined camera and cursor - setup is made later on, right before the render loop. - */ - - // create test cube - scene::ISceneNode* cube = smgr->addCubeSceneNode(60); - - // let the cube rotate and set some light settings - scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator( - core::vector3df(0.3f, 0.3f,0)); - - cube->setPosition(core::vector3df(-100,0,-100)); - cube->setMaterialFlag(video::EMF_LIGHTING, false); // disable dynamic lighting - cube->addAnimator(anim); - anim->drop(); - - // set window caption - device->setWindowCaption(L"Irrlicht Engine - Render to Texture and Specular Highlights example"); - - /* - To test out the render to texture feature, we need to define our - new rendertarget. The rendertarget will need one texture to receive - the result you would otherwise see on screen and one texture - which is used as depth-buffer. - - (Note: If you worked with older Irrlicht versions (before 1.9) you might be - used to only create a rendertarget texture and no explicit rendertarget. While - that's still possible, it's no longer recommended.) - - The rendertarget textures are not like standard textures, but need to be created - first. To create them, we call IVideoDriver::addRenderTargetTexture() - and specify the size of the texture and the type. - For depth-maps you can use types ECF_D16, ECF_D32 or ECF_D24S8. When ECF_D24S8 - you can also use a stencil-buffer. - - Because we want to render the scene not from the user camera into the - texture, we add another fixed camera to the scene. But before we do all - this, we check if the current running driver is able to render to - textures. If it is not, we simply display a warning text. - */ - - // create render target - video::IRenderTarget* renderTarget = 0; - scene::ICameraSceneNode* fixedCam = 0; - - if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET)) - { - const core::dimension2d rtDim(256, 256); // always use same size for render target texture and it's depth-buffer - video::ITexture* renderTargetTex = driver->addRenderTargetTexture(rtDim, "RTT1", video::ECF_A8R8G8B8); - video::ITexture* renderTargetDepth = driver->addRenderTargetTexture(rtDim, "DepthStencil", video::ECF_D16); - - renderTarget = driver->addRenderTarget(); - renderTarget->setTexture(renderTargetTex, renderTargetDepth); - - cube->setMaterialTexture(0, renderTargetTex); // set material of cube to render target - - // add fixed camera - fixedCam = smgr->addCameraSceneNode(0, core::vector3df(10,10,-80), - core::vector3df(-10,10,-100)); - } - else - { - // create problem text - gui::IGUISkin* skin = env->getSkin(); - gui::IGUIFont* font = env->getFont(mediaPath + "fonthaettenschweiler.bmp"); - if (font) - skin->setFont(font); - - gui::IGUIStaticText* text = env->addStaticText( - L"Your hardware or this renderer is not able to use the "\ - L"render to texture feature. RTT Disabled.", - core::rect(150,20,470,60)); - - text->setOverrideColor(video::SColor(100,255,255,255)); - } - - // add fps camera - scene::ICameraSceneNode* fpsCamera = smgr->addCameraSceneNodeFPS(); - fpsCamera->setPosition(core::vector3df(-50,50,-150)); - - // disable mouse cursor - device->getCursorControl()->setVisible(false); - - /* - Nearly finished. Now we need to draw everything. Every frame, we draw - the scene twice. Once from the fixed camera into the render target - texture and once as usual. When rendering into the render target, we - need to disable the visibility of the test cube, because it has the - render target texture applied to it. That's it, wasn't too complicated - I hope. :) - */ - - int lastFPS = -1; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0)); - - if (renderTarget) - { - // draw scene into render target - - // set render target - driver->setRenderTargetEx(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0,0,0,255)); - - // make cube invisible and set fixed camera as active camera - cube->setVisible(false); - smgr->setActiveCamera(fixedCam); - - // draw whole scene into render buffer - smgr->drawAll(); - - // set back old render target (the screen) - driver->setRenderTargetEx(0, 0); - - // make the cube visible and set the user controlled camera as active one - cube->setVisible(true); - smgr->setActiveCamera(fpsCamera); - } - - // draw scene normally - smgr->drawAll(); - env->drawAll(); - - driver->endScene(); - - // display frames per second in window title - int fps = driver->getFPS(); - if (lastFPS != fps) - { - core::stringw str = L"Irrlicht Engine - Render to Texture and Specular Highlights example"; - str += " FPS:"; - str += fps; - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - - device->drop(); // drop device - return 0; -} - -/* -**/ diff --git a/examples/13.RenderToTexture/tutorial.html b/examples/13.RenderToTexture/tutorial.html deleted file mode 100644 index 26340a3e..00000000 --- a/examples/13.RenderToTexture/tutorial.html +++ /dev/null @@ -1,244 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 13. Render to Texture
-
-
-
-

This tutorial shows how to render to a texture using Irrlicht. Render - to texture is a feature with which it is possible to create nice special - effects. In addition, this tutorial shows how to enable specular highlights.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
Lets start!
-
-

In the beginning, everything as usual. Include the needed headers, - ask the user for the rendering driver, create the Irrlicht Device:

- - - - -
#include <irrlicht.h>
-#include <iostream>
-
-using namespace irr;
-
-#pragma comment(lib, "Irrlicht.lib")
-
-int main()
-{
-	// let user select driver type
-
-	video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;
-
-	printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n"); - - char i; - std::cin >> i; - - switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
} - - // create device and exit if creation failed - - IrrlichtDevice *device = - createDevice(driverType, core::dimension2d(640, 480), - 16, false, false); - - if (device == 0) - return 1; // could not create selected driver. - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* env = device->getGUIEnvironment();
-

Now, we load an animated mesh to be displayed. As in most examples, - we'll take the fairy md2 model. The difference here: We set the shininess
- of the model to a value other than 0 which is the default value. This - enables specular highlights on the model if dynamic lighting is on. - The value influences the size of the highlights.

- - - - -
// load and display animated fairy mesh
-
-	scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode(
-		smgr->getMesh("../../media/faerie.md2"));
-
-	if (fairy)
-	{
-		fairy->setMaterialTexture(0, driver->getTexture("../../media/faerie2.bmp")); // set diffuse texture
-		fairy->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting
-		fairy->getMaterial(0).Shininess = 20.0f; // set size of specular highlights
-		fairy->setPosition(core::vector3df(-10,0,-100));
-	}
-

To make specular highlights appear on the model, we need a dynamic - light in the scene. We add one directly in vicinity of the model. - In addition, to make the model not that dark, we set the ambient light - to gray.

- - - - -
-	// add white light
-	scene::ILightSceneNode* light = smgr->addLightSceneNode(0,
-		core::vector3df(-15,5,-105), video::SColorf(1.0f, 1.0f, 1.0f));
-
-	// set ambient light
-	driver->setAmbientLight(video::SColor(0,60,60,60));
-

The next is just some standard stuff: Add a user controlled camera - to the scene, disable mouse cursor, and add a test cube and let it - rotate to make the scene more interesting.

- - - - -
-	// add fps camera
-	scene::ICameraSceneNode* fpsCamera = smgr->addCameraSceneNodeFPS();
-	fpsCamera->setPosition(core::vector3df(-50,50,-150));
-
-	// disable mouse cursor
-	device->getCursorControl()->setVisible(false);
-
-	// create test cube
-	scene::ISceneNode* test = smgr->addCubeSceneNode(60);
-
-	// let the cube rotate and set some light settings
-	scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
-		core::vector3df(0.3f, 0.3f,0));
-
-	test->setPosition(core::vector3df(-100,0,-100));
-	test->setMaterialFlag(video::EMF_LIGHTING, false); // disable dynamic lighting
-	test->addAnimator(anim);
-	anim->drop();
-
-	// set window caption
-	device->setWindowCaption(L"Irrlicht Engine - Render to Texture and Specular Highlights example");
-

To test out the render to texture feature, we need a render target - texture. These are not like standard textures, but need to be created - first. To create one, we call IVideoDriver::createRenderTargetTexture() - and specify the size of the texture. Please don't use sizes bigger - than the frame buffer for this, because the render target shares the - zbuffer with the frame buffer. And because we want to render the scene - not from the user camera into the texture, we add another, fixed camera - to the scene. But before we do all this, we check if the current running - driver is able to render to textures. If it is not, we simply display - a warning text.

- - - - -
// create render target
-	video::ITexture* rt = 0;
-	scene::ICameraSceneNode* fixedCam = 0;
-	
-
-	if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
-	{
-		rt = driver->createRenderTargetTexture(core::dimension2d(256,256));
-		test->setMaterialTexture(0, rt); // set material of cube to render target
-
-		// add fixed camera
-		fixedCam = smgr->addCameraSceneNode(0, core::vector3df(10,10,-80),
-			core::vector3df(-10,10,-100));
-	}
-	else
-	{
-		// create problem text
-		gui::IGUISkin* skin = env->getSkin();
-		gui::IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
-		if (font)
-			skin->setFont(font);
-
-		gui::IGUIStaticText* text = env->addStaticText(
-			L"Your hardware or this renderer is not able to use the "\
-			L"render to texture feature. RTT Disabled.",
-			core::rect(150,20,470,60));
-
-		text->setOverrideColor(video::SColor(100,255,255,255));
-	}
-

Nearly finished. Now we need to draw everything. Every frame, we - draw the scene twice. Once from the fixed camera into the render target - texture and once as usual. When rendering into the render target, - we need to disable the visibilty of the test cube, because it has - the render target texture applied to it.
- That's, wasn't quite complicated I hope. :)

- - - - -
while(device->run())
-	if (device->isWindowActive())
-	{
-		driver->beginScene(true, true, 0);
-
-		if (rt)
-		{
-			// draw scene into render target
-			
-			// set render target texture
-			driver->setRenderTarget(rt, true, true, video::SColor(0,0,0,255));     
-
-			// make cube invisible and set fixed camera as active camera
-			test->setVisible(false);
-			smgr->setActiveCamera(fixedCam);
-
-			// draw whole scene into render buffer
-			smgr->drawAll();                 
-
-			// set back old render target
-			driver->setRenderTarget(0);      
-
-			// make the cube visible and set the user controlled camera as active one
-			test->setVisible(true);
-			smgr->setActiveCamera(fpsCamera);
-		}
-		
-		// draw scene normally
-		smgr->drawAll(); 
-		env->drawAll();
-
-		driver->endScene();
-	}
-
-	if (rt)
-		rt->drop(); // drop render target because we created if with a create() method
-
-	device->drop(); // drop device
-	return 0;
-}
-
- -

 

-
-
-

 

- - diff --git a/examples/13.RenderToTexture_emscripten/Makefile b/examples/13.RenderToTexture_emscripten/Makefile deleted file mode 100644 index 81dcc442..00000000 --- a/examples/13.RenderToTexture_emscripten/Makefile +++ /dev/null @@ -1,74 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 13.RenderToTexture -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -all_emscripten: EMSCRIPTEN=1 - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG - ifdef EMSCRIPTEN - LDFLAGS += -s DEMANGLE_SUPPORT=1 - endif - CXXFLAGS += -g -Wall -else - ifdef EMSCRIPTEN - LDFLAGS += -O3 - endif - CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_emscripten - -# target specific settings -all_linux all_emscripten all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_emscripten clean_emscripten: SYSTEM=emscripten -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -all_emscripten clean_emscripten: SUF=.html -all_emscripten: CXXFLAGS += -fno-exceptions -fno-rtti -fstrict-aliasing -std=gnu++11 -U__STRICT_ANSI__ -all_emscripten: LDFLAGS += -lGL -lSDL --preload-file ../../media@/media -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=1 -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 all_emscripten static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 clean_emscripten - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -clean_emscripten: - @$(RM) $(BinPath)/$(Target).data - @$(RM) $(BinPath)/$(Target).html* - @$(RM) $(BinPath)/$(Target).js - - -.PHONY: all all_win32 all_emscripten static_win32 clean clean_linux clean_win32 clean_emscripten - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/13.RenderToTexture_emscripten/main.cpp b/examples/13.RenderToTexture_emscripten/main.cpp deleted file mode 100644 index f9916887..00000000 --- a/examples/13.RenderToTexture_emscripten/main.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/** Example 013 Render To Texture on emscripten -*/ - -#include -#include -#include "exampleHelper.h" - -using namespace irr; - -IrrlichtDevice *device = 0; -video::IVideoDriver* driver = 0; -scene::ISceneManager* smgr = 0; -gui::IGUIEnvironment* guienv = 0; -scene::ICameraSceneNode* fpsCamera = 0; -scene::ICameraSceneNode* fixedCam = 0; -video::IRenderTarget* renderTarget = 0; -scene::ISceneNode* cube = 0; - -void one_iter() -{ - if(!device->run()) - { - // Could clean up here in theory, but not sure if it makes a difference - - /* - This tells emscripten to not run any further code. - */ - emscripten_cancel_main_loop(); - return; - } - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0)); - - if (renderTarget) - { - // draw scene into render target - - // set render target - driver->setRenderTargetEx(renderTarget, video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0,0,0,255)); - - // make cube invisible and set fixed camera as active camera - cube->setVisible(false); - smgr->setActiveCamera(fixedCam); - - // draw whole scene into render buffer - smgr->drawAll(); - - // set back old render target - // The buffer might have been distorted, so clear it - driver->setRenderTargetEx(0, 0, video::SColor(0)); - - // make the cube visible and set the user controlled camera as active one - cube->setVisible(true); - smgr->setActiveCamera(fpsCamera); - } - - // draw scene normally - smgr->drawAll(); - guienv->drawAll(); - - driver->endScene(); -} - -int main() -{ - // create device and exit if creation failed - - device = createDevice(video::EDT_WEBGL1, core::dimension2d(640, 480), 16, false, false); - - if (device == 0) - return 1; // could not create selected driver. - - driver = device->getVideoDriver(); - smgr = device->getSceneManager(); - guienv = device->getGUIEnvironment(); - - const io::path mediaPath = getExampleMediaPath(); - - - // load and display animated fairy mesh - scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode( - smgr->getMesh(mediaPath + "faerie.md2")); - - if (!fairy) - return 1; - - fairy->setMaterialTexture(0, driver->getTexture(mediaPath + "faerie2.bmp")); // set diffuse texture - fairy->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting - fairy->getMaterial(0).Shininess = 20.0f; // set size of specular highlights - fairy->setPosition(core::vector3df(-10,0,-100)); - fairy->setMD2Animation ( scene::EMAT_STAND ); - - // add white light - smgr->addLightSceneNode(0, core::vector3df(-15,5,-105), video::SColorf(1.0f, 1.0f, 1.0f)); - - // set ambient light - smgr->setAmbientLight(video::SColor(0,60,60,60)); - - /* - The next is just some standard stuff: Add a test cube and let it rotate - to make the scene more interesting. The user defined camera and cursor - setup is made later on, right before the render loop. - */ - - // create test cube - cube = smgr->addCubeSceneNode(60); - - // let the cube rotate and set some light settings - scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator( - core::vector3df(0.3f, 0.3f,0)); - - cube->setPosition(core::vector3df(-100,0,-100)); - cube->setMaterialFlag(video::EMF_LIGHTING, false); // disable dynamic lighting - cube->addAnimator(anim); - anim->drop(); - - // set window caption - device->setWindowCaption(L"Irrlicht Engine - Render to Texture and Specular Highlights example"); - - /* - To test out the render to texture feature, we need a render target - texture. These are not like standard textures, but need to be created - first. To create one, we call IVideoDriver::addRenderTargetTexture() - and specify the size of the texture. Please don't use sizes bigger than - the frame buffer for this, because the render target shares the zbuffer - with the frame buffer. - Because we want to render the scene not from the user camera into the - texture, we add another fixed camera to the scene. But before we do all - this, we check if the current running driver is able to render to - textures. If it is not, we simply display a warning text. - */ - - // create render target - if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET)) - { - video::ITexture* renderTargetTex = driver->addRenderTargetTexture(core::dimension2d(256, 256), "RTT1", video::ECF_A8R8G8B8); - video::ITexture* renderTargetDepth = driver->addRenderTargetTexture(core::dimension2d(256, 256), "DepthStencil", video::ECF_D16); - - renderTarget = driver->addRenderTarget(); - renderTarget->setTexture(renderTargetTex, renderTargetDepth); - - cube->setMaterialTexture(0, renderTargetTex); // set material of cube to render target - - // add fixed camera - fixedCam = smgr->addCameraSceneNode(0, core::vector3df(10,10,-80), - core::vector3df(-10,10,-100)); - } - else - { - return 1; - } - - // add fps camera - fpsCamera = smgr->addCameraSceneNodeFPS(); - fpsCamera->setPosition(core::vector3df(-50,50,-150)); - -/* - Setting fps to 0 or a negative value will use the browser’s - requestAnimationFrame mechanism to call the main loop function. - Emscripten documentation recommends to do that, but you can also set - another fps value and the browser will try to call the main-loop - fps times per second. - The simulate_infinite_loop tells emscripten that this is an application - which will simulate an infinite loop. There is also a flag in the - Makefile about that: -s NO_EXIT_RUNTIME=1 - */ - int fps = 0; - int simulate_infinite_loop = 1; - emscripten_set_main_loop(one_iter, fps, simulate_infinite_loop); - - return 0; -} diff --git a/examples/14.Win32Window/Makefile b/examples/14.Win32Window/Makefile deleted file mode 100644 index 5813ca0a..00000000 --- a/examples/14.Win32Window/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 14.Win32Window -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/14.Win32Window/Win32Window.cbp b/examples/14.Win32Window/Win32Window.cbp deleted file mode 100644 index 06f310b7..00000000 --- a/examples/14.Win32Window/Win32Window.cbp +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - diff --git a/examples/14.Win32Window/Win32Window.vcproj b/examples/14.Win32Window/Win32Window.vcproj deleted file mode 100644 index c8576c76..00000000 --- a/examples/14.Win32Window/Win32Window.vcproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/14.Win32Window/Win32Window_vc10.vcxproj b/examples/14.Win32Window/Win32Window_vc10.vcxproj deleted file mode 100644 index 0ea47dbd..00000000 --- a/examples/14.Win32Window/Win32Window_vc10.vcxproj +++ /dev/null @@ -1,239 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 14.Win32Window - {772FBE05-D05A-467B-9842-BEC409EEA8D0} - Win32Window - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/14.Win32Window/Win32Window_vc11.vcxproj b/examples/14.Win32Window/Win32Window_vc11.vcxproj deleted file mode 100644 index 0ea47dbd..00000000 --- a/examples/14.Win32Window/Win32Window_vc11.vcxproj +++ /dev/null @@ -1,239 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 14.Win32Window - {772FBE05-D05A-467B-9842-BEC409EEA8D0} - Win32Window - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/14.Win32Window/Win32Window_vc12.vcxproj b/examples/14.Win32Window/Win32Window_vc12.vcxproj deleted file mode 100644 index 814a398d..00000000 --- a/examples/14.Win32Window/Win32Window_vc12.vcxproj +++ /dev/null @@ -1,239 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 14.Win32Window - {772FBE05-D05A-467B-9842-BEC409EEA8D0} - Win32Window - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/14.Win32Window/Win32Window_vc14.vcxproj b/examples/14.Win32Window/Win32Window_vc14.vcxproj deleted file mode 100644 index 3142d412..00000000 --- a/examples/14.Win32Window/Win32Window_vc14.vcxproj +++ /dev/null @@ -1,239 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 14.Win32Window - {772FBE05-D05A-467B-9842-BEC409EEA8D0} - Win32Window - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/Win32Window.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\14.Win32Window.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/Win32Window.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - opengl32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\14.Win32Window.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/14.Win32Window/main.cpp b/examples/14.Win32Window/main.cpp deleted file mode 100644 index 183381b9..00000000 --- a/examples/14.Win32Window/main.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/** Example 014 Win32 Window - -This example only runs under MS Windows and demonstrates that Irrlicht can -render inside a win32 window. MFC and .NET Windows.Forms windows are possible, -too. - -In the beginning, we create a windows window using the windows API. I'm not -going to explain this code, because it is windows specific. See the MSDN or a -windows book for details. -*/ - -#include -#ifndef _IRR_WINDOWS_ -#error Windows only example -#else -#include // this example only runs with windows -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "irrlicht.lib") -#endif - -HWND hOKButton; -HWND hWnd; - -static LRESULT CALLBACK CustomWndProc(HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_COMMAND: - { - HWND hwndCtl = (HWND)lParam; - int code = HIWORD(wParam); - - if (hwndCtl == hOKButton) - { - DestroyWindow(hWnd); - PostQuitMessage(0); - return 0; - } - } - break; - case WM_DESTROY: - PostQuitMessage(0); - return 0; - - } - - return DefWindowProc(hWnd, message, wParam, lParam); -} - - -/* - Now ask for the driver and create the Windows specific window. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - printf("Select the render window (some dead window may exist too):\n"\ - " (a) Window with button (via CreationParam)\n"\ - " (b) Window with button (via beginScene)\n"\ - " (c) Own Irrlicht window (default behavior)\n"\ - " (otherKey) exit\n\n"); - - char key; - std::cin >> key; - if (key != 'a' && key != 'b' && key != 'c') - return 1; - - HINSTANCE hInstance = 0; - // create dialog - - const fschar_t* Win32ClassName = __TEXT("CIrrlichtWindowsTestDialog"); - - WNDCLASSEX wcex; - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = (WNDPROC)CustomWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = DLGWINDOWEXTRA; - wcex.hInstance = hInstance; - wcex.hIcon = NULL; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW); - wcex.lpszMenuName = 0; - wcex.lpszClassName = Win32ClassName; - wcex.hIconSm = 0; - - RegisterClassEx(&wcex); - - DWORD style = WS_SYSMENU | WS_BORDER | WS_CAPTION | - WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX; - - int windowWidth = 440; - int windowHeight = 380; - - hWnd = CreateWindow( Win32ClassName, __TEXT("Irrlicht Win32 window example"), - style, 100, 100, windowWidth, windowHeight, - NULL, NULL, hInstance, NULL); - - RECT clientRect; - GetClientRect(hWnd, &clientRect); - windowWidth = clientRect.right; - windowHeight = clientRect.bottom; - - // create ok button - - hOKButton = CreateWindow(__TEXT("BUTTON"), __TEXT("OK - Close"), WS_CHILD | WS_VISIBLE | BS_TEXT, - windowWidth - 160, windowHeight - 40, 150, 30, hWnd, NULL, hInstance, NULL); - - // create some text - - CreateWindow(__TEXT("STATIC"), __TEXT("This is Irrlicht running inside a standard Win32 window.\n")\ - __TEXT("Also mixing with MFC and .NET Windows.Forms is possible."), - WS_CHILD | WS_VISIBLE, 20, 20, 400, 40, hWnd, NULL, hInstance, NULL); - - // create window to put irrlicht in - - HWND hIrrlichtWindow = CreateWindow(__TEXT("BUTTON"), __TEXT(""), - WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, - 50, 80, 320, 220, hWnd, NULL, hInstance, NULL); - video::SExposedVideoData videodata((key=='b')?hIrrlichtWindow:0); - - /* - So now that we have some window, we can create an Irrlicht device - inside of it. We use Irrlicht createEx() function for this. We only - need the handle (HWND) to that window, set it as windowsID parameter - and start up the engine as usual. That's it. - */ - // create irrlicht device in the button window - - irr::SIrrlichtCreationParameters param; - param.DriverType = driverType; - if (key=='a') - param.WindowId = reinterpret_cast(hIrrlichtWindow); - - irr::IrrlichtDevice* device = irr::createDeviceEx(param); - - // setup a simple 3d scene - - irr::scene::ISceneManager* smgr = device->getSceneManager(); - video::IVideoDriver* driver = device->getVideoDriver(); - - if (driverType==video::EDT_OPENGL) - { - HDC HDc=GetDC(hIrrlichtWindow); - PIXELFORMATDESCRIPTOR pfd={0}; - pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); - int pf = GetPixelFormat(HDc); - DescribePixelFormat(HDc, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - pfd.dwFlags |= PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW; - pfd.cDepthBits=16; - pf = ChoosePixelFormat(HDc, &pfd); - SetPixelFormat(HDc, pf, &pfd); - videodata.OpenGLWin32.HDc = HDc; - videodata.OpenGLWin32.HRc=wglCreateContext(HDc); - wglShareLists((HGLRC)driver->getExposedVideoData().OpenGLWin32.HRc, (HGLRC)videodata.OpenGLWin32.HRc); - } - scene::ICameraSceneNode* cam = smgr->addCameraSceneNode(); - cam->setTarget(core::vector3df(0,0,0)); - - scene::ISceneNodeAnimator* anim = - smgr->createFlyCircleAnimator(core::vector3df(0,15,0), 30.0f); - cam->addAnimator(anim); - anim->drop(); - - scene::ISceneNode* cube = smgr->addCubeSceneNode(20); - - const io::path mediaPath = getExampleMediaPath(); - - cube->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.bmp")); - cube->setMaterialTexture(1, driver->getTexture(mediaPath + "water.jpg")); - cube->setMaterialFlag( video::EMF_LIGHTING, false ); - cube->setMaterialType( video::EMT_REFLECTION_2_LAYER ); - - smgr->addSkyBoxSceneNode( - driver->getTexture(mediaPath + "irrlicht2_up.jpg"), - driver->getTexture(mediaPath + "irrlicht2_dn.jpg"), - driver->getTexture(mediaPath + "irrlicht2_lf.jpg"), - driver->getTexture(mediaPath + "irrlicht2_rt.jpg"), - driver->getTexture(mediaPath + "irrlicht2_ft.jpg"), - driver->getTexture(mediaPath + "irrlicht2_bk.jpg")); - - // This shows that we can render to multiple windows within one application - device->getGUIEnvironment()->addStaticText(core::stringw("Second screen render").c_str(),core::recti(0,0,200,200)); - - // show and execute dialog - - ShowWindow(hWnd , SW_SHOW); - UpdateWindow(hWnd); - - // do message queue - - /* - Now the only thing missing is the drawing loop using - IrrlichtDevice::run(). We do this as usual. But instead of this, there - is another possibility: You can also simply use your own message loop - using GetMessage, DispatchMessage and whatever. Calling - Device->run() will cause Irrlicht to dispatch messages internally too. - You need not call Device->run() if you want to do your own message - dispatching loop, but Irrlicht will not be able to fetch user input - then and you have to do it on your own using the window messages, - DirectInput, or whatever. - */ - - while (device->run()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0), 1.f, 0, videodata); - smgr->drawAll(); - driver->endScene(); - if (key=='b') - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(0xbbbbbbbb)); - device->getGUIEnvironment()->drawAll(); - driver->endScene(); - } - } - - /* - The alternative, own message dispatching loop without Device->run() - would look like this: - */ - - /*MSG msg; - while (true) - { - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (msg.message == WM_QUIT) - break; - } - - // advance virtual time - device->getTimer()->tick(); - - // draw engine picture - driver->beginScene(true, true, 0, (key=='c')?hIrrlichtWindow:0); - smgr->drawAll(); - driver->endScene(); - }*/ - - device->closeDevice(); - device->drop(); - - return 0; -} -#endif // if windows - -/* -That's it, Irrlicht now runs in your own windows window. -**/ diff --git a/examples/14.Win32Window/tutorial.html b/examples/14.Win32Window/tutorial.html deleted file mode 100644 index 6c5d5baa..00000000 --- a/examples/14.Win32Window/tutorial.html +++ /dev/null @@ -1,247 +0,0 @@ - - -Irrlicht Engine Tutorial - - - - -
- - - - - - - - -
-
-
Tutorial 14. Win32 Window
-
-
-
-

This example only runs in Windows and demonstrates that Irrlicht can - run inside a win32 window. MFC and .NET Windows.Forms windows are possible - too.

-

The program which is described here will look like this:

-


-

-
-
-
- - - - - - - -
Lets start!
-
-

In the begining, we create a windows window using the windows API. - I'm not going to explain this code, because it is windows specific. - See the MSDN or a windows book for details.

- - - - -
#include <irrlicht.h>
-#include <windows.h> // this example only runs with windows
-
-using namespace irr;
-
-#pragma comment(lib, "irrlicht.lib")
-
-HWND hOKButton;
-HWND hWnd;
-
-static LRESULT CALLBACK CustomWndProc(HWND hWnd, UINT message,
-    WPARAM wParam, LPARAM lParam)
-{
-	switch (message) 
-	{
-	case WM_COMMAND:
-		{
-			HWND hwndCtl = (HWND)lParam;
-			int code = HIWORD(wParam);
-
-			if (hwndCtl == hOKButton)
-			{
-				DestroyWindow(hWnd);
-				PostQuitMessage(0);
-				return 0;
-			}		
-		}
-		break;
-	case WM_DESTROY:
-		PostQuitMessage(0);
-		return 0;
-
-	}
-
-	return DefWindowProc(hWnd, message, wParam, lParam);
-}
-
-int main()
-//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hpre, LPSTR cmd, int cc)
-{
-	HINSTANCE hInstance = 0;
-	// create dialog
-
-	const char* Win32ClassName = "CIrrlichtWindowsTestDialog";
-
-	WNDCLASSEX wcex;
-	wcex.cbSize			= sizeof(WNDCLASSEX); 
-	wcex.style			= CS_HREDRAW | CS_VREDRAW;
-	wcex.lpfnWndProc	= (WNDPROC)CustomWndProc;
-	wcex.cbClsExtra		= 0;
-	wcex.cbWndExtra		= DLGWINDOWEXTRA; 
-	wcex.hInstance		= hInstance;
-	wcex.hIcon			= NULL;
-	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
-	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW);
-	wcex.lpszMenuName	= 0;
-	wcex.lpszClassName	= Win32ClassName;
-	wcex.hIconSm		= 0;
-
-	RegisterClassEx(&wcex);
-
-	DWORD style = WS_SYSMENU | WS_BORDER | WS_CAPTION | 
-		WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX
-		| WS_MINIMIZEBOX | WS_SIZEBOX;
-
-	int windowWidth = 440;
-	int windowHeight = 380;
-
-	hWnd = CreateWindow( Win32ClassName, "Irrlicht Win32 window example",
-		style, 100, 100, windowWidth, windowHeight,
-		NULL, NULL, hInstance, NULL);
-
-	RECT clientRect;
-	GetClientRect(hWnd, &clientRect);
-	windowWidth = clientRect.right;
-	windowHeight = clientRect.bottom;
-
-	// create ok button
-
-	hOKButton = CreateWindow(
-	    "BUTTON", "OK - Close", WS_CHILD | WS_VISIBLE | BS_TEXT, 
-		windowWidth - 160, windowHeight - 40, 150, 30, hWnd, NULL, 
-		hInstance, NULL);
-
-	// create some text
-	
-	CreateWindow("STATIC", 
-        "This is Irrlicht running inside a standard Win32 window.\n"\
-		"Also mixing with MFC and .NET Windows.Forms is possible.",
-		WS_CHILD | WS_VISIBLE, 20, 20, 400, 40, hWnd, NULL, hInstance, NULL);
-
-	// create window to put irrlicht in
-
-	HWND hIrrlichtWindow =
CreateWindow("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, - 50, 80, 320, 220, hWnd, NULL, hInstance, NULL); - -
-

So now that we have some window, we can create an Irrlicht device - inside of it. We use Irrlicht createEx() function for this. We only - need the handle (HWND) to that window, set it as windowsID parameter - and start up the engine as usual. That's it.

- - - - -
	// create irrlicht device in the button window
-
-	irr::SIrrlichtCreationParameters param;
-	param.WindowId = reinterpret_cast(hIrrlichtWindow); // hColorButton
-	param.DriverType = video::EDT_OPENGL;
-
-	irr::IrrlichtDevice* device = irr::createDeviceEx(param);
-	
-	// setup a simple 3d scene
-
-	irr::scene::ISceneManager* smgr = device->getSceneManager();
-	video::IVideoDriver* driver = device->getVideoDriver();
-
-	scene::ICameraSceneNode* cam = smgr->addCameraSceneNode();
-	cam->setTarget(core::vector3df(0,0,0));
-
-	scene::ISceneNodeAnimator* anim =
-	   smgr->createFlyCircleAnimator(core::vector3df(0,10,0), 30.0f);
-	cam->addAnimator(anim);
-	anim->drop();
-
-	scene::ISceneNode* cube = smgr->addCubeSceneNode(25);
-	cube->setMaterialFlag(video::EMF_LIGHTING, false);
-	
-	cube->setMaterialTexture(0, driver->getTexture("../../media/rockwall.bmp"));
-
-	smgr->addSkyBoxSceneNode(
-	driver->getTexture("../../media/irrlicht2_up.jpg"),
-	driver->getTexture("../../media/irrlicht2_dn.jpg"),
-	driver->getTexture("../../media/irrlicht2_lf.jpg"),
-	driver->getTexture("../../media/irrlicht2_rt.jpg"),
-	driver->getTexture("../../media/irrlicht2_ft.jpg"),
-	driver->getTexture("../../media/irrlicht2_bk.jpg"));
-
-	// show and execute dialog
-
-	ShowWindow(hWnd , SW_SHOW);
-	UpdateWindow(hWnd);
-
-

Now the only thing missing is the drawing loop using IrrlichtDevice::run(). - We do this as usual. But instead of this, there is another possibility: - You can also simply use your own message loop using GetMessage, DispatchMessage - and whatever. Calling
- Device->run() will cause Irrlicht to dispatch messages internally - too. You need not call Device->run() if you want to do your own - message dispatching loop, but Irrlicht will not be able to fetch user - input then and you have to do it on your own using the window messages, - DirectInput, or whatever.

- - - - -
	while (device->run())
-	{
-		driver->beginScene(true, true, 0);
-		smgr->drawAll();
-		driver->endScene();
-	}
-
-	// the alternative, own message dispatching loop without Device->run() would
-	// look like this:
-
-	/*MSG msg;
-	while (true)
-	{
-		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
-		{
-			TranslateMessage(&msg);
-			DispatchMessage(&msg);
-
-			if (msg.message == WM_QUIT)
-				break;
-		}
-		
-		// advance virtual time
-		device->getTimer()->tick();
-
-		// draw engine picture
-		driver->beginScene(true, true, 0);
-		smgr->drawAll();
-		driver->endScene();
-	}*/
-
-	device->closeDevice();
-	device->drop();
-
-	return 0;
-}
-

That's it, Irrlicht now runs in your own windows window.

-
-
-
-

 

- - diff --git a/examples/16.Quake3MapShader/Makefile b/examples/16.Quake3MapShader/Makefile deleted file mode 100644 index e4d5fb19..00000000 --- a/examples/16.Quake3MapShader/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 16.Quake3MapShader -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/16.Quake3MapShader/Quake3MapShader.cbp b/examples/16.Quake3MapShader/Quake3MapShader.cbp deleted file mode 100644 index 544f80fe..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/16.Quake3MapShader/Quake3MapShader.vcproj b/examples/16.Quake3MapShader/Quake3MapShader.vcproj deleted file mode 100644 index de658b34..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader.vcproj +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/project.pbxproj b/examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/project.pbxproj deleted file mode 100644 index 31edfb14..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 16.Quake3MapShader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 16.Quake3MapShader.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 16.Quake3MapShader.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 16.Quake3MapShader */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "16.Quake3MapShader" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 16.Quake3MapShader; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 16.Quake3MapShader.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Quake3MapShader" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 16.Quake3MapShader */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Quake3MapShader" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "16.Quake3MapShader" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/xcshareddata/xcschemes/16.Quake3MapShader.xcscheme b/examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/xcshareddata/xcschemes/16.Quake3MapShader.xcscheme deleted file mode 100644 index 02775ec0..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader.xcodeproj/xcshareddata/xcschemes/16.Quake3MapShader.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/16.Quake3MapShader/Quake3MapShader_vc10.vcxproj b/examples/16.Quake3MapShader/Quake3MapShader_vc10.vcxproj deleted file mode 100644 index b5564f80..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader_vc10.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 16.Quake3MapShader - {EB3B38EA-5CE7-4983-845B-880661E69D09} - 16.Quake3MapShader - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/16.Quake3MapShader/Quake3MapShader_vc11.vcxproj b/examples/16.Quake3MapShader/Quake3MapShader_vc11.vcxproj deleted file mode 100644 index b5564f80..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader_vc11.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 16.Quake3MapShader - {EB3B38EA-5CE7-4983-845B-880661E69D09} - 16.Quake3MapShader - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/16.Quake3MapShader/Quake3MapShader_vc12.vcxproj b/examples/16.Quake3MapShader/Quake3MapShader_vc12.vcxproj deleted file mode 100644 index e41579e1..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader_vc12.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 16.Quake3MapShader - {EB3B38EA-5CE7-4983-845B-880661E69D09} - 16.Quake3MapShader - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/16.Quake3MapShader/Quake3MapShader_vc14.vcxproj b/examples/16.Quake3MapShader/Quake3MapShader_vc14.vcxproj deleted file mode 100644 index 9c850a13..00000000 --- a/examples/16.Quake3MapShader/Quake3MapShader_vc14.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 16.Quake3MapShader - {EB3B38EA-5CE7-4983-845B-880661E69D09} - 16.Quake3MapShader - Win32Proj - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\16.Quake3MapShader.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/16.Quake3MapShader/main.cpp b/examples/16.Quake3MapShader/main.cpp deleted file mode 100644 index 38062c5a..00000000 --- a/examples/16.Quake3MapShader/main.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/** Example 016 Quake3 Map Shader Support - -This tutorial shows how to load a Quake 3 map into the -engine, create a SceneNode for optimizing the speed of -rendering and how to create a user controlled camera. - -Lets start like the HelloWorld example: We include -the irrlicht header files and an additional file to be able -to ask the user for a driver type using the console. -*/ -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -/* - define which Quake3 Level should be loaded -*/ -#define IRRLICHT_QUAKE3_ARENA -//#define ORIGINAL_QUAKE3_ARENA -//#define CUSTOM_QUAKE3_ARENA -//#define SHOW_SHADER_NAME - -#ifdef ORIGINAL_QUAKE3_ARENA - #define QUAKE3_STORAGE_FORMAT addFolderFileArchive - #define QUAKE3_STORAGE_1 "/baseq3/" - #ifdef CUSTOM_QUAKE3_ARENA - #define QUAKE3_STORAGE_2 "/cf/" - #define QUAKE3_MAP_NAME "maps/cf.bsp" - #else - #define QUAKE3_MAP_NAME "maps/q3dm8.bsp" - #endif -#endif - -#ifdef IRRLICHT_QUAKE3_ARENA - #define QUAKE3_STORAGE_FORMAT addFileArchive - #define QUAKE3_STORAGE_1 getExampleMediaPath() + "map-20kdm2.pk3" - #define QUAKE3_MAP_NAME "maps/20kdm2.bsp" -#endif - -using namespace irr; -using namespace scene; - -/* -Again, to be able to use the Irrlicht.DLL file, we need to link with the -Irrlicht.lib. We could set this option in the project settings, but -to make it easy, we use a pragma comment lib: -*/ -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - - -/* -A class to produce a series of screenshots -*/ -class CScreenShotFactory : public IEventReceiver -{ -public: - - CScreenShotFactory( IrrlichtDevice *device, const c8 * templateName, ISceneNode* node ) - : Device(device), Number(0), FilenameTemplate(templateName), Node(node) - { - FilenameTemplate.replace ( '/', '_' ); - FilenameTemplate.replace ( '\\', '_' ); - } - - bool OnEvent(const SEvent& event) - { - // check if user presses the key F9 - if ((event.EventType == EET_KEY_INPUT_EVENT) && - event.KeyInput.PressedDown) - { - if (event.KeyInput.Key == KEY_F9) - { - video::IImage* image = Device->getVideoDriver()->createScreenShot(); - if (image) - { - c8 buf[256]; - snprintf_irr(buf, 256, "%s_shot%04d.jpg", - FilenameTemplate.c_str(), - ++Number); - Device->getVideoDriver()->writeImageToFile(image, buf, 85 ); - image->drop(); - } - } - else - if (event.KeyInput.Key == KEY_F8) - { - if (Node->isDebugDataVisible()) - Node->setDebugDataVisible(scene::EDS_OFF); - else - Node->setDebugDataVisible(scene::EDS_BBOX_ALL); - } - } - return false; - } - -private: - IrrlichtDevice *Device; - u32 Number; - core::stringc FilenameTemplate; - ISceneNode* Node; -}; - - -/* -Ok, lets start. -*/ - -int IRRCALLCONV main(int argc, char* argv[]) -{ - /* - Like in the HelloWorld example, we create an IrrlichtDevice with - createDevice(). The difference now is that we ask the user to select - which hardware accelerated driver to use. The Software device would be - too slow to draw a huge Quake 3 map, but just for the fun of it, we make - this decision possible too. - */ - - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device and exit if creation failed - const core::dimension2du videoDim(800,600); - - IrrlichtDevice *device = createDevice(driverType, videoDim, 32, false ); - - if (device == 0) - return 1; // could not create selected driver. - - const char* mapname=0; - if (argc>2) - mapname = argv[2]; - else - mapname = QUAKE3_MAP_NAME; - - /* - Get a pointer to the video driver and the SceneManager so that - we do not always have to write device->getVideoDriver() and - device->getSceneManager(). - */ - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* gui = device->getGUIEnvironment(); - - const io::path mediaPath = getExampleMediaPath(); - - //! add our private media directory to the file system - device->getFileSystem()->addFileArchive(mediaPath); - - /* - To display the Quake 3 map, we first need to load it. Quake 3 maps - are packed into .pk3 files, which are nothing other than .zip files. - So we add the .pk3 file to our FileSystem. After it was added, - we are able to read from the files in that archive as they would - directly be stored on disk. - */ - if (argc>2) - device->getFileSystem()->QUAKE3_STORAGE_FORMAT(argv[1]); - else - device->getFileSystem()->QUAKE3_STORAGE_FORMAT(QUAKE3_STORAGE_1); -#ifdef QUAKE3_STORAGE_2 - device->getFileSystem()->QUAKE3_STORAGE_FORMAT(QUAKE3_STORAGE_2); -#endif - - // Quake3 Shader controls Z-Writing - smgr->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); - - /* - Now we can load the mesh by calling getMesh(). We get a pointer returned - to a IAnimatedMesh. As you know, Quake 3 maps are not really animated, - they are only a huge chunk of static geometry with some materials - attached. Hence the IAnimated mesh consists of only one frame, - so we get the "first frame" of the "animation", which is our quake level - and create an Octree scene node with it, using addOctreeSceneNode(). - The Octree optimizes the scene a little bit, trying to draw only geometry - which is currently visible. An alternative to the Octree would be a - AnimatedMeshSceneNode, which would draw always the complete geometry of - the mesh, without optimization. Try it out: Write addAnimatedMeshSceneNode - instead of addOctreeSceneNode and compare the primitives drawn by the - video driver. (There is a getPrimitiveCountDrawed() method in the - IVideoDriver class). Note that this optimization with the Octree is only - useful when drawing huge meshes consisting of lots of geometry. - */ - scene::IQ3LevelMesh* const mesh = - (scene::IQ3LevelMesh*) smgr->getMesh(mapname); - - /* - add the geometry mesh to the Scene ( polygon & patches ) - The Geometry mesh is optimised for faster drawing - */ - scene::ISceneNode* node = 0; - if (mesh) - { - scene::IMesh * const geometry = mesh->getMesh(quake3::E_Q3_MESH_GEOMETRY); - node = smgr->addOctreeSceneNode(geometry, 0, -1, 4096); - } - - // create an event receiver for making screenshots - CScreenShotFactory screenshotFactory(device, mapname, node); - device->setEventReceiver(&screenshotFactory); - - /* - now construct SceneNodes for each Shader - The Objects are stored in the quake mesh scene::E_Q3_MESH_ITEMS - and the Shader ID is stored in the MaterialParameters - mostly dark looking skulls and moving lava.. or green flashing tubes? - */ - if ( mesh ) - { - // the additional mesh can be quite huge and is unoptimized - const scene::IMesh * const additional_mesh = mesh->getMesh(quake3::E_Q3_MESH_ITEMS); - -#ifdef SHOW_SHADER_NAME - gui::IGUIFont *font = device->getGUIEnvironment()->getFont(mediaPath + "fontlucida.png"); - u32 count = 0; -#endif - - for ( u32 i = 0; i!= additional_mesh->getMeshBufferCount(); ++i ) - { - const IMeshBuffer* meshBuffer = additional_mesh->getMeshBuffer(i); - const video::SMaterial& material = meshBuffer->getMaterial(); - - // The ShaderIndex is stored in the material parameter - const s32 shaderIndex = (s32) material.MaterialTypeParam2; - - // the meshbuffer can be rendered without additional support, or it has no shader - const quake3::IShader *shader = mesh->getShader(shaderIndex); - if (0 == shader) - { - continue; - } - - // we can dump the shader to the console in its - // original but already parsed layout in a pretty - // printers way.. commented out, because the console - // would be full... - // quake3::dumpShader ( Shader ); - - node = smgr->addQuake3SceneNode(meshBuffer, shader); - -#ifdef SHOW_SHADER_NAME - count += 1; - core::stringw name( node->getName() ); - node = smgr->addBillboardTextSceneNode( - font, name.c_str(), node, - core::dimension2d(80.0f, 8.0f), - core::vector3df(0, 10, 0)); -#endif - } - } - - /* - Now we only need a Camera to look at the Quake 3 map. And we want to - create a user controlled camera. There are some different cameras - available in the Irrlicht engine. For example the Maya Camera which can - be controlled comparable to the camera in Maya: Rotate with left mouse - button pressed, Zoom with both buttons pressed, translate with right - mouse button pressed. This could be created with - addCameraSceneNodeMaya(). But for this example, we want to create a - camera which behaves like the ones in first person shooter games (FPS). - */ - - scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(); - - /* - so we need a good starting Position in the level. - we can ask the Quake3 Loader for all entities with class_name - "info_player_deathmatch" - we choose a random launch - */ - if ( mesh ) - { - quake3::tQ3EntityList &entityList = mesh->getEntityList(); - - quake3::IEntity search; - search.name = "info_player_deathmatch"; - - s32 index = entityList.binary_search(search); - if (index >= 0) - { - s32 notEndList; - do - { - const quake3::SVarGroup *group = entityList[index].getGroup(1); - - u32 parsepos = 0; - const core::vector3df pos = - quake3::getAsVector3df(group->get("origin"), parsepos); - - parsepos = 0; - const f32 angle = quake3::getAsFloat(group->get("angle"), parsepos); - - core::vector3df target(0.f, 0.f, 1.f); - target.rotateXZBy(angle); - - camera->setPosition(pos); - camera->setTarget(pos + target); - - ++index; -/* - notEndList = ( index < (s32) entityList.size () && - entityList[index].name == search.name && - (device->getTimer()->getRealTime() >> 3 ) & 1 - ); -*/ - notEndList = index == 2; - } while ( notEndList ); - } - } - - /* - The mouse cursor needs not to be visible, so we make it invisible. - */ - - device->getCursorControl()->setVisible(false); - - // load the engine logo - gui->addImage(driver->getTexture("irrlichtlogo3.png"), - core::position2d(10, 10)); - - // show the driver logo - const core::position2di pos(videoDim.Width - 128, videoDim.Height - 64); - - switch ( driverType ) - { - case video::EDT_BURNINGSVIDEO: - gui->addImage(driver->getTexture("burninglogo.png"), pos); - break; - case video::EDT_OPENGL: - gui->addImage(driver->getTexture("opengllogo.png"), pos); - break; - case video::EDT_DIRECT3D9: - gui->addImage(driver->getTexture("directxlogo.png"), pos); - break; - default: - break; - } - - /* - We have done everything, so lets draw it. We also write the current - frames per second and the drawn primitives to the caption of the - window. The 'if (device->isWindowActive())' line is optional, but - prevents the engine render to set the position of the mouse cursor - after task switching when other program are active. - */ - int lastFPS = -1; - - while(device->run()) - if (device->isWindowActive()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,20,20,40)); - smgr->drawAll(); - gui->drawAll(); - driver->endScene(); - - int fps = driver->getFPS(); - if (1 || lastFPS != fps) - { - core::stringw str = L"Q3 ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; -#ifdef _IRR_SCENEMANAGER_DEBUG - io::IAttributes * const attr = smgr->getParameters(); - str += " Cull:"; - str += attr->getAttributeAsInt("calls"); - str += "/"; - str += attr->getAttributeAsInt("culled"); - str += " Draw: "; - str += attr->getAttributeAsInt("drawn_solid"); - str += "/"; - str += attr->getAttributeAsInt("drawn_transparent"); - str += "/"; - str += attr->getAttributeAsInt("drawn_transparent_effect"); -#endif - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - - /* - In the end, delete the Irrlicht device. - */ - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v8.vcproj b/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v8.vcproj deleted file mode 100644 index be07354f..00000000 --- a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v8.vcproj +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v9.vcproj b/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v9.vcproj deleted file mode 100644 index acdc249d..00000000 --- a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_v9.vcproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc10.vcxproj b/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc10.vcxproj deleted file mode 100644 index 0f047407..00000000 --- a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc10.vcxproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 17.HelloWorld_Mobile - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B} - My17HelloWorldforWindowsMobileonPC - Win32Proj - - - - Application - Unicode - true - Windows7.1SDK - - - Application - Unicode - true - Windows7.1SDK - - - Application - Unicode - Windows7.1SDK - - - Application - Unicode - Windows7.1SDK - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win32-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc11.vcxproj b/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc11.vcxproj deleted file mode 100644 index 0f047407..00000000 --- a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc11.vcxproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 17.HelloWorld_Mobile - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B} - My17HelloWorldforWindowsMobileonPC - Win32Proj - - - - Application - Unicode - true - Windows7.1SDK - - - Application - Unicode - true - Windows7.1SDK - - - Application - Unicode - Windows7.1SDK - - - Application - Unicode - Windows7.1SDK - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win32-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc12.vcxproj b/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc12.vcxproj deleted file mode 100644 index 30079f8b..00000000 --- a/examples/17.HelloWorld_Mobile/17. HelloWorld for Windows Mobile on PC_vc12.vcxproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 17.HelloWorld_Mobile - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B} - My17HelloWorldforWindowsMobileonPC - Win32Proj - - - - Application - Unicode - true - Windows7.1SDK - - - Application - Unicode - true - Windows7.1SDK - - - Application - Unicode - Windows7.1SDK - - - Application - Unicode - Windows7.1SDK - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebugDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win32-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\17.HelloWorld_Mobile.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/17.HelloWorld_Mobile/HelloWorld_mobile.sln b/examples/17.HelloWorld_Mobile/HelloWorld_mobile.sln deleted file mode 100644 index 31932b79..00000000 --- a/examples/17.HelloWorld_Mobile/HelloWorld_mobile.sln +++ /dev/null @@ -1,33 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17.HelloWorld_mobile", "HelloWorld_mobile.vcproj", "{AD95D5D7-91D2-4030-B28D-23A6FE5C0359}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Irrlicht", "..\..\source\Irrlicht\Irrlicht_mobile6.vcproj", "{E08E042A-6C45-411B-92BE-3CC31331019F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Windows Mobile 6 Professional SDK (ARMV4I) = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - Release|Windows Mobile 6 Professional SDK (ARMV4I) = Release|Windows Mobile 6 Professional SDK (ARMV4I) - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AD95D5D7-91D2-4030-B28D-23A6FE5C0359}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - {AD95D5D7-91D2-4030-B28D-23A6FE5C0359}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - {AD95D5D7-91D2-4030-B28D-23A6FE5C0359}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - {AD95D5D7-91D2-4030-B28D-23A6FE5C0359}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) - {AD95D5D7-91D2-4030-B28D-23A6FE5C0359}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) - {AD95D5D7-91D2-4030-B28D-23A6FE5C0359}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/17.HelloWorld_Mobile/HelloWorld_mobile.vcproj b/examples/17.HelloWorld_Mobile/HelloWorld_mobile.vcproj deleted file mode 100644 index dcaca9ef..00000000 --- a/examples/17.HelloWorld_Mobile/HelloWorld_mobile.vcproj +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/17.HelloWorld_Mobile/Makefile b/examples/17.HelloWorld_Mobile/Makefile deleted file mode 100644 index a29ccaa2..00000000 --- a/examples/17.HelloWorld_Mobile/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler -Target = 17.HelloWorld_Mobile -Sources = main.cpp - -# general compiler settings -CPPFLAGS = -I../../include -I/usr/X11R6/include -CXXFLAGS = -O3 -ffast-math -#CXXFLAGS = -g -Wall - -#default target is Linux -all: all_linux - -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif - -# target specific settings -all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32: LDFLAGS = -L../../lib/Win32-gcc -lIrrlicht -lopengl32 -lm -all_win32: CPPFLAGS += -D__GNUWIN32__ -D_WIN32 -DWIN32 -D_WINDOWS -D_MBCS -D_USRDLL -all_win32 clean_win32: SYSTEM=Win32-gcc -all_win32 clean_win32: SUF=.exe -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF) - -all_linux all_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 clean clean_linux clean_win32 diff --git a/examples/17.HelloWorld_Mobile/main.cpp b/examples/17.HelloWorld_Mobile/main.cpp deleted file mode 100644 index 9db5806f..00000000 --- a/examples/17.HelloWorld_Mobile/main.cpp +++ /dev/null @@ -1,497 +0,0 @@ -/** Deprecated. This was Example 017 Helloworld mobile for WinCE 6. - But WinCE6 support has been removed for Irrlicht 1.9. - If you still need that please use Irrlicht 1.8 or svn revision 5045 which was the last one to include it. - - Sources still kept for now as it compiles on other platform too. And we might use this example again - once we support Windows RT. -*/ - -#include - -#if defined ( _IRR_WINDOWS_ ) - #include -#endif - -using namespace irr; -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -#pragma comment(lib, "Irrlicht.lib") - -class EventReceiver_basic : public IEventReceiver -{ -private: - IrrlichtDevice *Device; -public: - EventReceiver_basic ( IrrlichtDevice *device ): Device ( device ) {} - - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_GUI_EVENT) - { - s32 id = event.GUIEvent.Caller->getID(); - - switch(event.GUIEvent.EventType) - { - case EGET_BUTTON_CLICKED: - if (id == 2) - { - Device->closeDevice(); - return true; - } break; - } - } - - return false; - } -}; - -class CSampleSceneNode : public ISceneNode -{ - aabbox3d Box; - S3DVertex Vertices[4]; - SMaterial Material; -public: - - CSampleSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id) - : ISceneNode(parent, mgr, id) - { - Material.Wireframe = false; - Material.Lighting = false; - - Vertices[0] = S3DVertex(0,0,10, 1,1,0, SColor(255,0,255,255), 0, 1); - Vertices[1] = S3DVertex(10,0,-10, 1,0,0, SColor(255,255,0,255), 1, 1); - Vertices[2] = S3DVertex(0,20,0, 0,1,1, SColor(255,255,255,0), 1, 0); - Vertices[3] = S3DVertex(-10,0,-10, 0,0,1, SColor(255,0,255,0), 0, 0); - Box.reset(Vertices[0].Pos); - for (s32 i=1; i<4; ++i) - Box.addInternalPoint(Vertices[i].Pos); - } - virtual void OnRegisterSceneNode() - { - if (IsVisible) - SceneManager->registerNodeForRendering(this); - - ISceneNode::OnRegisterSceneNode(); - } - - virtual void render() - { - u16 indices[] = { 0,2,3, 2,1,3, 1,0,3, 2,0,1 }; - IVideoDriver* driver = SceneManager->getVideoDriver(); - - driver->setMaterial(Material); - driver->setTransform(ETS_WORLD, AbsoluteTransformation); - driver->drawIndexedTriangleList(&Vertices[0], 4, &indices[0], 4); - } - - virtual const aabbox3d& getBoundingBox() const - { - return Box; - } - - virtual u32 getMaterialCount() - { - return 1; - } - - virtual SMaterial& getMaterial(u32 i) - { - return Material; - } -}; - -/*! - Startup a Windows Mobile Device -*/ -IrrlichtDevice *startup() -{ - // both software and burnings video can be used - E_DRIVER_TYPE driverType = EDT_SOFTWARE; // EDT_BURNINGSVIDEO; - - // create device - IrrlichtDevice *device = 0; - - // Use window mode on PC - device = createDevice(driverType, dimension2d(240, 320), 16, false ); - if ( 0 == device ) - return 0; - - IVideoDriver* driver = device->getVideoDriver(); - ISceneManager* smgr = device->getSceneManager(); - IGUIEnvironment* guienv = device->getGUIEnvironment(); - - // set the filesystem relative to the executable -#if defined (_IRR_WINDOWS_) - { - wchar_t buf[255]; - GetModuleFileNameW ( 0, buf, 255 ); - - io::path base = buf; - base = base.subString ( 0, base.findLast ( '\\' ) + 1 ); - device->getFileSystem()->addFileArchive ( base ); - } -#endif - - IGUIStaticText *text = guienv->addStaticText(L"FPS: 25", - rect(140,15,200,30), false, false, 0, 100 ); - - guienv->addButton(core::rect(200,10,238,30), 0, 2, L"Quit"); - - // add irrlicht logo - guienv->addImage(driver->getTexture("../../media/irrlichtlogo3.png"), - core::position2d(0,-2)); - return device; -} - -/*! -*/ -int run ( IrrlichtDevice *device ) -{ - while(device->run()) - if (device->isWindowActive()) - { - device->getVideoDriver()->beginScene(true, true, SColor(0,100,100,100)); - device->getSceneManager()->drawAll(); - device->getGUIEnvironment()->drawAll(); - device->getVideoDriver()->endScene (); - - IGUIElement *stat = device->getGUIEnvironment()-> - getRootGUIElement()->getElementFromId ( 100 ); - if ( stat ) - { - stringw str = L"FPS: "; - str += (s32)device->getVideoDriver()->getFPS(); - - stat->setText ( str.c_str() ); - } - } - - device->drop(); - return 0; -} - -/*! -*/ -int example_customscenenode() -{ - // create device - IrrlichtDevice *device = startup(); - if (device == 0) - return 1; // could not create selected driver. - - // create engine and camera - EventReceiver_basic receiver(device); - device->setEventReceiver(&receiver); - - IVideoDriver* driver = device->getVideoDriver(); - ISceneManager* smgr = device->getSceneManager(); - IGUIEnvironment* guienv = device->getGUIEnvironment(); - - - smgr->addCameraSceneNode(0, vector3df(0,-40,0), vector3df(0,0,0)); - - CSampleSceneNode *myNode = - new CSampleSceneNode(smgr->getRootSceneNode(), smgr, 666); - - ISceneNodeAnimator* anim = - smgr->createRotationAnimator(vector3df(0.8f, 0, 0.8f)); - - if(anim) - { - myNode->addAnimator(anim); - anim->drop(); - anim = 0; // As I shouldn't refer to it again, ensure that I can't - } - - myNode->drop(); - myNode = 0; // As I shouldn't refer to it again, ensure that I can't - - return run ( device ); -} - -class EventReceiver_terrain : public IEventReceiver -{ -public: - - EventReceiver_terrain(IrrlichtDevice *device, scene::ISceneNode* terrain, scene::ISceneNode* skybox, scene::ISceneNode* skydome) : - Device ( device ), Terrain(terrain), Skybox(skybox), Skydome(skydome), showBox(true) - { - Skybox->setVisible(true); - Skydome->setVisible(false); - } - - bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_GUI_EVENT) - { - s32 id = event.GUIEvent.Caller->getID(); - - switch(event.GUIEvent.EventType) - { - case EGET_BUTTON_CLICKED: - if (id == 2) - { - Device->closeDevice(); - return true; - } break; - } - } - - // check if user presses the key 'W' or 'D' - if (event.EventType == irr::EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown) - { - switch (event.KeyInput.Key) - { - case irr::KEY_KEY_W: // switch wire frame mode - Terrain->setMaterialFlag(video::EMF_WIREFRAME, - !Terrain->getMaterial(0).Wireframe); - Terrain->setMaterialFlag(video::EMF_POINTCLOUD, false); - return true; - case irr::KEY_KEY_P: // switch wire frame mode - Terrain->setMaterialFlag(video::EMF_POINTCLOUD, - !Terrain->getMaterial(0).PointCloud); - Terrain->setMaterialFlag(video::EMF_WIREFRAME, false); - return true; - case irr::KEY_KEY_D: // toggle detail map - Terrain->setMaterialType( - Terrain->getMaterial(0).MaterialType == video::EMT_SOLID ? - video::EMT_DETAIL_MAP : video::EMT_SOLID); - return true; - case irr::KEY_KEY_S: // toggle skies - showBox=!showBox; - Skybox->setVisible(showBox); - Skydome->setVisible(!showBox); - return true; - default: - break; - } - } - - return false; - } - -private: - IrrlichtDevice *Device; - scene::ISceneNode* Terrain; - scene::ISceneNode* Skybox; - scene::ISceneNode* Skydome; - bool showBox; -}; - - -/* -The start of the main function starts like in most other example. We ask the user -for the desired renderer and start it up. This time with the advanced parameter handling. -*/ -int example_terrain() -{ - // create device - IrrlichtDevice *device = startup(); - if (device == 0) - return 1; // could not create selected driver. - - /* - First, we add standard stuff to the scene: A nice irrlicht engine - logo, a small help text, a user controlled camera, and we disable - the mouse cursor. - */ - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* env = device->getGUIEnvironment(); - - - //set other font - //env->getSkin()->setFont(env->getFont("../../media/fontlucida.png")); - - // add some help text - env->addStaticText( - L"Press 'W' to change wireframe mode\nPress 'D' to toggle detail map\nPress 'S' to toggle skybox/skydome", - core::rect(5,250,235,320), true, true, 0, -1, true); - - // add camera - scene::ICameraSceneNode* camera = - smgr->addCameraSceneNodeFPS(0,100.0f,1.2f); - - camera->setPosition(core::vector3df(2700*2,255*2,2600*2)); - camera->setTarget(core::vector3df(2397*2,343*2,2700*2)); - camera->setFarValue(42000.0f); - - // disable mouse cursor - device->getCursorControl()->setVisible(false); - - /* - Here comes the terrain renderer scene node: We add it just like any - other scene node to the scene using - ISceneManager::addTerrainSceneNode(). The only parameter we use is a - file name to the heightmap we use. A heightmap is simply a gray scale - texture. The terrain renderer loads it and creates the 3D terrain from - it. - - To make the terrain look more big, we change the scale factor of - it to (40, 4.4, 40). Because we don't have any dynamic lights in the - scene, we switch off the lighting, and we set the file - terrain-texture.jpg as texture for the terrain and detailmap3.jpg as - second texture, called detail map. At last, we set the scale values for - the texture: The first texture will be repeated only one time over the - whole terrain, and the second one (detail map) 20 times. - */ - - // add terrain scene node - scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode( - "../../media/terrain-heightmap.bmp", - 0, // parent node - -1, // node id - core::vector3df(0.f, 0.f, 0.f), // position - core::vector3df(0.f, 0.f, 0.f), // rotation - core::vector3df(40.f, 4.4f, 40.f), // scale - video::SColor ( 255, 255, 255, 255 ), // vertexColor - 5, // maxLOD - scene::ETPS_17, // patchSize - 4 // smoothFactor - ); - - if ( terrain ) - { - terrain->setMaterialFlag(video::EMF_LIGHTING, false); - - terrain->setMaterialTexture(0, - driver->getTexture("../../media/terrain-texture.jpg")); - terrain->setMaterialTexture(1, - driver->getTexture("../../media/detailmap3.jpg")); - - terrain->setMaterialType(video::EMT_DETAIL_MAP); - - terrain->scaleTexture(1.0f, 20.0f); - //terrain->setDebugDataVisible ( true ); - - /* - To be able to do collision with the terrain, we create a triangle selector. - If you want to know what triangle selectors do, just take a look into the - collision tutorial. The terrain triangle selector works together with the - terrain. To demonstrate this, we create a collision response animator - and attach it to the camera, so that the camera will not be able to fly - through the terrain. - */ - - // create triangle selector for the terrain - scene::ITriangleSelector* selector - = smgr->createTerrainTriangleSelector(terrain, 0); - terrain->setTriangleSelector(selector); - - // create collision response animator and attach it to the camera - scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( - selector, camera, core::vector3df(60,100,60), - core::vector3df(0,0,0), - core::vector3df(0,50,0)); - selector->drop(); - camera->addAnimator(anim); - anim->drop(); - - /* If you need access to the terrain data you can also do this directly via the following code fragment. - */ - scene::CDynamicMeshBuffer* buffer = new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT); - terrain->getMeshBufferForLOD(*buffer, 0); - video::S3DVertex2TCoords* data = (video::S3DVertex2TCoords*)buffer->getVertexBuffer().getData(); - // Work on data or get the IndexBuffer with a similar call. - buffer->drop(); // When done drop the buffer again. - } - - /* - To make the user be able to switch between normal and wireframe mode, - we create an instance of the event receiver from above and let Irrlicht - know about it. In addition, we add the skybox which we already used in - lots of Irrlicht examples and a skydome, which is shown mutually - exclusive with the skybox by pressing 'S'. - */ - - // create skybox and skydome - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - - scene::ISceneNode* skybox=smgr->addSkyBoxSceneNode( - driver->getTexture("../../media/irrlicht2_up.jpg"), - driver->getTexture("../../media/irrlicht2_dn.jpg"), - driver->getTexture("../../media/irrlicht2_lf.jpg"), - driver->getTexture("../../media/irrlicht2_rt.jpg"), - driver->getTexture("../../media/irrlicht2_ft.jpg"), - driver->getTexture("../../media/irrlicht2_bk.jpg")); - scene::ISceneNode* skydome=smgr->addSkyDomeSceneNode(driver->getTexture("../../media/skydome.jpg"),16,8,0.95f,2.0f); - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true); - - // create event receiver - EventReceiver_terrain receiver( device, terrain, skybox, skydome); - device->setEventReceiver(&receiver); - - return run ( device ); -} - -/* -*/ -int example_helloworld() -{ - // create device - IrrlichtDevice *device = startup(); - if (device == 0) - return 1; // could not create selected driver. - - IVideoDriver* driver = device->getVideoDriver(); - ISceneManager* smgr = device->getSceneManager(); - IGUIEnvironment* guienv = device->getGUIEnvironment(); - - IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); - if (!mesh) - { - device->drop(); - return 1; - } - IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); - - /* - To let the mesh look a little bit nicer, we change its material. We - disable lighting because we do not have a dynamic light in here, and - the mesh would be totally black otherwise. Then we set the frame loop, - such that the predefined STAND animation is used. And last, we apply a - texture to the mesh. Without it the mesh would be drawn using only a - color. - */ - if (node) - { - node->setMaterialFlag(EMF_LIGHTING, false); - node->setMD2Animation(scene::EMAT_STAND); - node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") ); - } - - /* - To look at the mesh, we place a camera into 3d space at the position - (0, 30, -40). The camera looks from there to (0,5,0), which is - approximately the place where our md2 model is. - */ - smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); - - EventReceiver_basic receiver(device); - device->setEventReceiver(&receiver); - - return run ( device ); - -} - -#if defined (_IRR_WINDOWS_) - #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") -#endif - -/* -*/ -int main() -{ - example_helloworld (); - example_customscenenode(); - //example_terrain(); -} - -/* -**/ diff --git a/examples/18.SplitScreen/Makefile b/examples/18.SplitScreen/Makefile deleted file mode 100644 index fd414013..00000000 --- a/examples/18.SplitScreen/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 18.SplitScreen -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/18.SplitScreen/SplitScreen.cbp b/examples/18.SplitScreen/SplitScreen.cbp deleted file mode 100644 index e1574a6d..00000000 --- a/examples/18.SplitScreen/SplitScreen.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/18.SplitScreen/SplitScreen.vcproj b/examples/18.SplitScreen/SplitScreen.vcproj deleted file mode 100644 index 46cb6b78..00000000 --- a/examples/18.SplitScreen/SplitScreen.vcproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/18.SplitScreen/SplitScreen.xcodeproj/project.pbxproj b/examples/18.SplitScreen/SplitScreen.xcodeproj/project.pbxproj deleted file mode 100644 index 1201daf9..00000000 --- a/examples/18.SplitScreen/SplitScreen.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 18.SplitScreen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 18.SplitScreen.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 18.SplitScreen.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 18.SplitScreen */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "18.SplitScreen" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 18.SplitScreen; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 18.SplitScreen.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "SplitScreen" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 18.SplitScreen */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "SplitScreen" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "18.SplitScreen" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/18.SplitScreen/SplitScreen.xcodeproj/xcshareddata/xcschemes/18.SplitScreen.xcscheme b/examples/18.SplitScreen/SplitScreen.xcodeproj/xcshareddata/xcschemes/18.SplitScreen.xcscheme deleted file mode 100644 index 0af4a284..00000000 --- a/examples/18.SplitScreen/SplitScreen.xcodeproj/xcshareddata/xcschemes/18.SplitScreen.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/18.SplitScreen/SplitScreen_vc10.vcxproj b/examples/18.SplitScreen/SplitScreen_vc10.vcxproj deleted file mode 100644 index a0c211c7..00000000 --- a/examples/18.SplitScreen/SplitScreen_vc10.vcxproj +++ /dev/null @@ -1,193 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 18.SplitScreen - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0} - 18.SplitScreen - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/18.SplitScreen/SplitScreen_vc11.vcxproj b/examples/18.SplitScreen/SplitScreen_vc11.vcxproj deleted file mode 100644 index e4707c58..00000000 --- a/examples/18.SplitScreen/SplitScreen_vc11.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 18.SplitScreen - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0} - 18.SplitScreen - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/18.SplitScreen/SplitScreen_vc12.vcxproj b/examples/18.SplitScreen/SplitScreen_vc12.vcxproj deleted file mode 100644 index 1c6c62d3..00000000 --- a/examples/18.SplitScreen/SplitScreen_vc12.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 18.SplitScreen - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0} - 18.SplitScreen - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/18.SplitScreen/SplitScreen_vc14.vcxproj b/examples/18.SplitScreen/SplitScreen_vc14.vcxproj deleted file mode 100644 index 7004b80c..00000000 --- a/examples/18.SplitScreen/SplitScreen_vc14.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 18.SplitScreen - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0} - 18.SplitScreen - Win32Proj - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SplitScreen.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\18.SplitScreen.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/18.SplitScreen/main.cpp b/examples/18.SplitScreen/main.cpp deleted file mode 100644 index 600b7bf8..00000000 --- a/examples/18.SplitScreen/main.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/** Example 018 Splitscreen - -A tutorial by Max Winkel. - -In this tutorial we'll learn how to use splitscreen (e.g. for racing-games) -with Irrlicht. We'll create a viewport divided -into 4 parts, with 3 fixed cameras and one user-controlled. - -Ok, let's start with the headers (I think there's -nothing to say about it) -*/ - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -//Namespaces for the engine -using namespace irr; -using namespace core; -using namespace video; -using namespace scene; - -/* -Now we'll define the resolution in a constant for use in -initializing the device and setting up the viewport. In addition -we set up a global variable saying splitscreen is active or not. -*/ -//Resolution -const int ResX=800; -const int ResY=600; -const bool fullScreen=false; - -//Use SplitScreen? -bool SplitScreen=true; - -/* -Now we need four pointers to our cameras which are created later: -*/ -//cameras -ICameraSceneNode *camera[4]={0,0,0,0}; -/* -In our event-receiver we switch the SplitScreen-variable, -whenever the user press the S-key. All other events are sent -to the FPS camera. -*/ - -class MyEventReceiver : public IEventReceiver -{ - public: - virtual bool OnEvent(const SEvent& event) - { - //Key S enables/disables SplitScreen - if (event.EventType == irr::EET_KEY_INPUT_EVENT && - event.KeyInput.Key == KEY_KEY_S && event.KeyInput.PressedDown) - { - SplitScreen = !SplitScreen; - return true; - } - //Send all other events to camera4 - if (camera[3]) - return camera[3]->OnEvent(event); - return false; - } -}; - -/* -Ok, now the main-function: -First, we initialize the device, get the SourceManager and -VideoDriver, load an animated mesh from .md2 and a map from -.pk3. Because that's old stuff, I won't explain every step. -Just take care of the maps position. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - //Instance of the EventReceiver - MyEventReceiver receiver; - - //Initialise the engine - IrrlichtDevice *device = createDevice(driverType, - dimension2du(ResX,ResY), 32, fullScreen, - false, false, &receiver); - if (!device) - return 1; - - ISceneManager *smgr = device->getSceneManager(); - IVideoDriver *driver = device->getVideoDriver(); - - const io::path mediaPath = getExampleMediaPath(); - - //Load model - IAnimatedMesh *model = smgr->getMesh(mediaPath + "sydney.md2"); - if (!model) - return 1; - IAnimatedMeshSceneNode *model_node = smgr->addAnimatedMeshSceneNode(model); - //Load texture - if (model_node) - { - ITexture *texture = driver->getTexture(mediaPath + "sydney.bmp"); - model_node->setMaterialTexture(0,texture); - model_node->setMD2Animation(scene::EMAT_RUN); - //Disable lighting (we've got no light) - model_node->setMaterialFlag(EMF_LIGHTING,false); - } - - //Load map - device->getFileSystem()->addFileArchive(mediaPath + "map-20kdm2.pk3"); - IAnimatedMesh *map = smgr->getMesh("20kdm2.bsp"); - if (map) - { - ISceneNode *map_node = smgr->addOctreeSceneNode(map->getMesh(0)); - //Set position - map_node->setPosition(vector3df(-850,-220,-850)); - } - -/* -Now we create our four cameras. One is looking at the model -from the front, one from the top and one from the side. In -addition there's a FPS-camera which can be controlled by the -user. -*/ - // Create 3 fixed and one user-controlled cameras - //Front - camera[0] = smgr->addCameraSceneNode(0, vector3df(50,0,0), vector3df(0,0,0)); - //Top - camera[1] = smgr->addCameraSceneNode(0, vector3df(0,50,0), vector3df(0,0,0)); - //Left - camera[2] = smgr->addCameraSceneNode(0, vector3df(0,0,50), vector3df(0,0,0)); - //User-controlled - camera[3] = smgr->addCameraSceneNodeFPS(); - // don't start at sydney's position - if (camera[3]) - camera[3]->setPosition(core::vector3df(-50,0,-50)); - -/* -Create a variable for counting the fps and hide the mouse: -*/ - //Hide mouse - device->getCursorControl()->setVisible(false); - //We want to count the fps - int lastFPS = -1; - -/* -There wasn't much new stuff - till now! -Only by defining four cameras, the game won't be splitscreen. -To do this you need several steps: - - Set the viewport to the whole screen - - Begin a new scene (Clear screen) - - - The following 3 steps are repeated for every viewport in the splitscreen - - Set the viewport to the area you wish - - Activate the camera which should be "linked" with the viewport - - Render all objects - - - If you have a GUI: - - Set the viewport the whole screen - - Display the GUI - - End scene - -Sounds a little complicated, but you'll see it isn't: -*/ - - while(device->run()) - { - //Set the viewpoint to the whole screen and begin scene - driver->setViewPort(rect(0,0,ResX,ResY)); - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(255,100,100,100)); - //If SplitScreen is used - if (SplitScreen) - { - //Activate camera1 - smgr->setActiveCamera(camera[0]); - //Set viewpoint to the first quarter (left top) - driver->setViewPort(rect(0,0,ResX/2,ResY/2)); - //Draw scene - smgr->drawAll(); - //Activate camera2 - smgr->setActiveCamera(camera[1]); - //Set viewpoint to the second quarter (right top) - driver->setViewPort(rect(ResX/2,0,ResX,ResY/2)); - //Draw scene - smgr->drawAll(); - //Activate camera3 - smgr->setActiveCamera(camera[2]); - //Set viewpoint to the third quarter (left bottom) - driver->setViewPort(rect(0,ResY/2,ResX/2,ResY)); - //Draw scene - smgr->drawAll(); - //Set viewport the last quarter (right bottom) - driver->setViewPort(rect(ResX/2,ResY/2,ResX,ResY)); - } - //Activate camera4 - smgr->setActiveCamera(camera[3]); - //Draw scene - smgr->drawAll(); - driver->endScene(); - - /* - As you can probably see, the image is rendered for every - viewport separately. That means, that you'll loose much performance. - Ok, if you're asking "How do I have to set the viewport - to get this or that screen?", don't panic. It's really - easy: In the rect-function you define 4 coordinates: - - X-coordinate of the corner left top - - Y-coordinate of the corner left top - - X-coordinate of the corner right bottom - - Y-coordinate of the corner right bottom - - That means, if you want to split the screen into 2 viewports - you would give the following coordinates: - - 1st viewport: 0,0,ResX/2,ResY - - 2nd viewport: ResX/2,0,ResX,ResY - - If you didn't fully understand, just play around with the example - to check out what happens. - - Now we just view the current fps and shut down the engine, - when the user wants to: - */ - //Get and show fps - if (driver->getFPS() != lastFPS) - { - lastFPS = driver->getFPS(); - core::stringw tmp = L"Irrlicht SplitScreen-Example (FPS: "; - tmp += lastFPS; - tmp += ")"; - device->setWindowCaption(tmp.c_str()); - } - } - //Delete device - device->drop(); - return 0; -} -/* -That's it! Just compile and play around with the program. -Note: With the S-Key you can switch between using splitscreen -and not. -**/ - diff --git a/examples/19.MouseAndJoystick/Makefile b/examples/19.MouseAndJoystick/Makefile deleted file mode 100644 index 90d08fb3..00000000 --- a/examples/19.MouseAndJoystick/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 19.MouseAndJoystick -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick.cbp b/examples/19.MouseAndJoystick/MouseAndJoystick.cbp deleted file mode 100644 index 7400072c..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick.vcproj b/examples/19.MouseAndJoystick/MouseAndJoystick.vcproj deleted file mode 100644 index 84d8396f..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick.vcproj +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/project.pbxproj b/examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/project.pbxproj deleted file mode 100644 index 5a3cddf3..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 19.MouseAndJoystick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 19.MouseAndJoystick.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 19.MouseAndJoystick.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 19.MouseAndJoystick */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "19.MouseAndJoystick" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 19.MouseAndJoystick; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 19.MouseAndJoystick.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "MouseAndJoystick" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 19.MouseAndJoystick */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "MouseAndJoystick" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "19.MouseAndJoystick" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/xcshareddata/xcschemes/19.MouseAndJoystick.xcscheme b/examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/xcshareddata/xcschemes/19.MouseAndJoystick.xcscheme deleted file mode 100644 index a7e77e1d..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick.xcodeproj/xcshareddata/xcschemes/19.MouseAndJoystick.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick_vc10.vcxproj b/examples/19.MouseAndJoystick/MouseAndJoystick_vc10.vcxproj deleted file mode 100644 index 16c3a38f..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick_vc10.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 19.MouseAndJoystick - {FE853A36-E0D1-4AC5-A792-B643E70D2953} - MouseAndJoystick - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick_vc11.vcxproj b/examples/19.MouseAndJoystick/MouseAndJoystick_vc11.vcxproj deleted file mode 100644 index 16c3a38f..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick_vc11.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 19.MouseAndJoystick - {FE853A36-E0D1-4AC5-A792-B643E70D2953} - MouseAndJoystick - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick_vc12.vcxproj b/examples/19.MouseAndJoystick/MouseAndJoystick_vc12.vcxproj deleted file mode 100644 index 24dca694..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick_vc12.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 19.MouseAndJoystick - {FE853A36-E0D1-4AC5-A792-B643E70D2953} - MouseAndJoystick - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/19.MouseAndJoystick/MouseAndJoystick_vc14.vcxproj b/examples/19.MouseAndJoystick/MouseAndJoystick_vc14.vcxproj deleted file mode 100644 index 1c452c59..00000000 --- a/examples/19.MouseAndJoystick/MouseAndJoystick_vc14.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 19.MouseAndJoystick - {FE853A36-E0D1-4AC5-A792-B643E70D2953} - MouseAndJoystick - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/MouseAndJoystick.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/MouseAndJoystick.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\19.MouseAndJoystick.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/19.MouseAndJoystick/main.cpp b/examples/19.MouseAndJoystick/main.cpp deleted file mode 100644 index faa63057..00000000 --- a/examples/19.MouseAndJoystick/main.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/** Example 019 Mouse and Joystick - -This tutorial builds on example 04.Movement which showed how to -handle keyboard events in Irrlicht. Here we'll handle mouse events -and joystick events, if you have a joystick connected and a device -that supports joysticks. These are currently Windows, Linux and SDL -devices. -*/ - -#ifdef _MSC_VER -// We'll define this to stop MSVC complaining about sprintf(). -#define _CRT_SECURE_NO_WARNINGS -#pragma comment(lib, "Irrlicht.lib") -#endif - -#include -#include "driverChoice.h" - -using namespace irr; - -/* -Just as we did in example 04.Movement, we'll store the latest state of the -mouse and the first joystick, updating them as we receive events. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - // We'll create a struct to record info on the mouse state - struct SMouseState - { - core::position2di Position; - bool LeftButtonDown; - SMouseState() : LeftButtonDown(false) { } - } MouseState; - - // This is the one method that we have to implement - virtual bool OnEvent(const SEvent& event) - { - // Remember the mouse state - if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) - { - switch(event.MouseInput.Event) - { - case EMIE_LMOUSE_PRESSED_DOWN: - MouseState.LeftButtonDown = true; - break; - - case EMIE_LMOUSE_LEFT_UP: - MouseState.LeftButtonDown = false; - break; - - case EMIE_MOUSE_MOVED: - MouseState.Position.X = event.MouseInput.X; - MouseState.Position.Y = event.MouseInput.Y; - break; - - default: - // We won't use the wheel - break; - } - } - - // The state of each connected joystick is sent to us - // once every run() of the Irrlicht device. Store the - // state of the first joystick, ignoring other joysticks. - // This is currently only supported on Windows and Linux. - if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT - && event.JoystickEvent.Joystick == 0) - { - JoystickState = event.JoystickEvent; - } - - return false; - } - - const SEvent::SJoystickEvent & GetJoystickState(void) const - { - return JoystickState; - } - - const SMouseState & GetMouseState(void) const - { - return MouseState; - } - - - MyEventReceiver() - { - } - -private: - SEvent::SJoystickEvent JoystickState; -}; - - -/* -The event receiver for keeping the pressed keys is ready, the actual responses -will be made inside the render loop, right before drawing the scene. So lets -just create an irr::IrrlichtDevice and the scene node we want to move. We also -create some other additional scene nodes, to show that there are also some -different possibilities to move and animate scene nodes. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device - MyEventReceiver receiver; - - IrrlichtDevice* device = createDevice(driverType, - core::dimension2d(640, 480), 16, false, false, false, &receiver); - - if (device == 0) - return 1; // could not create selected driver. - - - core::array joystickInfo; - if(device->activateJoysticks(joystickInfo)) - { - std::cout << "Joystick support is enabled and " << joystickInfo.size() << " joystick(s) are present." << std::endl; - - for(u32 joystick = 0; joystick < joystickInfo.size(); ++joystick) - { - std::cout << "Joystick " << joystick << ":" << std::endl; - std::cout << "\tName: '" << joystickInfo[joystick].Name.c_str() << "'" << std::endl; - std::cout << "\tAxes: " << joystickInfo[joystick].Axes << std::endl; - std::cout << "\tButtons: " << joystickInfo[joystick].Buttons << std::endl; - - std::cout << "\tHat is: "; - - switch(joystickInfo[joystick].PovHat) - { - case SJoystickInfo::POV_HAT_PRESENT: - std::cout << "present" << std::endl; - break; - - case SJoystickInfo::POV_HAT_ABSENT: - std::cout << "absent" << std::endl; - break; - - case SJoystickInfo::POV_HAT_UNKNOWN: - default: - std::cout << "unknown" << std::endl; - break; - } - } - } - else - { - std::cout << "Joystick support is not enabled." << std::endl; - } - - core::stringw tmp = L"Irrlicht Joystick Example ("; - tmp += joystickInfo.size(); - tmp += " joysticks)"; - device->setWindowCaption(tmp.c_str()); - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - /* - We'll create an arrow mesh and move it around either with the joystick axis/hat, - or make it follow the mouse pointer. */ - scene::ISceneNode * node = smgr->addMeshSceneNode( - smgr->addArrowMesh( "Arrow", - video::SColor(255, 255, 0, 0), - video::SColor(255, 0, 255, 0), - 16,16, - 2.f, 1.3f, - 0.1f, 0.6f - ) - ); - node->setMaterialFlag(video::EMF_LIGHTING, false); - - scene::ICameraSceneNode * camera = smgr->addCameraSceneNode(); - camera->setPosition(core::vector3df(0, 0, -10)); - - // As in example 04, we'll use framerate independent movement. - u32 then = device->getTimer()->getTime(); - const f32 MOVEMENT_SPEED = 5.f; - - while(device->run()) - { - // Work out a frame delta time. - const u32 now = device->getTimer()->getTime(); - const f32 frameDeltaTime = (f32)(now - then) / 1000.f; // Time in seconds - then = now; - - bool movedWithJoystick = false; - core::vector3df nodePosition = node->getPosition(); - - if(joystickInfo.size() > 0) - { - f32 moveHorizontal = 0.f; // Range is -1.f for full left to +1.f for full right - f32 moveVertical = 0.f; // -1.f for full down to +1.f for full up. - - const SEvent::SJoystickEvent & joystickData = receiver.GetJoystickState(); - - // We receive the full analog range of the axes, and so have to implement our - // own dead zone. This is an empirical value, since some joysticks have more - // jitter or creep around the center point than others. We'll use 5% of the - // range as the dead zone, but generally you would want to give the user the - // option to change this. - const f32 DEAD_ZONE = 0.05f; - - moveHorizontal = - (f32)joystickData.Axis[SEvent::SJoystickEvent::AXIS_X] / 32767.f; - if(fabs(moveHorizontal) < DEAD_ZONE) - moveHorizontal = 0.f; - - moveVertical = - (f32)joystickData.Axis[SEvent::SJoystickEvent::AXIS_Y] / -32767.f; - if(fabs(moveVertical) < DEAD_ZONE) - moveVertical = 0.f; - - // POV hat info is only currently supported on Windows, but the value is - // guaranteed to be 65535 if it's not supported, so we can check its range. - const u16 povDegrees = joystickData.POV / 100; - if(povDegrees < 360) - { - if(povDegrees > 0 && povDegrees < 180) - moveHorizontal = 1.f; - else if(povDegrees > 180) - moveHorizontal = -1.f; - - if(povDegrees > 90 && povDegrees < 270) - moveVertical = -1.f; - else if(povDegrees > 270 || povDegrees < 90) - moveVertical = +1.f; - } - - if(!core::equals(moveHorizontal, 0.f) || !core::equals(moveVertical, 0.f)) - { - nodePosition.X += MOVEMENT_SPEED * frameDeltaTime * moveHorizontal; - nodePosition.Y += MOVEMENT_SPEED * frameDeltaTime * moveVertical; - movedWithJoystick = true; - } - } - - // If the arrow node isn't being moved with the joystick, then have it follow the mouse cursor. - if(!movedWithJoystick) - { - // Create a ray through the mouse cursor. - core::line3df ray = smgr->getSceneCollisionManager()->getRayFromScreenCoordinates( - receiver.GetMouseState().Position, camera); - - // And intersect the ray with a plane around the node facing towards the camera. - core::plane3df plane(nodePosition, core::vector3df(0, 0, -1)); - core::vector3df mousePosition; - if(plane.getIntersectionWithLine(ray.start, ray.getVector(), mousePosition)) - { - // We now have a mouse position in 3d space; move towards it. - core::vector3df toMousePosition(mousePosition - nodePosition); - const f32 availableMovement = MOVEMENT_SPEED * frameDeltaTime; - - if(toMousePosition.getLength() <= availableMovement) - nodePosition = mousePosition; // Jump to the final position - else - nodePosition += toMousePosition.normalize() * availableMovement; // Move towards it - } - } - - node->setPosition(nodePosition); - - // Turn lighting on and off depending on whether the left mouse button is down. - node->setMaterialFlag(video::EMF_LIGHTING, receiver.GetMouseState().LeftButtonDown); - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,113,113,133)); - smgr->drawAll(); // draw the 3d scene - driver->endScene(); - } - - /* - In the end, delete the Irrlicht device. - */ - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/20.ManagedLights/Makefile b/examples/20.ManagedLights/Makefile deleted file mode 100644 index 6fe42450..00000000 --- a/examples/20.ManagedLights/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 20.ManagedLights -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/20.ManagedLights/ManagedLights.cbp b/examples/20.ManagedLights/ManagedLights.cbp deleted file mode 100644 index 5c94e995..00000000 --- a/examples/20.ManagedLights/ManagedLights.cbp +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - diff --git a/examples/20.ManagedLights/ManagedLights.vcproj b/examples/20.ManagedLights/ManagedLights.vcproj deleted file mode 100644 index 850a8d27..00000000 --- a/examples/20.ManagedLights/ManagedLights.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/20.ManagedLights/ManagedLights.xcodeproj/project.pbxproj b/examples/20.ManagedLights/ManagedLights.xcodeproj/project.pbxproj deleted file mode 100644 index 34988448..00000000 --- a/examples/20.ManagedLights/ManagedLights.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 20.ManagedLights.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 20.ManagedLights.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 20.ManagedLights.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 20.ManagedLights */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "20.ManagedLights" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 20.ManagedLights; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 20.ManagedLights.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "ManagedLights" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 20.ManagedLights */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "ManagedLights" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "20.ManagedLights" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/20.ManagedLights/ManagedLights.xcodeproj/xcshareddata/xcschemes/20.ManagedLights.xcscheme b/examples/20.ManagedLights/ManagedLights.xcodeproj/xcshareddata/xcschemes/20.ManagedLights.xcscheme deleted file mode 100644 index 5e640be9..00000000 --- a/examples/20.ManagedLights/ManagedLights.xcodeproj/xcshareddata/xcschemes/20.ManagedLights.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/20.ManagedLights/ManagedLights_vc10.vcxproj b/examples/20.ManagedLights/ManagedLights_vc10.vcxproj deleted file mode 100644 index 53568a92..00000000 --- a/examples/20.ManagedLights/ManagedLights_vc10.vcxproj +++ /dev/null @@ -1,234 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 20.ManagedLights - {16007FE2-142B-47F8-93E1-519BA3F39E71} - ManagedLights - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\Lib\Win32-visualstudio\Irrlicht.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/20.ManagedLights/ManagedLights_vc11.vcxproj b/examples/20.ManagedLights/ManagedLights_vc11.vcxproj deleted file mode 100644 index 53568a92..00000000 --- a/examples/20.ManagedLights/ManagedLights_vc11.vcxproj +++ /dev/null @@ -1,234 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 20.ManagedLights - {16007FE2-142B-47F8-93E1-519BA3F39E71} - ManagedLights - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\Lib\Win32-visualstudio\Irrlicht.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/20.ManagedLights/ManagedLights_vc12.vcxproj b/examples/20.ManagedLights/ManagedLights_vc12.vcxproj deleted file mode 100644 index 287f1b96..00000000 --- a/examples/20.ManagedLights/ManagedLights_vc12.vcxproj +++ /dev/null @@ -1,234 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 20.ManagedLights - {16007FE2-142B-47F8-93E1-519BA3F39E71} - ManagedLights - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\Lib\Win32-visualstudio\Irrlicht.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/20.ManagedLights/ManagedLights_vc14.vcxproj b/examples/20.ManagedLights/ManagedLights_vc14.vcxproj deleted file mode 100644 index 31e9e782..00000000 --- a/examples/20.ManagedLights/ManagedLights_vc14.vcxproj +++ /dev/null @@ -1,234 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 20.ManagedLights - {16007FE2-142B-47F8-93E1-519BA3F39E71} - ManagedLights - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\Lib\Win32-visualstudio\Irrlicht.lib;%(AdditionalDependencies) - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/ManagedLights.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/ManagedLights.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\20.ManagedLights.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/20.ManagedLights/main.cpp b/examples/20.ManagedLights/main.cpp deleted file mode 100644 index f1fdb50d..00000000 --- a/examples/20.ManagedLights/main.cpp +++ /dev/null @@ -1,389 +0,0 @@ -/** Example 020 Managed Lights - -Written by Colin MacDonald. This tutorial explains the use of the Light Manager -of Irrlicht. It enables the use of more dynamic light sources than the actual -hardware supports. Further applications of the Light Manager, such as per scene -node callbacks, are left out for simplicity of the example. -*/ - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; -using namespace core; - -#if defined(_MSC_VER) -#pragma comment(lib, "Irrlicht.lib") -#endif // MSC_VER - -/* - Normally, you are limited to 8 dynamic lights per scene: this is a hardware limit. If you - want to use more dynamic lights in your scene, then you can register an optional light - manager that allows you to to turn lights on and off at specific point during rendering. - You are still limited to 8 lights, but the limit is per scene node. - - This is completely optional: if you do not register a light manager, then a default - distance-based scheme will be used to prioritise hardware lights based on their distance - from the active camera. - - NO_MANAGEMENT disables the light manager and shows Irrlicht's default light behaviour. - The 8 lights nearest to the camera will be turned on, and other lights will be turned off. - In this example, this produces a funky looking but incoherent light display. - - LIGHTS_NEAREST_NODE shows an implementation that turns on a limited number of lights - per mesh scene node. If finds the 3 lights that are nearest to the node being rendered, - and turns them on, turning all other lights off. This works, but as it operates on every - light for every node, it does not scale well with many lights. The flickering you can see - in this demo is due to the lights swapping their relative positions from the cubes - (a deliberate demonstration of the limitations of this technique). - - LIGHTS_IN_ZONE shows a technique for turning on lights based on a 'zone'. Each empty scene - node is considered to be the parent of a zone. When nodes are rendered, they turn off all - lights, then find their parent 'zone' and turn on all lights that are inside that zone, i.e. - are descendents of it in the scene graph. This produces true 'local' lighting for each cube - in this example. You could use a similar technique to locally light all meshes in (e.g.) - a room, without the lights spilling out to other rooms. - - This light manager is also an event receiver; this is purely for simplicity in this example, - it's neither necessary nor recommended for a real application. -*/ -class CMyLightManager : public scene::ILightManager, public IEventReceiver -{ - typedef enum - { - NO_MANAGEMENT, - LIGHTS_NEAREST_NODE, - LIGHTS_IN_ZONE - } - LightManagementMode; - - LightManagementMode Mode; - LightManagementMode RequestedMode; - - // These data represent the state information that this light manager - // is interested in. - scene::ISceneManager * SceneManager; - core::array * SceneLightList; - scene::E_SCENE_NODE_RENDER_PASS CurrentRenderPass; - scene::ISceneNode * CurrentSceneNode; - -public: - CMyLightManager(scene::ISceneManager* sceneManager) - : Mode(NO_MANAGEMENT), RequestedMode(NO_MANAGEMENT), - SceneManager(sceneManager), SceneLightList(0), - CurrentRenderPass(scene::ESNRP_NONE), CurrentSceneNode(0) - { } - - // The input receiver interface, which just switches light management strategy - bool OnEvent(const SEvent & event) - { - bool handled = false; - - if (event.EventType == irr::EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown) - { - handled = true; - switch(event.KeyInput.Key) - { - case irr::KEY_KEY_1: - RequestedMode = NO_MANAGEMENT; - break; - case irr::KEY_KEY_2: - RequestedMode = LIGHTS_NEAREST_NODE; - break; - case irr::KEY_KEY_3: - RequestedMode = LIGHTS_IN_ZONE; - break; - default: - handled = false; - break; - } - - if(NO_MANAGEMENT == RequestedMode) - SceneManager->setLightManager(0); // Show that it's safe to register the light manager - else - SceneManager->setLightManager(this); - } - - return handled; - } - - - // This is called before the first scene node is rendered. - virtual void OnPreRender(core::array & lightList) - { - // Update the mode; changing it here ensures that it's consistent throughout a render - Mode = RequestedMode; - - // Store the light list. I am free to alter this list until the end of OnPostRender(). - SceneLightList = &lightList; - } - - // Called after the last scene node is rendered. - virtual void OnPostRender() - { - // Since light management might be switched off in the event handler, we'll turn all - // lights on to ensure that they are in a consistent state. You wouldn't normally have - // to do this when using a light manager, since you'd continue to do light management - // yourself. - for (u32 i = 0; i < SceneLightList->size(); i++) - (*SceneLightList)[i]->setVisible(true); - } - - virtual void OnRenderPassPreRender(scene::E_SCENE_NODE_RENDER_PASS renderPass) - { - // I don't have to do anything here except remember which render pass I am in. - CurrentRenderPass = renderPass; - } - - virtual void OnRenderPassPostRender(scene::E_SCENE_NODE_RENDER_PASS renderPass) - { - // I only want solid nodes to be lit, so after the solid pass, turn all lights off. - if (scene::ESNRP_SOLID == renderPass) - { - for (u32 i = 0; i < SceneLightList->size(); ++i) - (*SceneLightList)[i]->setVisible(false); - } - } - - // This is called before the specified scene node is rendered - virtual void OnNodePreRender(scene::ISceneNode* node) - { - CurrentSceneNode = node; - - // This light manager only considers solid objects, but you are free to manipulate - // lights during any phase, depending on your requirements. - if (scene::ESNRP_SOLID != CurrentRenderPass) - return; - - // And in fact for this example, I only want to consider lighting for cube scene - // nodes. You will probably want to deal with lighting for (at least) mesh / - // animated mesh scene nodes as well. - if (node->getType() != scene::ESNT_CUBE) - return; - - if (LIGHTS_NEAREST_NODE == Mode) - { - // This is a naive implementation that prioritises every light in the scene - // by its proximity to the node being rendered. This produces some flickering - // when lights orbit closer to a cube than its 'zone' lights. - const vector3df nodePosition = node->getAbsolutePosition(); - - // Sort the light list by prioritising them based on their distance from the node - // that's about to be rendered. - array sortingArray; - sortingArray.reallocate(SceneLightList->size()); - - u32 i; - for(i = 0; i < SceneLightList->size(); ++i) - { - scene::ISceneNode* lightNode = (*SceneLightList)[i]; - const f64 distance = lightNode->getAbsolutePosition().getDistanceFromSQ(nodePosition); - sortingArray.push_back(LightDistanceElement(lightNode, distance)); - } - - sortingArray.sort(); - - // The list is now sorted by proximity to the node. - // Turn on the three nearest lights, and turn the others off. - for(i = 0; i < sortingArray.size(); ++i) - sortingArray[i].node->setVisible(i < 3); - } - else if(LIGHTS_IN_ZONE == Mode) - { - // Empty scene nodes are used to represent 'zones'. For each solid mesh that - // is being rendered, turn off all lights, then find its 'zone' parent, and turn - // on all lights that are found under that node in the scene graph. - // This is a general purpose algorithm that doesn't use any special - // knowledge of how this particular scene graph is organised. - for (u32 i = 0; i < SceneLightList->size(); ++i) - { - if ((*SceneLightList)[i]->getType() != scene::ESNT_LIGHT) - continue; - scene::ILightSceneNode* lightNode = static_cast((*SceneLightList)[i]); - video::SLight & lightData = lightNode->getLightData(); - - if (video::ELT_DIRECTIONAL != lightData.Type) - lightNode->setVisible(false); - } - - scene::ISceneNode * parentZone = findZone(node); - if (parentZone) - turnOnZoneLights(parentZone); - } - } - - // Called after the specified scene node is rendered - virtual void OnNodePostRender(scene::ISceneNode* node) - { - // I don't need to do any light management after individual node rendering. - } - -private: - - // Find the empty scene node that is the parent of the specified node - scene::ISceneNode * findZone(scene::ISceneNode * node) - { - if (!node) - return 0; - - if (node->getType() == scene::ESNT_EMPTY) - return node; - - return findZone(node->getParent()); - } - - // Turn on all lights that are children (directly or indirectly) of the - // specified scene node. - void turnOnZoneLights(scene::ISceneNode * node) - { - core::list const & children = node->getChildren(); - for (core::list::ConstIterator child = children.begin(); - child != children.end(); ++child) - { - if ((*child)->getType() == scene::ESNT_LIGHT) - (*child)->setVisible(true); - else // Assume that lights don't have any children that are also lights - turnOnZoneLights(*child); - } - } - - - // A utility class to aid in sorting scene nodes into a distance order - class LightDistanceElement - { - public: - LightDistanceElement() {}; - - LightDistanceElement(scene::ISceneNode* n, f64 d) - : node(n), distance(d) { } - - scene::ISceneNode* node; - f64 distance; - - // Lower distance elements are sorted to the start of the array - bool operator < (const LightDistanceElement& other) const - { - return (distance < other.distance); - } - }; -}; - - -/* -*/ -int main(int argumentCount, char * argumentValues[]) -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - IrrlichtDevice *device = createDevice(driverType, - dimension2d(640, 480), 32); - - if(!device) - return -1; - - f32 const lightRadius = 60.f; // Enough to reach the far side of each 'zone' - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* guienv = device->getGUIEnvironment(); - - const io::path mediaPath = getExampleMediaPath(); - - gui::IGUISkin* skin = guienv->getSkin(); - if (skin) - { - skin->setColor(gui::EGDC_BUTTON_TEXT, video::SColor(255, 255, 255, 255)); - gui::IGUIFont* font = guienv->getFont(mediaPath + "fontlucida.png"); - if(font) - skin->setFont(font); - } - - guienv->addStaticText(L"1 - No light management", core::rect(10,10,200,30)); - guienv->addStaticText(L"2 - Closest 3 lights", core::rect(10,30,200,50)); - guienv->addStaticText(L"3 - Lights in zone", core::rect(10,50,200,70)); - -/* -Add several "zones". You could use this technique to light individual rooms, for example. -*/ - for(f32 zoneX = -100.f; zoneX <= 100.f; zoneX += 50.f) - for(f32 zoneY = -60.f; zoneY <= 60.f; zoneY += 60.f) - { - // Start with an empty scene node, which we will use to represent a zone. - scene::ISceneNode * zoneRoot = smgr->addEmptySceneNode(); - zoneRoot->setPosition(vector3df(zoneX, zoneY, 0)); - - // Each zone contains a rotating cube - scene::IMeshSceneNode * node = smgr->addCubeSceneNode(15, zoneRoot); - scene::ISceneNodeAnimator * rotation = smgr->createRotationAnimator(vector3df(0.25f, 0.5f, 0.75f)); - node->addAnimator(rotation); - rotation->drop(); - - // And each cube has three lights attached to it. The lights are attached to billboards so - // that we can see where they are. The billboards are attached to the cube, so that the - // lights are indirect descendents of the same empty scene node as the cube. - scene::IBillboardSceneNode * billboard = smgr->addBillboardSceneNode(node); - billboard->setPosition(vector3df(0, -14, 30)); - billboard->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); - billboard->setMaterialTexture(0, driver->getTexture(mediaPath + "particle.bmp")); - billboard->setMaterialFlag(video::EMF_LIGHTING, false); - smgr->addLightSceneNode(billboard, vector3df(0, 0, 0), video::SColorf(1, 0, 0), lightRadius); - - billboard = smgr->addBillboardSceneNode(node); - billboard->setPosition(vector3df(-21, -14, -21)); - billboard->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); - billboard->setMaterialTexture(0, driver->getTexture(mediaPath + "particle.bmp")); - billboard->setMaterialFlag(video::EMF_LIGHTING, false); - smgr->addLightSceneNode(billboard, vector3df(0, 0, 0), video::SColorf(0, 1, 0), lightRadius); - - billboard = smgr->addBillboardSceneNode(node); - billboard->setPosition(vector3df(21, -14, -21)); - billboard->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); - billboard->setMaterialTexture(0, driver->getTexture(mediaPath + "particle.bmp")); - billboard->setMaterialFlag(video::EMF_LIGHTING, false); - smgr->addLightSceneNode(billboard, vector3df(0, 0, 0), video::SColorf(0, 0, 1), lightRadius); - - // Each cube also has a smaller cube rotating around it, to show that the cubes are being - // lit by the lights in their 'zone', not just lights that are their direct children. - node = smgr->addCubeSceneNode(5, node); - node->setPosition(vector3df(0, 21, 0)); - } - - smgr->addCameraSceneNode(0, vector3df(0,0,-130), vector3df(0,0,0)); - - CMyLightManager * myLightManager = new CMyLightManager(smgr); - smgr->setLightManager(0); // This is the default: we won't do light management until told to do it. - device->setEventReceiver(myLightManager); - - int lastFps = -1; - - while(device->run()) - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,100,101,140)); - smgr->drawAll(); - guienv->drawAll(); - driver->endScene(); - - int fps = driver->getFPS(); - if(fps != lastFps) - { - lastFps = fps; - core::stringw str = L"Managed Lights ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - device->setWindowCaption(str.c_str()); - } - } - - myLightManager->drop(); // Drop my implicit reference - device->drop(); - return 0; -} - -/* -**/ - diff --git a/examples/21.Quake3Explorer/Makefile b/examples/21.Quake3Explorer/Makefile deleted file mode 100644 index 9b33360a..00000000 --- a/examples/21.Quake3Explorer/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 21.Quake3Explorer -# List of source files, separated by spaces -Sources := main.cpp sound.cpp q3factory.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/21.Quake3Explorer/Quake3Explorer.cbp b/examples/21.Quake3Explorer/Quake3Explorer.cbp deleted file mode 100644 index d32ac6f7..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer.cbp +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - diff --git a/examples/21.Quake3Explorer/Quake3Explorer.vcproj b/examples/21.Quake3Explorer/Quake3Explorer.vcproj deleted file mode 100644 index b869cc4c..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer.vcproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/project.pbxproj b/examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/project.pbxproj deleted file mode 100644 index ea3f8bdb..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/project.pbxproj +++ /dev/null @@ -1,336 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E3A0F831C1108A100545D10 /* q3factory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E3A0F7F1C1108A100545D10 /* q3factory.cpp */; }; - 5E3A0F841C1108A100545D10 /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E3A0F811C1108A100545D10 /* sound.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 21.Quake3Explorer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 21.Quake3Explorer.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E3A0F7F1C1108A100545D10 /* q3factory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = q3factory.cpp; sourceTree = ""; }; - 5E3A0F801C1108A100545D10 /* q3factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = q3factory.h; sourceTree = ""; }; - 5E3A0F811C1108A100545D10 /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; - 5E3A0F821C1108A100545D10 /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E3A0F7F1C1108A100545D10 /* q3factory.cpp */, - 5E3A0F801C1108A100545D10 /* q3factory.h */, - 5E3A0F811C1108A100545D10 /* sound.cpp */, - 5E3A0F821C1108A100545D10 /* sound.h */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 21.Quake3Explorer.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 21.Quake3Explorer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "21.Quake3Explorer" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 21.Quake3Explorer; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 21.Quake3Explorer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Quake3Explorer" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 21.Quake3Explorer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E3A0F831C1108A100545D10 /* q3factory.cpp in Sources */, - 5E3A0F841C1108A100545D10 /* sound.cpp in Sources */, - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Quake3Explorer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "21.Quake3Explorer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/xcshareddata/xcschemes/21.Quake3Explorer.xcscheme b/examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/xcshareddata/xcschemes/21.Quake3Explorer.xcscheme deleted file mode 100644 index 4dfc785a..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer.xcodeproj/xcshareddata/xcschemes/21.Quake3Explorer.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/21.Quake3Explorer/Quake3Explorer_vc10.vcxproj b/examples/21.Quake3Explorer/Quake3Explorer_vc10.vcxproj deleted file mode 100644 index 1a50c74b..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer_vc10.vcxproj +++ /dev/null @@ -1,199 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 21.Quake3Explorer - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD} - 21.Quake3Explorer - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - FastCall - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/21.Quake3Explorer/Quake3Explorer_vc11.vcxproj b/examples/21.Quake3Explorer/Quake3Explorer_vc11.vcxproj deleted file mode 100644 index a2f2ff63..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer_vc11.vcxproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 21.Quake3Explorer - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD} - 21.Quake3Explorer - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - FastCall - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/21.Quake3Explorer/Quake3Explorer_vc12.vcxproj b/examples/21.Quake3Explorer/Quake3Explorer_vc12.vcxproj deleted file mode 100644 index f84bfc04..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer_vc12.vcxproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 21.Quake3Explorer - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD} - 21.Quake3Explorer - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - FastCall - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/21.Quake3Explorer/Quake3Explorer_vc14.vcxproj b/examples/21.Quake3Explorer/Quake3Explorer_vc14.vcxproj deleted file mode 100644 index eadcfea5..00000000 --- a/examples/21.Quake3Explorer/Quake3Explorer_vc14.vcxproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 21.Quake3Explorer - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD} - 21.Quake3Explorer - Win32Proj - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Quake3MapShader.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - FastCall - - - ..\..\bin\Win32-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - false - - - Level3 - - - FastCall - - - ..\..\bin\Win64-VisualStudio\21.Quake3Explorer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/21.Quake3Explorer/main.cpp b/examples/21.Quake3Explorer/main.cpp deleted file mode 100644 index 7b14c92f..00000000 --- a/examples/21.Quake3Explorer/main.cpp +++ /dev/null @@ -1,2189 +0,0 @@ -/** Example 021 Quake3 Explorer - -This tutorial shows how to load different Quake 3 maps. - -Features: - - Load BSP Archives at Runtime from the menu - - Load a Map from the menu. Showing with Screenshot - - Set the VideoDriver at runtime from menu - - Adjust GammaLevel at runtime - - Create SceneNodes for the Shaders - - Load EntityList and create Entity SceneNodes - - Create Players with Weapons and with Collision Response - - Play music - -You can download the Quake III Arena demo ( copyright id software ) -at the following location: -ftp://ftp.idsoftware.com/idstuff/quake3/win32/q3ademo.exe - -Copyright 2006-2011 Burningwater, Thomas Alten -*/ - -#include -#include "driverChoice.h" -#include "exampleHelper.h" -#include "q3factory.h" -#include "sound.h" - -/* - Game Data is used to hold Data which is needed to drive the game -*/ -struct GameData -{ - GameData ( const path &startupDir) : - retVal(0), StartupDir(startupDir), createExDevice(0), Device(0) - { - setDefault (); - } - - void setDefault (); - s32 save ( const path &filename ); - s32 load ( const path &filename ); - - s32 debugState; - s32 gravityState; - s32 flyTroughState; - s32 wireFrame; - s32 guiActive; - s32 guiInputActive; - f32 GammaValue; - s32 retVal; - s32 sound; - - path StartupDir; - stringw CurrentMapName; - array CurrentArchiveList; - - vector3df PlayerPosition; - vector3df PlayerRotation; - - tQ3EntityList Variable; - - Q3LevelLoadParameter loadParam; - SIrrlichtCreationParameters deviceParam; - funcptr_createDeviceEx createExDevice; - IrrlichtDevice *Device; -}; - -/* - set default settings -*/ -void GameData::setDefault () -{ - debugState = EDS_OFF; - gravityState = 1; - flyTroughState = 0; - wireFrame = 0; - guiActive = 1; - guiInputActive = 0; - GammaValue = 1.f; - - // default deviceParam; -#if defined ( _IRR_WINDOWS_ ) - deviceParam.DriverType = EDT_DIRECT3D9; -#else - deviceParam.DriverType = EDT_OGLES2; // TODO: have to figure out what to use when we merge ogl-es with trunk. -#endif - deviceParam.WindowSize.Width = 800; - deviceParam.WindowSize.Height = 600; - deviceParam.Fullscreen = false; - deviceParam.Bits = 24; - deviceParam.ZBufferBits = 16; - deviceParam.Vsync = false; - deviceParam.AntiAlias = false; - - // default Quake3 loadParam - loadParam.defaultLightMapMaterial = EMT_LIGHTMAP; - loadParam.defaultModulate = EMFN_MODULATE_1X; - loadParam.defaultFilter = EMF_ANISOTROPIC_FILTER; - loadParam.verbose = 2; - loadParam.mergeShaderBuffer = 1; // merge meshbuffers with same material - loadParam.cleanUnResolvedMeshes = 1; // should unresolved meshes be cleaned. otherwise blue texture - loadParam.loadAllShaders = 1; // load all scripts in the script directory - loadParam.loadSkyShader = 0; // load sky Shader - loadParam.alpharef = 1; - - sound = 0; - - CurrentMapName = ""; - CurrentArchiveList.clear (); - - const io::path mediaPath = getExampleMediaPath(); - - // Explorer Media directory - CurrentArchiveList.push_back ( StartupDir + mediaPath ); - - // Add the original quake3 files before you load your custom map - // Most mods are using the original shaders, models&items&weapons - CurrentArchiveList.push_back("/q/baseq3/"); - - CurrentArchiveList.push_back(StartupDir + mediaPath + "map-20kdm2.pk3"); -} - -/* - Load the current game State from a typical quake3 cfg file -*/ -s32 GameData::load ( const path &filename ) -{ - if (!Device) - return 0; - - // the quake3 mesh loader can also handle *.shader and *.cfg file - IQ3LevelMesh* mesh = (IQ3LevelMesh*) Device->getSceneManager()->getMesh ( filename ); - if (!mesh) - return 0; - - tQ3EntityList &entityList = mesh->getEntityList (); - - stringc s; - u32 pos; - - for ( u32 e = 0; e != entityList.size (); ++e ) - { - //dumpShader ( s, &entityList[e], false ); - //printf ( s.c_str () ); - - for ( u32 g = 0; g != entityList[e].getGroupSize (); ++g ) - { - const SVarGroup *group = entityList[e].getGroup ( g ); - - for ( u32 index = 0; index < group->Variable.size (); ++index ) - { - const SVariable &v = group->Variable[index]; - pos = 0; - if ( v.name == "playerposition" ) - { - PlayerPosition = getAsVector3df ( v.content, pos ); - } - else - if ( v.name == "playerrotation" ) - { - PlayerRotation = getAsVector3df ( v.content, pos ); - } - } - } - } - - return 1; -} - -/* - Store the current game State in a quake3 configuration file -*/ -s32 GameData::save ( const path &filename ) -{ - return 0; - if (!Device) - return 0; - - c8 buf[128]; - u32 i; - - // Store current Archive for restart - CurrentArchiveList.clear(); - IFileSystem *fs = Device->getFileSystem(); - for ( i = 0; i != fs->getFileArchiveCount(); ++i ) - { - CurrentArchiveList.push_back ( fs->getFileArchive(i)->getFileList()->getPath() ); - } - - // Store Player Position and Rotation - ICameraSceneNode * camera = Device->getSceneManager()->getActiveCamera (); - if ( camera ) - { - PlayerPosition = camera->getPosition (); - PlayerRotation = camera->getRotation (); - } - - IWriteFile *file = fs->createAndWriteFile ( filename ); - if (!file) - return 0; - - snprintf_irr ( buf, 128, "playerposition %.f %.f %.f\nplayerrotation %.f %.f %.f\n", - PlayerPosition.X, PlayerPosition.Z, PlayerPosition.Y, - PlayerRotation.X, PlayerRotation.Z, PlayerRotation.Y); - file->write ( buf, (s32) strlen ( buf ) ); - for ( i = 0; i != fs->getFileArchiveCount(); ++i ) - { - snprintf_irr ( buf, 128, "archive %s\n",stringc ( fs->getFileArchive(i)->getFileList()->getPath() ).c_str () ); - file->write ( buf, (s32) strlen ( buf ) ); - } - - file->drop (); - return 1; -} - -/* - Representing a player -*/ -struct Q3Player : public IAnimationEndCallBack -{ - Q3Player () - : Device(0), MapParent(0), Mesh(0), WeaponNode(0), StartPositionCurrent(0) - { - animation[0] = 0; - memset(Anim, 0, sizeof(TimeFire)*4); - } - - virtual void OnAnimationEnd(IAnimatedMeshSceneNode* node); - - void create ( IrrlichtDevice *device, - IQ3LevelMesh* mesh, - ISceneNode *mapNode, - IMetaTriangleSelector *meta - ); - void shutdown (); - void setAnim ( const c8 *name ); - void respawn (); - void setpos ( const vector3df &pos, const vector3df& rotation ); - - ISceneNodeAnimatorCollisionResponse * cam() { return camCollisionResponse ( Device ); } - - IrrlichtDevice *Device; - ISceneNode* MapParent; - IQ3LevelMesh* Mesh; - IAnimatedMeshSceneNode* WeaponNode; - s32 StartPositionCurrent; - TimeFire Anim[4]; - c8 animation[64]; - c8 buf[64]; -}; - - -/* End player -*/ -void Q3Player::shutdown () -{ - setAnim ( 0 ); - - dropElement (WeaponNode); - - if ( Device ) - { - ICameraSceneNode* camera = Device->getSceneManager()->getActiveCamera(); - dropElement ( camera ); - Device = 0; - } - - MapParent = 0; - Mesh = 0; -} - - -/* create a new player -*/ -void Q3Player::create ( IrrlichtDevice *device, IQ3LevelMesh* mesh, ISceneNode *mapNode, IMetaTriangleSelector *meta ) -{ - setTimeFire ( Anim + 0, 200, FIRED ); - setTimeFire ( Anim + 1, 5000 ); - - if (!device) - return; - // load FPS weapon to Camera - Device = device; - Mesh = mesh; - MapParent = mapNode; - - ISceneManager *smgr = device->getSceneManager (); - IVideoDriver * driver = device->getVideoDriver(); - - ICameraSceneNode* camera = 0; - - core::array keyMap; - keyMap.set_used(12); - keyMap[0].Action = EKA_MOVE_FORWARD; - keyMap[0].KeyCode = KEY_UP; - keyMap[1].Action = EKA_MOVE_FORWARD; - keyMap[1].KeyCode = KEY_KEY_W; - - keyMap[2].Action = EKA_MOVE_BACKWARD; - keyMap[2].KeyCode = KEY_DOWN; - keyMap[3].Action = EKA_MOVE_BACKWARD; - keyMap[3].KeyCode = KEY_KEY_S; - - keyMap[4].Action = EKA_STRAFE_LEFT; - keyMap[4].KeyCode = KEY_LEFT; - keyMap[5].Action = EKA_STRAFE_LEFT; - keyMap[5].KeyCode = KEY_KEY_A; - - keyMap[6].Action = EKA_STRAFE_RIGHT; - keyMap[6].KeyCode = KEY_RIGHT; - keyMap[7].Action = EKA_STRAFE_RIGHT; - keyMap[7].KeyCode = KEY_KEY_D; - - keyMap[8].Action = EKA_JUMP_UP; - keyMap[8].KeyCode = KEY_KEY_J; - - keyMap[9].Action = EKA_CROUCH; - keyMap[9].KeyCode = KEY_KEY_C; - - keyMap[10].Action = EKA_ROTATE_LEFT; - keyMap[10].KeyCode = KEY_KEY_Q; - - keyMap[11].Action = EKA_ROTATE_RIGHT; - keyMap[11].KeyCode = KEY_KEY_E; - - camera = smgr->addCameraSceneNodeFPS(0, 100.0f, 0.6f, -1, keyMap.pointer(), keyMap.size(), false, 600.f); - camera->setName ( "First Person Camera" ); - //camera->setFOV ( 100.f * core::DEGTORAD ); - camera->setFarValue( 20000.f ); - - IAnimatedMeshMD2* weaponMesh = (IAnimatedMeshMD2*) smgr->getMesh("gun.md2"); - if ( 0 == weaponMesh ) - return; - - if ( weaponMesh->getMeshType() == EAMT_MD2 ) - { - s32 count = weaponMesh->getAnimationCount(); - for ( s32 i = 0; i != count; ++i ) - { - snprintf_irr ( buf, 64, "Animation: %s", weaponMesh->getAnimationName(i) ); - device->getLogger()->log(buf, ELL_INFORMATION); - } - } - - WeaponNode = smgr->addAnimatedMeshSceneNode( - weaponMesh, - smgr->getActiveCamera(), - 10, - vector3df( 0, 0, 0), - vector3df(-90,-90,90) - ); - WeaponNode->setMaterialFlag(EMF_LIGHTING, false); - WeaponNode->setMaterialTexture(0, driver->getTexture( "gun.jpg")); - WeaponNode->setLoopMode ( false ); - WeaponNode->setName ( "tommi the gun man" ); - - //create a collision auto response animator - ISceneNodeAnimator* anim = - smgr->createCollisionResponseAnimator( meta, camera, - vector3df(30,45,30), - getGravity ( "earth" ), - vector3df(0,40,0), - 0.0005f - ); - - camera->addAnimator( anim ); - anim->drop(); - - if ( meta ) - { - meta->drop (); - } - - respawn (); - setAnim ( "idle" ); -} - - -/* - so we need a good starting Position in the level. - we can ask the Quake3 Loader for all entities with class_name "info_player_deathmatch" -*/ -void Q3Player::respawn () -{ - if (!Device) - return; - ICameraSceneNode* camera = Device->getSceneManager()->getActiveCamera(); - - Device->getLogger()->log( "respawn" ); - - if (StartPositionCurrent >= Q3StartPosition(Mesh, camera, - StartPositionCurrent, cam()->getEllipsoidTranslation())) - StartPositionCurrent = 0; - else - ++StartPositionCurrent; -} - -/* - set Player position from saved coordinates -*/ -void Q3Player::setpos ( const vector3df &pos, const vector3df &rotation ) -{ - if (!Device) - return; - Device->getLogger()->log( "setpos" ); - - ICameraSceneNode* camera = Device->getSceneManager()->getActiveCamera(); - if ( camera ) - { - camera->setPosition ( pos ); - camera->setRotation ( rotation ); - //! New. FPSCamera and animators catches reset on animate 0 - camera->OnAnimate ( 0 ); - } -} - -/* set the Animation of the player and weapon -*/ -void Q3Player::setAnim ( const c8 *name ) -{ - if ( name ) - { - snprintf_irr ( animation, 64, "%s", name ); - if ( WeaponNode ) - { - WeaponNode->setAnimationEndCallback ( this ); - WeaponNode->setMD2Animation ( animation ); - } - } - else - { - animation[0] = 0; - if ( WeaponNode ) - { - WeaponNode->setAnimationEndCallback ( 0 ); - } - } -} - - -// Callback -void Q3Player::OnAnimationEnd(IAnimatedMeshSceneNode* node) -{ - setAnim ( 0 ); -} - - - -/* GUI Elements -*/ -struct GUI -{ - GUI () - { - memset ( this, 0, sizeof ( *this ) ); - } - - void drop() - { - dropElement ( Window ); - dropElement ( Logo ); - } - - IGUIComboBox* VideoDriver; - IGUIComboBox* VideoMode; - IGUICheckBox* FullScreen; - IGUICheckBox* Bit32; - IGUIScrollBar* MultiSample; - IGUIButton* SetVideoMode; - - IGUIScrollBar* Tesselation; - IGUIScrollBar* Gamma; - IGUICheckBox* Collision; - IGUICheckBox* Visible_Map; - IGUICheckBox* Visible_Shader; - IGUICheckBox* Visible_Fog; - IGUICheckBox* Visible_Unresolved; - IGUICheckBox* Visible_Skydome; - IGUIButton* Respawn; - - IGUITable* ArchiveList; - IGUIButton* ArchiveAdd; - IGUIButton* ArchiveRemove; - IGUIFileOpenDialog* ArchiveFileOpen; - IGUIButton* ArchiveUp; - IGUIButton* ArchiveDown; - - IGUIListBox* MapList; - IGUITreeView* SceneTree; - IGUIStaticText* StatusLine; - IGUIImage* Logo; - IGUIWindow* Window; -}; - - -/* - CQuake3EventHandler controls the game -*/ -class CQuake3EventHandler : public IEventReceiver -{ -public: - - CQuake3EventHandler( GameData *gameData ); - virtual ~CQuake3EventHandler (); - - void Animate(); - void Render(); - - void AddArchive ( const path& archiveName ); - void LoadMap ( const stringw& mapName, s32 collision ); - void CreatePlayers(); - void AddSky( u32 dome, const c8 *texture ); - Q3Player *GetPlayer ( u32 index ) { return &Player[index]; } - - void CreateGUI(); - void SetGUIActive( s32 command); - - bool OnEvent(const SEvent& eve); - - -private: - - GameData *Game; - - IQ3LevelMesh* Mesh; - ISceneNode* MapParent; - ISceneNode* ShaderParent; - ISceneNode* ItemParent; - ISceneNode* UnresolvedParent; - ISceneNode* BulletParent; - ISceneNode* FogParent; - ISceneNode * SkyNode; - IMetaTriangleSelector *Meta; - - c8 buf[256]; - - Q3Player Player[2]; - - struct SParticleImpact - { - u32 when; - vector3df pos; - vector3df outVector; - }; - array Impacts; - void useItem( Q3Player * player); - void createParticleImpacts( u32 now ); - - void createTextures (); - void addSceneTreeItem( ISceneNode * parent, IGUITreeViewNode* nodeParent); - - GUI gui; - void dropMap (); -}; - -/* Constructor -*/ -CQuake3EventHandler::CQuake3EventHandler( GameData *game ) -: Game(game), Mesh(0), MapParent(0), ShaderParent(0), ItemParent(0), UnresolvedParent(0), - BulletParent(0), FogParent(0), SkyNode(0), Meta(0) -{ - buf[0]=0; - // Also use 16 Bit Textures for 16 Bit RenderDevice - if ( Game->deviceParam.Bits == 16 ) - { - game->Device->getVideoDriver()->setTextureCreationFlag(ETCF_ALWAYS_16_BIT, true); - } - - // Quake3 Shader controls Z-Writing - game->Device->getSceneManager()->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); - - // create internal textures - createTextures (); - - sound_init ( game->Device ); - - Game->Device->setEventReceiver ( this ); -} - - -// destructor -CQuake3EventHandler::~CQuake3EventHandler () -{ - Player[0].shutdown (); - sound_shutdown (); - - Game->save( "explorer.cfg" ); - - Game->Device->drop(); -} - - -// create runtime textures smog, fog -void CQuake3EventHandler::createTextures() -{ - IVideoDriver * driver = Game->Device->getVideoDriver(); - - dimension2du dim(64, 64); - - video::IImage* image; - u32 i; - u32 x; - u32 y; - u32 * data; - for ( i = 0; i != 8; ++i ) - { - image = driver->createImage ( video::ECF_A8R8G8B8, dim); - data = (u32*) image->getData (); - for ( y = 0; y != dim.Height; ++y ) - { - for ( x = 0; x != dim.Width; ++x ) - { - data [x] = 0xFFFFFFFF; - } - data = (u32*) ( (u8*) data + image->getPitch() ); - } - snprintf_irr ( buf, 64, "smoke_%02d", i ); - driver->addTexture( buf, image ); - image->drop (); - } - - // fog - for ( i = 0; i != 1; ++i ) - { - image = driver->createImage ( video::ECF_A8R8G8B8, dim); - data = (u32*) image->getData (); - for ( y = 0; y != dim.Height; ++y ) - { - for ( x = 0; x != dim.Width; ++x ) - { - data [x] = 0xFFFFFFFF; - } - data = (u32*) ( (u8*) data + image->getPitch() ); - } - snprintf_irr ( buf, 64, "fog_%02d", i ); - driver->addTexture( buf, image ); - image->drop (); - } -} - - -/* - create the GUI -*/ -void CQuake3EventHandler::CreateGUI() -{ - - IGUIEnvironment *env = Game->Device->getGUIEnvironment(); - IVideoDriver * driver = Game->Device->getVideoDriver(); - - gui.drop(); - - // set skin font - IGUIFont* font = env->getFont("fontlucida.png"); - if (font) - env->getSkin()->setFont(font); - env->getSkin()->setColor ( EGDC_BUTTON_TEXT, video::SColor(240,0xAA,0xAA,0xAA) ); - env->getSkin()->setColor ( EGDC_3D_HIGH_LIGHT, video::SColor(240,0x22,0x22,0x22) ); - env->getSkin()->setColor ( EGDC_3D_FACE, video::SColor(240,0x44,0x44,0x44) ); - env->getSkin()->setColor ( EGDC_EDITABLE, video::SColor(240,0x44,0x44,0x44) ); - env->getSkin()->setColor ( EGDC_FOCUSED_EDITABLE, video::SColor(240,0x54,0x54,0x54) ); - env->getSkin()->setColor ( EGDC_WINDOW, video::SColor(240,0x66,0x66,0x66) ); - - // minimal gui size 800x600 - dimension2d dim ( 800, 600 ); - dimension2d vdim ( Game->Device->getVideoDriver()->getScreenSize() ); - - if ( vdim.Height >= dim.Height && vdim.Width >= dim.Width ) - { - //dim = vdim; - } - else - { - } - - gui.Window = env->addWindow ( rect ( 0, 0, dim.Width, dim.Height ), false, L"Quake3 Explorer" ); - gui.Window->setToolTipText ( L"Quake3Explorer. Loads and show various BSP File Format and Shaders." ); - gui.Window->getCloseButton()->setToolTipText ( L"Quit Quake3 Explorer" ); - - // add a status line help text - gui.StatusLine = env->addStaticText( 0, rect( 5,dim.Height - 30,dim.Width - 5,dim.Height - 10), - false, false, gui.Window, -1, true - ); - - - env->addStaticText ( L"VideoDriver:", rect( dim.Width - 400, 24, dim.Width - 310, 40 ),false, false, gui.Window, -1, false ); - gui.VideoDriver = env->addComboBox(rect( dim.Width - 300, 24, dim.Width - 10, 40 ),gui.Window); - gui.VideoDriver->addItem(L"Direct3D 9.0c", EDT_DIRECT3D9 ); - gui.VideoDriver->addItem(L"OpenGL 1.5", EDT_OPENGL); - gui.VideoDriver->addItem(L"Software Renderer", EDT_OGLES1); - gui.VideoDriver->addItem(L"Burning's Video (TM) Thomas Alten", EDT_BURNINGSVIDEO); - gui.VideoDriver->setSelected ( gui.VideoDriver->getIndexForItemData ( Game->deviceParam.DriverType ) ); - gui.VideoDriver->setToolTipText ( L"Use a VideoDriver" ); - - env->addStaticText ( L"VideoMode:", rect( dim.Width - 400, 44, dim.Width - 310, 60 ),false, false, gui.Window, -1, false ); - gui.VideoMode = env->addComboBox(rect( dim.Width - 300, 44, dim.Width - 10, 60 ),gui.Window); - gui.VideoMode->setToolTipText ( L"Supported Screenmodes" ); - IVideoModeList *modeList = Game->Device->getVideoModeList(); - if ( modeList ) - { - s32 i; - for ( i = 0; i != modeList->getVideoModeCount (); ++i ) - { - u16 d = modeList->getVideoModeDepth ( i ); - if ( d < 16 ) - continue; - - u16 w = modeList->getVideoModeResolution ( i ).Width; - u16 h = modeList->getVideoModeResolution ( i ).Height; - u32 val = w << 16 | h; - - if ( gui.VideoMode->getIndexForItemData ( val ) >= 0 ) - continue; - - f32 aspect = (f32) w / (f32) h; - const c8 *a = ""; - if ( core::equals ( aspect, 1.3333333333f ) ) a = "4:3"; - else if ( core::equals ( aspect, 1.6666666f ) ) a = "15:9 widescreen"; - else if ( core::equals ( aspect, 1.7777777f ) ) a = "16:9 widescreen"; - else if ( core::equals ( aspect, 1.6f ) ) a = "16:10 widescreen"; - else if ( core::equals ( aspect, 2.133333f ) ) a = "20:9 widescreen"; - - snprintf_irr ( buf, sizeof ( buf ), "%d x %d, %s",w, h, a ); - gui.VideoMode->addItem ( stringw ( buf ).c_str(), val ); - } - } - gui.VideoMode->setSelected ( gui.VideoMode->getIndexForItemData ( - Game->deviceParam.WindowSize.Width << 16 | - Game->deviceParam.WindowSize.Height ) ); - - gui.FullScreen = env->addCheckBox ( Game->deviceParam.Fullscreen, rect( dim.Width - 400, 64, dim.Width - 300, 80 ), gui.Window,-1, L"Fullscreen" ); - gui.FullScreen->setToolTipText ( L"Set Fullscreen or Window Mode" ); - - gui.Bit32 = env->addCheckBox ( Game->deviceParam.Bits == 32, rect( dim.Width - 300, 64, dim.Width - 240, 80 ), gui.Window,-1, L"32Bit" ); - gui.Bit32->setToolTipText ( L"Use 16 or 32 Bit" ); - - env->addStaticText ( L"MultiSample:", rect( dim.Width - 235, 64, dim.Width - 150, 80 ),false, false, gui.Window, -1, false ); - gui.MultiSample = env->addScrollBar( true, rect( dim.Width - 150, 64, dim.Width - 70, 80 ), gui.Window,-1 ); - gui.MultiSample->setMin ( 0 ); - gui.MultiSample->setMax ( 8 ); - gui.MultiSample->setSmallStep ( 1 ); - gui.MultiSample->setLargeStep ( 1 ); - gui.MultiSample->setPos ( Game->deviceParam.AntiAlias ); - gui.MultiSample->setToolTipText ( L"Set the MultiSample (disable, 1x, 2x, 4x, 8x )" ); - - gui.SetVideoMode = env->addButton (rect( dim.Width - 60, 64, dim.Width - 10, 80 ), gui.Window, -1,L"set" ); - gui.SetVideoMode->setToolTipText ( L"Set Video Mode with current values" ); - - env->addStaticText ( L"Gamma:", rect( dim.Width - 400, 104, dim.Width - 310, 120 ),false, false, gui.Window, -1, false ); - gui.Gamma = env->addScrollBar( true, rect( dim.Width - 300, 104, dim.Width - 10, 120 ), gui.Window,-1 ); - gui.Gamma->setMin ( 50 ); - gui.Gamma->setMax ( 350 ); - gui.Gamma->setSmallStep ( 1 ); - gui.Gamma->setLargeStep ( 10 ); - gui.Gamma->setPos ( core::floor32 ( Game->GammaValue * 100.f ) ); - gui.Gamma->setToolTipText ( L"Adjust Gamma Ramp ( 0.5 - 3.5)" ); - Game->Device->setGammaRamp ( Game->GammaValue, Game->GammaValue, Game->GammaValue, 0.f, 0.f ); - - - env->addStaticText ( L"Tesselation:", rect( dim.Width - 400, 124, dim.Width - 310, 140 ),false, false, gui.Window, -1, false ); - gui.Tesselation = env->addScrollBar( true, rect( dim.Width - 300, 124, dim.Width - 10, 140 ), gui.Window,-1 ); - gui.Tesselation->setMin ( 2 ); - gui.Tesselation->setMax ( 12 ); - gui.Tesselation->setSmallStep ( 1 ); - gui.Tesselation->setLargeStep ( 1 ); - gui.Tesselation->setPos ( Game->loadParam.patchTesselation ); - gui.Tesselation->setToolTipText ( L"How smooth should curved surfaces be rendered" ); - - gui.Collision = env->addCheckBox ( true, rect( dim.Width - 400, 150, dim.Width - 300, 166 ), gui.Window,-1, L"Collision" ); - gui.Collision->setToolTipText ( L"Set collision on or off ( flythrough ). \nPress F7 on your Keyboard" ); - gui.Visible_Map = env->addCheckBox ( true, rect( dim.Width - 300, 150, dim.Width - 240, 166 ), gui.Window,-1, L"Map" ); - gui.Visible_Map->setToolTipText ( L"Show or not show the static part the Level. \nPress F3 on your Keyboard" ); - gui.Visible_Shader = env->addCheckBox ( true, rect( dim.Width - 240, 150, dim.Width - 170, 166 ), gui.Window,-1, L"Shader" ); - gui.Visible_Shader->setToolTipText ( L"Show or not show the Shader Nodes. \nPress F4 on your Keyboard" ); - gui.Visible_Fog = env->addCheckBox ( true, rect( dim.Width - 170, 150, dim.Width - 110, 166 ), gui.Window,-1, L"Fog" ); - gui.Visible_Fog->setToolTipText ( L"Show or not show the Fog Nodes. \nPress F5 on your Keyboard" ); - gui.Visible_Unresolved = env->addCheckBox ( true, rect( dim.Width - 110, 150, dim.Width - 10, 166 ), gui.Window,-1, L"Unresolved" ); - gui.Visible_Unresolved->setToolTipText ( L"Show the or not show the Nodes the Engine can't handle. \nPress F6 on your Keyboard" ); - gui.Visible_Skydome = env->addCheckBox ( true, rect( dim.Width - 110, 180, dim.Width - 10, 196 ), gui.Window,-1, L"Skydome" ); - gui.Visible_Skydome->setToolTipText ( L"Show the or not show the Skydome." ); - - //Respawn = env->addButton ( rect( dim.Width - 260, 90, dim.Width - 10, 106 ), 0,-1, L"Respawn" ); - - env->addStaticText ( L"Archives:", rect( 5, dim.Height - 530, dim.Width - 600,dim.Height - 514 ),false, false, gui.Window, -1, false ); - - gui.ArchiveAdd = env->addButton ( rect( dim.Width - 725, dim.Height - 530, dim.Width - 665, dim.Height - 514 ), gui.Window,-1, L"add" ); - gui.ArchiveAdd->setToolTipText ( L"Add an archive, usually packed zip-archives (*.pk3) to the Filesystem" ); - gui.ArchiveRemove = env->addButton ( rect( dim.Width - 660, dim.Height - 530, dim.Width - 600, dim.Height - 514 ), gui.Window,-1, L"del" ); - gui.ArchiveRemove->setToolTipText ( L"Remove the selected archive from the FileSystem." ); - gui.ArchiveUp = env->addButton ( rect( dim.Width - 575, dim.Height - 530, dim.Width - 515, dim.Height - 514 ), gui.Window,-1, L"up" ); - gui.ArchiveUp->setToolTipText ( L"Arrange Archive Look-up Hirachy. Move the selected Archive up" ); - gui.ArchiveDown = env->addButton ( rect( dim.Width - 510, dim.Height - 530, dim.Width - 440, dim.Height - 514 ), gui.Window,-1, L"down" ); - gui.ArchiveDown->setToolTipText ( L"Arrange Archive Look-up Hirachy. Move the selected Archive down" ); - - - gui.ArchiveList = env->addTable ( rect( 5,dim.Height - 510, dim.Width - 450,dim.Height - 410 ), gui.Window ); - gui.ArchiveList->addColumn ( L"Type", 0 ); - gui.ArchiveList->addColumn ( L"Real File Path", 1 ); - gui.ArchiveList->setColumnWidth ( 0, 60 ); - gui.ArchiveList->setColumnWidth ( 1, 284 ); - gui.ArchiveList->setToolTipText ( L"Show the attached Archives" ); - - - env->addStaticText ( L"Maps:", rect( 5, dim.Height - 400, dim.Width - 450,dim.Height - 380 ),false, false, gui.Window, -1, false ); - gui.MapList = env->addListBox ( rect( 5,dim.Height - 380, dim.Width - 450,dim.Height - 40 ), gui.Window, -1, true ); - gui.MapList->setToolTipText ( L"Show the current Maps in all Archives.\n Double-Click the Map to start the level" ); - - - // create a visible Scene Tree - env->addStaticText ( L"Scenegraph:", rect( dim.Width - 400, dim.Height - 400, dim.Width - 5,dim.Height - 380 ),false, false, gui.Window, -1, false ); - gui.SceneTree = env->addTreeView( rect( dim.Width - 400, dim.Height - 380, dim.Width - 5, dim.Height - 40 ), - gui.Window, -1, true, true, false ); - gui.SceneTree->setToolTipText ( L"Show the current Scenegraph" ); - gui.SceneTree->getRoot()->clearChildren(); - addSceneTreeItem ( Game->Device->getSceneManager()->getRootSceneNode(), gui.SceneTree->getRoot() ); - - - IGUIImageList* imageList = env->createImageList( driver->getTexture ( "iconlist.png" ), - dimension2di( 32, 32 ), true ); - - if ( imageList ) - { - gui.SceneTree->setImageList( imageList ); - imageList->drop (); - } - - - // load the engine logo - gui.Logo = env->addImage( driver->getTexture("irrlichtlogo3.png"), position2d(5, 16 ), true, 0 ); - gui.Logo->setToolTipText ( L"The great Irrlicht Engine" ); - - AddArchive ( "" ); -} - - -/* - Add an Archive to the FileSystems and updates the GUI -*/ -void CQuake3EventHandler::AddArchive ( const path& archiveName ) -{ - IFileSystem *fs = Game->Device->getFileSystem(); - u32 i; - - if ( archiveName.size () ) - { - bool exists = false; - for ( i = 0; i != fs->getFileArchiveCount(); ++i ) - { - if ( fs->getFileArchive(i)->getFileList()->getPath() == archiveName ) - { - exists = true; - break; - } - } - - if (!exists) - { - fs->addFileArchive(archiveName, true, false); - } - } - - // store the current archives in game data - // show the attached Archive in proper order - if ( gui.ArchiveList ) - { - gui.ArchiveList->clearRows(); - - for ( i = 0; i != fs->getFileArchiveCount(); ++i ) - { - IFileArchive * archive = fs->getFileArchive ( i ); - - u32 index = gui.ArchiveList->addRow(i); - - core::stringw typeName; - switch(archive->getType()) - { - case io::EFAT_ZIP: - typeName = "ZIP"; - break; - case io::EFAT_GZIP: - typeName = "gzip"; - break; - case io::EFAT_FOLDER: - typeName = "Mount"; - break; - case io::EFAT_PAK: - typeName = "PAK"; - break; - case io::EFAT_TAR: - typeName = "TAR"; - break; - default: - typeName = "archive"; - } - - gui.ArchiveList->setCellText ( index, 0, typeName ); - gui.ArchiveList->setCellText ( index, 1, archive->getFileList()->getPath() ); - } - } - - - // browse the archives for maps - if ( gui.MapList ) - { - gui.MapList->clear(); - - IGUISpriteBank *bank = Game->Device->getGUIEnvironment()->getSpriteBank("sprite_q3map"); - if ( 0 == bank ) - bank = Game->Device->getGUIEnvironment()->addEmptySpriteBank("sprite_q3map"); - - SGUISprite sprite; - SGUISpriteFrame frame; - core::rect r; - - bank->getSprites().clear(); - bank->getPositions().clear (); - gui.MapList->setSpriteBank ( bank ); - - u32 g = 0; - core::stringw s; - - // browse the attached file system - fs->setFileListSystem ( FILESYSTEM_VIRTUAL ); - fs->changeWorkingDirectoryTo ( "/maps/" ); - IFileList *fileList = fs->createFileList (); - fs->setFileListSystem ( FILESYSTEM_NATIVE ); - - for ( i=0; i< fileList->getFileCount(); ++i) - { - s = fileList->getFullFileName(i); - if ( s.find ( ".bsp" ) >= 0 ) - { - // get level screenshot. reformat texture to 128x128 - path c ( s ); - deletePathFromFilename ( c ); - cutFilenameExtension ( c, c ); - c = path ( "levelshots/" ) + c; - - dimension2du dim ( 128, 128 ); - IVideoDriver * driver = Game->Device->getVideoDriver(); - IImage* image = 0; - ITexture *tex = 0; - path filename; - - filename = c + ".jpg"; - if ( fs->existFile ( filename ) ) - image = driver->createImageFromFile( filename ); - if ( 0 == image ) - { - filename = c + ".tga"; - if ( fs->existFile ( filename ) ) - image = driver->createImageFromFile( filename ); - } - - if ( image ) - { - IImage* filter = driver->createImage ( video::ECF_R8G8B8, dim ); - image->copyToScalingBoxFilter ( filter, 0 ); - image->drop (); - image = filter; - } - - if ( image ) - { - tex = driver->addTexture ( filename, image ); - image->drop (); - } - - - bank->setTexture ( g, tex ); - - r.LowerRightCorner.X = dim.Width; - r.LowerRightCorner.Y = dim.Height; - gui.MapList->setItemHeight ( r.LowerRightCorner.Y + 4 ); - frame.rectNumber = bank->getPositions().size(); - frame.textureNumber = g; - - bank->getPositions().push_back(r); - - sprite.Frames.set_used ( 0 ); - sprite.Frames.push_back(frame); - sprite.frameTime = 0; - bank->getSprites().push_back(sprite); - - gui.MapList->addItem ( s.c_str (), g ); - g += 1; - } - } - fileList->drop (); - - gui.MapList->setSelected ( -1 ); - IGUIScrollBar * bar = (IGUIScrollBar*)gui.MapList->getElementFromId( 0 ); - if ( bar ) - bar->setPos ( 0 ); - - } - -} - -/* - clears the Map in Memory -*/ -void CQuake3EventHandler::dropMap () -{ - IVideoDriver * driver = Game->Device->getVideoDriver(); - - driver->removeAllHardwareBuffers (); - driver->removeAllTextures (); - - Player[0].shutdown (); - - - dropElement ( ItemParent ); - dropElement ( ShaderParent ); - dropElement ( UnresolvedParent ); - dropElement ( FogParent ); - dropElement ( BulletParent ); - - - Impacts.clear(); - - if ( Meta ) - { - Meta = 0; - } - - dropElement ( MapParent ); - dropElement ( SkyNode ); - - // clean out meshes, because textures are invalid - // TODO: better texture handling;-) - IMeshCache *cache = Game->Device->getSceneManager ()->getMeshCache(); - cache->clear (); - Mesh = 0; -} - -/* Load new map -*/ -void CQuake3EventHandler::LoadMap ( const stringw &mapName, s32 collision ) -{ - if ( 0 == mapName.size() ) - return; - - dropMap (); - - IFileSystem *fs = Game->Device->getFileSystem(); - ISceneManager *smgr = Game->Device->getSceneManager (); - - IReadFile* file = fs->createMemoryReadFile(&Game->loadParam, - sizeof(Game->loadParam), L"levelparameter.cfg", false); - - // load cfg file - smgr->getMesh( file ); - file->drop (); - - // load the actual map - Mesh = (IQ3LevelMesh*) smgr->getMesh(mapName); - if ( 0 == Mesh ) - return; - - /* - add the geometry mesh to the Scene ( polygon & patches ) - The Geometry mesh is optimised for faster drawing - */ - - IMesh *geometry = Mesh->getMesh(E_Q3_MESH_GEOMETRY); - if ( 0 == geometry || geometry->getMeshBufferCount() == 0) - return; - - Game->CurrentMapName = mapName; - - //create a collision list - Meta = 0; - - ITriangleSelector * selector = 0; - if (collision) - Meta = smgr->createMetaTriangleSelector(); - - //IMeshBuffer *b0 = geometry->getMeshBuffer(0); - //s32 minimalNodes = b0 ? core::s32_max ( 2048, b0->getVertexCount() / 32 ) : 2048; - s32 minimalNodes = 2048; - - MapParent = smgr->addOctreeSceneNode(geometry, 0, -1, minimalNodes); - MapParent->setName ( mapName ); - if ( Meta ) - { - selector = smgr->createOctreeTriangleSelector( geometry,MapParent, minimalNodes); - //selector = smgr->createTriangleSelector ( geometry, MapParent ); - Meta->addTriangleSelector( selector); - selector->drop (); - } - - // logical parent for the items - ItemParent = smgr->addEmptySceneNode(); - if ( ItemParent ) - ItemParent->setName ( "Item Container" ); - - ShaderParent = smgr->addEmptySceneNode(); - if ( ShaderParent ) - ShaderParent->setName ( "Shader Container" ); - - UnresolvedParent = smgr->addEmptySceneNode(); - if ( UnresolvedParent ) - UnresolvedParent->setName ( "Unresolved Container" ); - - FogParent = smgr->addEmptySceneNode(); - if ( FogParent ) - FogParent->setName ( "Fog Container" ); - - // logical parent for the bullets - BulletParent = smgr->addEmptySceneNode(); - if ( BulletParent ) - BulletParent->setName ( "Bullet Container" ); - - /* - now construct SceneNodes for each Shader - The Objects are stored in the quake mesh E_Q3_MESH_ITEMS - and the Shader ID is stored in the MaterialParameters - mostly dark looking skulls and moving lava.. or green flashing tubes? - */ - Q3ShaderFactory ( Game->loadParam, Game->Device, Mesh, E_Q3_MESH_ITEMS,ShaderParent, Meta, false ); - Q3ShaderFactory ( Game->loadParam, Game->Device, Mesh, E_Q3_MESH_FOG,FogParent, 0, false ); - Q3ShaderFactory ( Game->loadParam, Game->Device, Mesh, E_Q3_MESH_UNRESOLVED,UnresolvedParent, Meta, true ); - - /* - Now construct Models from Entity List - */ - Q3ModelFactory ( Game->loadParam, Game->Device, Mesh, ItemParent, false ); -} - -/* - Adds a SceneNode with an icon to the Scene Tree -*/ -void CQuake3EventHandler::addSceneTreeItem( ISceneNode * parent, IGUITreeViewNode* nodeParent) -{ - IGUITreeViewNode* node; - wchar_t msg[128]; - - s32 imageIndex; - list::ConstIterator it = parent->getChildren().begin(); - for (; it != parent->getChildren().end(); ++it) - { - switch ( (*it)->getType () ) - { - case ESNT_Q3SHADER_SCENE_NODE: imageIndex = 0; break; - case ESNT_CAMERA: imageIndex = 1; break; - case ESNT_EMPTY: imageIndex = 2; break; - case ESNT_MESH: imageIndex = 3; break; - case ESNT_OCTREE: imageIndex = 3; break; - case ESNT_ANIMATED_MESH: imageIndex = 4; break; - case ESNT_SKY_BOX: imageIndex = 5; break; - case ESNT_BILLBOARD: imageIndex = 6; break; - case ESNT_PARTICLE_SYSTEM: imageIndex = 7; break; - case ESNT_TEXT: imageIndex = 8; break; - default:imageIndex = -1; break; - } - - if ( imageIndex < 0 ) - { - swprintf_irr ( msg, 128, L"%hs,%hs", - Game->Device->getSceneManager ()->getSceneNodeTypeName ( (*it)->getType () ), - (*it)->getName() - ); - } - else - { - swprintf_irr ( msg, 128, L"%hs",(*it)->getName() ); - } - - node = nodeParent->addChildBack( msg, 0, imageIndex ); - - // Add all Animators - list::ConstIterator ait = (*it)->getAnimators().begin(); - for (; ait != (*it)->getAnimators().end(); ++ait) - { - imageIndex = -1; - swprintf_irr ( msg, 128, L"%hs", - Game->Device->getSceneManager ()->getAnimatorTypeName ( (*ait)->getType () ) - ); - - switch ( (*ait)->getType () ) - { - case ESNAT_FLY_CIRCLE: - case ESNAT_FLY_STRAIGHT: - case ESNAT_FOLLOW_SPLINE: - case ESNAT_ROTATION: - case ESNAT_TEXTURE: - case ESNAT_DELETION: - case ESNAT_COLLISION_RESPONSE: - case ESNAT_CAMERA_FPS: - case ESNAT_CAMERA_MAYA: - default: - break; - } - node->addChildBack( msg, 0, imageIndex ); - } - - addSceneTreeItem ( *it, node ); - } -} - - -// Adds life! -void CQuake3EventHandler::CreatePlayers() -{ - Player[0].create ( Game->Device, Mesh, MapParent, Meta ); -} - - -// Adds a skydome to the scene -void CQuake3EventHandler::AddSky( u32 dome, const c8 *texture) -{ - ISceneManager *smgr = Game->Device->getSceneManager (); - IVideoDriver * driver = Game->Device->getVideoDriver(); - - bool oldMipMapState = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - - if ( 0 == dome ) - { - // irrlicht order - //static const c8*p[] = { "ft", "lf", "bk", "rt", "up", "dn" }; - // quake3 order - static const c8*p[] = { "ft", "rt", "bk", "lf", "up", "dn" }; - - u32 i = 0; - snprintf_irr ( buf, 64, "%s_%s.jpg", texture, p[i] ); - SkyNode = smgr->addSkyBoxSceneNode( driver->getTexture ( buf ), 0, 0, 0, 0, 0 ); - - if (SkyNode) - { - for ( i = 0; i < 6; ++i ) - { - snprintf_irr ( buf, 64, "%s_%s.jpg", texture, p[i] ); - SkyNode->getMaterial(i).setTexture ( 0, driver->getTexture ( buf ) ); - } - } - } - else - if ( 1 == dome ) - { - snprintf_irr ( buf, 64, "%s.jpg", texture ); - SkyNode = smgr->addSkyDomeSceneNode( - driver->getTexture( buf ), 32,32, - 1.f, 1.f, 1000.f, 0, 11); - } - else - if ( 2 == dome ) - { - snprintf_irr ( buf, 64, "%s.jpg", texture ); - SkyNode = smgr->addSkyDomeSceneNode( - driver->getTexture( buf ), 16,8, - 0.95f, 2.f, 1000.f, 0, 11); - } - - if (SkyNode) - SkyNode->setName("Skydome"); - //SkyNode->getMaterial(0).ZBuffer = video::EMDF_DEPTH_LESS_EQUAL; - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, oldMipMapState); -} - - -// enable GUI elements -void CQuake3EventHandler::SetGUIActive( s32 command) -{ - bool inputState = false; - - ICameraSceneNode * camera = Game->Device->getSceneManager()->getActiveCamera (); - - switch ( command ) - { - case 0: Game->guiActive = 0; inputState = !Game->guiActive; break; - case 1: Game->guiActive = 1; inputState = !Game->guiActive;;break; - case 2: Game->guiActive ^= 1; inputState = !Game->guiActive;break; - case 3: - if ( camera ) - inputState = !camera->isInputReceiverEnabled(); - break; - } - - if ( camera ) - { - camera->setInputReceiverEnabled ( inputState ); - Game->Device->getCursorControl()->setVisible( !inputState ); - } - - if ( gui.Window ) - { - gui.Window->setVisible ( Game->guiActive != 0 ); - } - - if ( Game->guiActive && - gui.SceneTree && Game->Device->getGUIEnvironment()->getFocus() != gui.SceneTree - ) - { - gui.SceneTree->getRoot()->clearChildren(); - addSceneTreeItem ( Game->Device->getSceneManager()->getRootSceneNode(), gui.SceneTree->getRoot() ); - } - - Game->Device->getGUIEnvironment()->setFocus ( Game->guiActive ? gui.Window: 0 ); -} - - -/* - Handle game input -*/ -bool CQuake3EventHandler::OnEvent(const SEvent& eve) -{ - if ( eve.EventType == EET_LOG_TEXT_EVENT ) - { - return false; - } - - if ( Game->guiActive && eve.EventType == EET_GUI_EVENT ) - { - if ( eve.GUIEvent.Caller == gui.MapList && eve.GUIEvent.EventType == gui::EGET_LISTBOX_SELECTED_AGAIN ) - { - s32 selected = gui.MapList->getSelected(); - if ( selected >= 0 ) - { - stringw loadMap = gui.MapList->getListItem ( selected ); - if ( 0 == MapParent || loadMap != Game->CurrentMapName ) - { - printf ( "Loading map %ls\n", loadMap.c_str() ); - LoadMap ( loadMap , 1 ); - if ( 0 == Game->loadParam.loadSkyShader ) - { - AddSky ( 1, "skydome2" ); - } - CreatePlayers (); - CreateGUI (); - SetGUIActive ( 0 ); - return true; - } - } - } - else - if ( eve.GUIEvent.Caller == gui.ArchiveRemove && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - Game->Device->getFileSystem()->removeFileArchive( gui.ArchiveList->getSelected() ); - Game->CurrentMapName = ""; - AddArchive ( "" ); - } - else - if ( eve.GUIEvent.Caller == gui.ArchiveAdd && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - if ( 0 == gui.ArchiveFileOpen ) - { - Game->Device->getFileSystem()->setFileListSystem ( FILESYSTEM_NATIVE ); - gui.ArchiveFileOpen = Game->Device->getGUIEnvironment()->addFileOpenDialog ( L"Add Game Archive" , false,gui.Window ); - } - } - else - if ( eve.GUIEvent.Caller == gui.ArchiveFileOpen && eve.GUIEvent.EventType == gui::EGET_FILE_SELECTED ) - { - AddArchive ( gui.ArchiveFileOpen->getFileNameP() ); - gui.ArchiveFileOpen = 0; - } - else - if ( eve.GUIEvent.Caller == gui.ArchiveFileOpen && eve.GUIEvent.EventType == gui::EGET_DIRECTORY_SELECTED ) - { - AddArchive ( gui.ArchiveFileOpen->getDirectoryName() ); - } - else - if ( eve.GUIEvent.Caller == gui.ArchiveFileOpen && eve.GUIEvent.EventType == gui::EGET_FILE_CHOOSE_DIALOG_CANCELLED ) - { - gui.ArchiveFileOpen = 0; - } - else - if ( ( eve.GUIEvent.Caller == gui.ArchiveUp || eve.GUIEvent.Caller == gui.ArchiveDown ) && - eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - s32 rel = eve.GUIEvent.Caller == gui.ArchiveUp ? -1 : 1; - if ( Game->Device->getFileSystem()->moveFileArchive ( gui.ArchiveList->getSelected (), rel ) ) - { - s32 newIndex = core::s32_clamp ( gui.ArchiveList->getSelected() + rel, 0, gui.ArchiveList->getRowCount() - 1 ); - AddArchive ( "" ); - gui.ArchiveList->setSelected ( newIndex ); - Game->CurrentMapName = ""; - } - } - else - if ( eve.GUIEvent.Caller == gui.VideoDriver && eve.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED ) - { - Game->deviceParam.DriverType = (E_DRIVER_TYPE) gui.VideoDriver->getItemData ( gui.VideoDriver->getSelected() ); - } - else - if ( eve.GUIEvent.Caller == gui.VideoMode && eve.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED ) - { - u32 val = gui.VideoMode->getItemData ( gui.VideoMode->getSelected() ); - Game->deviceParam.WindowSize.Width = val >> 16; - Game->deviceParam.WindowSize.Height = val & 0xFFFF; - } - else - if ( eve.GUIEvent.Caller == gui.FullScreen && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - { - Game->deviceParam.Fullscreen = gui.FullScreen->isChecked(); - } - else - if ( eve.GUIEvent.Caller == gui.Bit32 && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - { - Game->deviceParam.Bits = gui.Bit32->isChecked() ? 32 : 16; - } - else - if ( eve.GUIEvent.Caller == gui.MultiSample && eve.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED ) - { - Game->deviceParam.AntiAlias = gui.MultiSample->getPos(); - } - else - if ( eve.GUIEvent.Caller == gui.Tesselation && eve.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED ) - { - Game->loadParam.patchTesselation = gui.Tesselation->getPos (); - } - else - if ( eve.GUIEvent.Caller == gui.Gamma && eve.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED ) - { - Game->GammaValue = gui.Gamma->getPos () * 0.01f; - Game->Device->setGammaRamp ( Game->GammaValue, Game->GammaValue, Game->GammaValue, 0.f, 0.f ); - } - else - if ( eve.GUIEvent.Caller == gui.SetVideoMode && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - Game->retVal = 2; - Game->Device->closeDevice(); - } - else - if ( eve.GUIEvent.Caller == gui.Window && eve.GUIEvent.EventType == gui::EGET_ELEMENT_CLOSED ) - { - Game->Device->closeDevice(); - } - else - if ( eve.GUIEvent.Caller == gui.Collision && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - { - // set fly through active - Game->flyTroughState ^= 1; - Player[0].cam()->setAnimateTarget ( Game->flyTroughState == 0 ); - - printf ( "collision %d\n", Game->flyTroughState == 0 ); - } - else - if ( eve.GUIEvent.Caller == gui.Visible_Map && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - { - bool v = gui.Visible_Map->isChecked(); - - if ( MapParent ) - { - printf ( "static node set visible %d\n",v ); - MapParent->setVisible ( v ); - } - } - else - if ( eve.GUIEvent.Caller == gui.Visible_Shader && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - { - bool v = gui.Visible_Shader->isChecked(); - - if ( ShaderParent ) - { - printf ( "shader node set visible %d\n",v ); - ShaderParent->setVisible ( v ); - } - } - else - if ( eve.GUIEvent.Caller == gui.Visible_Skydome && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - { - if ( SkyNode ) - { - bool v = !SkyNode->isVisible(); - printf ( "skynode set visible %d\n",v ); - SkyNode->setVisible ( v ); - } - } - else - if ( eve.GUIEvent.Caller == gui.Respawn && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - Player[0].respawn (); - } - - return false; - } - - // fire - if ((eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.Key == KEY_SPACE && - eve.KeyInput.PressedDown == false) || - (eve.EventType == EET_MOUSE_INPUT_EVENT && eve.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) - ) - { - ICameraSceneNode * camera = Game->Device->getSceneManager()->getActiveCamera (); - if ( camera && camera->isInputReceiverEnabled () ) - { - useItem( Player + 0 ); - } - } - - // gui active - if ((eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.Key == KEY_F1 && - eve.KeyInput.PressedDown == false) || - (eve.EventType == EET_MOUSE_INPUT_EVENT && eve.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) - ) - { - SetGUIActive ( 2 ); - } - - // check if user presses the key - if ( eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.PressedDown == false) - { - // Escape toggles camera Input - if ( eve.KeyInput.Key == irr::KEY_ESCAPE ) - { - SetGUIActive ( 3 ); - } - else - if (eve.KeyInput.Key == KEY_F11) - { - // screenshot are taken without gamma! - IImage* image = Game->Device->getVideoDriver()->createScreenShot(); - if (image) - { - core::vector3df pos; - core::vector3df rot; - ICameraSceneNode * cam = Game->Device->getSceneManager()->getActiveCamera (); - if ( cam ) - { - pos = cam->getPosition (); - rot = cam->getRotation (); - } - - snprintf_irr(buf, 256, "%s_%ls_%.0f_%.0f_%.0f_%.0f_%.0f_%.0f.jpg", - DRIVER_TYPE_NAMES_SHORT[Game->Device->getVideoDriver()->getDriverType()], - Game->CurrentMapName.c_str(), - pos.X, pos.Y, pos.Z, - rot.X, rot.Y, rot.Z - ); - path filename ( buf ); - filename.replace ( '/', '_' ); - printf ( "screenshot : %s\n", filename.c_str() ); - Game->Device->getVideoDriver()->writeImageToFile(image, filename, 100 ); - image->drop(); - } - } - else - if (eve.KeyInput.Key == KEY_F9) - { - s32 value = EDS_OFF; - - Game->debugState = ( Game->debugState + 1 ) & 3; - - switch ( Game->debugState ) - { - case 1: value = EDS_NORMALS | EDS_MESH_WIRE_OVERLAY | EDS_BBOX_ALL; break; - case 2: value = EDS_NORMALS | EDS_MESH_WIRE_OVERLAY | EDS_SKELETON; break; - } -/* - // set debug map data on/off - debugState = debugState == EDS_OFF ? - EDS_NORMALS | EDS_MESH_WIRE_OVERLAY | EDS_BBOX_ALL: - EDS_OFF; -*/ - if ( ItemParent ) - { - list::ConstIterator it = ItemParent->getChildren().begin(); - for (; it != ItemParent->getChildren().end(); ++it) - { - (*it)->setDebugDataVisible ( value ); - } - } - - if ( ShaderParent ) - { - list::ConstIterator it = ShaderParent->getChildren().begin(); - for (; it != ShaderParent->getChildren().end(); ++it) - { - (*it)->setDebugDataVisible ( value ); - } - } - - if ( UnresolvedParent ) - { - list::ConstIterator it = UnresolvedParent->getChildren().begin(); - for (; it != UnresolvedParent->getChildren().end(); ++it) - { - (*it)->setDebugDataVisible ( value ); - } - } - - if ( FogParent ) - { - list::ConstIterator it = FogParent->getChildren().begin(); - for (; it != FogParent->getChildren().end(); ++it) - { - (*it)->setDebugDataVisible ( value ); - } - } - - if ( SkyNode ) - { - SkyNode->setDebugDataVisible ( value ); - } - - } - else - if (eve.KeyInput.Key == KEY_F8) - { - // set gravity on/off - Game->gravityState ^= 1; - Player[0].cam()->setGravity ( getGravity ( Game->gravityState ? "earth" : "none" ) ); - printf ( "gravity %s\n", Game->gravityState ? "earth" : "none" ); - } - else - if (eve.KeyInput.Key == KEY_F7) - { - // set fly through active - Game->flyTroughState ^= 1; - Player[0].cam()->setAnimateTarget ( Game->flyTroughState == 0 ); - if ( gui.Collision ) - gui.Collision->setChecked ( Game->flyTroughState == 0 ); - - printf ( "collision %d\n", Game->flyTroughState == 0 ); - } - else - if (eve.KeyInput.Key == KEY_F2) - { - Player[0].respawn (); - } - else - if (eve.KeyInput.Key == KEY_F3) - { - if ( MapParent ) - { - bool v = !MapParent->isVisible (); - printf ( "static node set visible %d\n",v ); - MapParent->setVisible ( v ); - if ( gui.Visible_Map ) - gui.Visible_Map->setChecked ( v ); - } - } - else - if (eve.KeyInput.Key == KEY_F4) - { - if ( ShaderParent ) - { - bool v = !ShaderParent->isVisible (); - printf ( "shader node set visible %d\n",v ); - ShaderParent->setVisible ( v ); - if ( gui.Visible_Shader ) - gui.Visible_Shader->setChecked ( v ); - } - } - else - if (eve.KeyInput.Key == KEY_F5) - { - if ( FogParent ) - { - bool v = !FogParent->isVisible (); - printf ( "fog node set visible %d\n",v ); - FogParent->setVisible ( v ); - if ( gui.Visible_Fog ) - gui.Visible_Fog->setChecked ( v ); - } - - } - else - if (eve.KeyInput.Key == KEY_F6) - { - if ( UnresolvedParent ) - { - bool v = !UnresolvedParent->isVisible (); - printf ( "unresolved node set visible %d\n",v ); - UnresolvedParent->setVisible ( v ); - if ( gui.Visible_Unresolved ) - gui.Visible_Unresolved->setChecked ( v ); - } - } - } - - // check if user presses the key C ( for crouch) - if ( eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.Key == KEY_KEY_C ) - { - // crouch - ISceneNodeAnimatorCollisionResponse *anim = Player[0].cam (); - if ( anim && 0 == Game->flyTroughState ) - { - if ( false == eve.KeyInput.PressedDown ) - { - // stand up - anim->setEllipsoidRadius ( vector3df(30,45,30) ); - anim->setEllipsoidTranslation ( vector3df(0,40,0)); - - } - else - { - // on your knees - anim->setEllipsoidRadius ( vector3df(30,20,30) ); - anim->setEllipsoidTranslation ( vector3df(0,20,0)); - } - return true; - } - } - return false; -} - - - -/* - useItem -*/ -void CQuake3EventHandler::useItem( Q3Player * player) -{ - ISceneManager* smgr = Game->Device->getSceneManager(); - ICameraSceneNode* camera = smgr->getActiveCamera(); - - if (!camera) - return; - - SParticleImpact imp; - imp.when = 0; - - // get line of camera - - vector3df start = camera->getPosition(); - - if ( player->WeaponNode ) - { - start.X += 0.f; - start.Y += 0.f; - start.Z += 0.f; - } - - vector3df end = (camera->getTarget() - start); - end.normalize(); - start += end*20.0f; - - end = start + (end * camera->getFarValue()); - - triangle3df triangle; - line3d line(start, end); - - // get intersection point with map - scene::ISceneNode* hitNode; - if (smgr->getSceneCollisionManager()->getCollisionPoint( - line, Meta, end, triangle,hitNode)) - { - // collides with wall - vector3df out = triangle.getNormal(); - out.setLength(0.03f); - - imp.when = 1; - imp.outVector = out; - imp.pos = end; - - player->setAnim ( "pow" ); - player->Anim[1].next += player->Anim[1].delta; - } - else - { - // doesnt collide with wall - vector3df start = camera->getPosition(); - if ( player->WeaponNode ) - { - //start.X += 10.f; - //start.Y += -5.f; - //start.Z += 1.f; - } - - vector3df end = (camera->getTarget() - start); - end.normalize(); - start += end*20.0f; - end = start + (end * camera->getFarValue()); - } - - // create fire ball - ISceneNode* node = 0; - node = smgr->addBillboardSceneNode( BulletParent,dimension2d(10,10), start); - - node->setMaterialFlag(EMF_LIGHTING, false); - node->setMaterialTexture(0, Game->Device->getVideoDriver()->getTexture("fireball.bmp")); - node->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - node->setMaterialType(EMT_TRANSPARENT_ADD_COLOR); - - f32 length = (f32)(end - start).getLength(); - const f32 speed = 5.8f; - u32 time = (u32)(length / speed); - - ISceneNodeAnimator* anim = 0; - - // set flight line - - anim = smgr->createFlyStraightAnimator(start, end, time); - node->addAnimator(anim); - anim->drop(); - - snprintf_irr ( buf, 64, "bullet: %s on %.1f,%1.f,%1.f", - imp.when ? "hit" : "nohit", end.X, end.Y, end.Z ); - node->setName ( buf ); - - - anim = smgr->createDeleteAnimator(time); - node->addAnimator(anim); - anim->drop(); - - if (imp.when) - { - // create impact note - imp.when = Game->Device->getTimer()->getTime() + - (time + (s32) ( ( 1.f + Noiser::get() ) * 250.f )); - Impacts.push_back(imp); - } - - // play sound -} - -// rendered when bullets hit something -void CQuake3EventHandler::createParticleImpacts( u32 now ) -{ - ISceneManager* sm = Game->Device->getSceneManager(); - - struct smokeLayer - { - const c8 * texture; - f32 scale; - f32 minparticleSize; - f32 maxparticleSize; - f32 boxSize; - u32 minParticle; - u32 maxParticle; - u32 fadeout; - u32 lifetime; - }; - - smokeLayer smoke[] = - { - { "smoke2.jpg", 0.4f, 1.5f, 18.f, 20.f, 20, 50, 2000, 10000 }, - { "smoke3.jpg", 0.2f, 1.2f, 15.f, 20.f, 10, 30, 1000, 12000 } - }; - - - u32 i; - u32 g; - s32 factor = 1; - for ( g = 0; g != 2; ++g ) - { - smoke[g].minParticle *= factor; - smoke[g].maxParticle *= factor; - smoke[g].lifetime *= factor; - smoke[g].boxSize *= Noiser::get() * 0.5f; - } - - for ( i=0; i < Impacts.size(); ++i) - { - if (now < Impacts[i].when) - continue; - - // create smoke particle system - IParticleSystemSceneNode* pas = 0; - - for ( g = 0; g != 2; ++g ) - { - pas = sm->addParticleSystemSceneNode(false, BulletParent, -1, Impacts[i].pos); - - snprintf_irr ( buf, 64, "bullet impact smoke at %.1f,%.1f,%1.f", - Impacts[i].pos.X,Impacts[i].pos.Y,Impacts[i].pos.Z); - pas->setName ( buf ); - - // create a flat smoke - vector3df direction = Impacts[i].outVector; - direction *= smoke[g].scale; - IParticleEmitter* em = pas->createBoxEmitter( - aabbox3d(-4.f,0.f,-4.f,20.f,smoke[g].minparticleSize,20.f), - direction,smoke[g].minParticle, smoke[g].maxParticle, - video::SColor(0,0,0,0),video::SColor(0,128,128,128), - 250,4000, 60); - - em->setMinStartSize (dimension2d( smoke[g].minparticleSize, smoke[g].minparticleSize)); - em->setMaxStartSize (dimension2d( smoke[g].maxparticleSize, smoke[g].maxparticleSize)); - - pas->setEmitter(em); - em->drop(); - - // particles get invisible - IParticleAffector* paf = pas->createFadeOutParticleAffector( - video::SColor ( 0, 0, 0, 0 ), smoke[g].fadeout); - pas->addAffector(paf); - paf->drop(); - - // particle system life time - ISceneNodeAnimator* anim = sm->createDeleteAnimator( smoke[g].lifetime); - pas->addAnimator(anim); - anim->drop(); - - pas->setMaterialFlag(video::EMF_LIGHTING, false); - pas->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - pas->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); - pas->setMaterialTexture(0, Game->Device->getVideoDriver()->getTexture( smoke[g].texture )); - } - - - // play impact sound - #ifdef USE_IRRKLANG -/* - if (irrKlang) - { - audio::ISound* sound = - irrKlang->play3D(impactSound, Impacts[i].pos, false, false, true); - - if (sound) - { - // adjust max value a bit to make to sound of an impact louder - sound->setMinDistance(400); - sound->drop(); - } - } -*/ - #endif - - - // delete entry - Impacts.erase(i); - i--; - } -} - -/* - render -*/ -void CQuake3EventHandler::Render() -{ - IVideoDriver * driver = Game->Device->getVideoDriver(); - if ( 0 == driver ) - return; - - // TODO: This does not work, yet. - const bool anaglyph=false; - if (anaglyph) - { - scene::ICameraSceneNode* cameraOld = Game->Device->getSceneManager()->getActiveCamera(); - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,0,0,0)); - driver->getOverrideMaterial().Material.ColorMask = ECP_NONE; - driver->getOverrideMaterial().EnableFlags = EMF_COLOR_MASK; - driver->getOverrideMaterial().EnablePasses = ESNRP_SKY_BOX + - ESNRP_SOLID + - ESNRP_TRANSPARENT + - ESNRP_TRANSPARENT_EFFECT + - ESNRP_SHADOW; - Game->Device->getSceneManager()->drawAll(); - driver->clearBuffers(video::ECBF_DEPTH, video::SColor(255,0,0,0)); - - const vector3df oldPosition = cameraOld->getPosition(); - const vector3df oldTarget = cameraOld->getTarget(); - const matrix4 startMatrix = cameraOld->getAbsoluteTransformation(); - const vector3df focusPoint = (oldTarget - - cameraOld->getAbsolutePosition()).setLength(10000) + - cameraOld->getAbsolutePosition() ; - - scene::ICameraSceneNode* camera = cameraOld;//Game->Device->getSceneManager()->addCameraSceneNode(); - - //Left eye... - vector3df pos; - matrix4 move; - - move.setTranslation( vector3df(-1.5f,0.0f,0.0f) ); - pos=(startMatrix*move).getTranslation(); - - driver->getOverrideMaterial().Material.ColorMask = ECP_RED; - driver->getOverrideMaterial().EnableFlags = EMF_COLOR_MASK; - driver->getOverrideMaterial().EnablePasses = - ESNRP_SKY_BOX|ESNRP_SOLID|ESNRP_TRANSPARENT| - ESNRP_TRANSPARENT_EFFECT|ESNRP_SHADOW; - - camera->setPosition(pos); - camera->setTarget(focusPoint); - - Game->Device->getSceneManager()->drawAll(); - driver->clearBuffers(video::ECBF_DEPTH, video::SColor(255, 0, 0, 0)); - - //Right eye... - move.setTranslation( vector3df(1.5f,0.0f,0.0f) ); - pos=(startMatrix*move).getTranslation(); - - driver->getOverrideMaterial().Material.ColorMask = ECP_GREEN + ECP_BLUE; - driver->getOverrideMaterial().EnableFlags = EMF_COLOR_MASK; - driver->getOverrideMaterial().EnablePasses = - ESNRP_SKY_BOX|ESNRP_SOLID|ESNRP_TRANSPARENT| - ESNRP_TRANSPARENT_EFFECT|ESNRP_SHADOW; - - camera->setPosition(pos); - camera->setTarget(focusPoint); - - Game->Device->getSceneManager()->drawAll(); - - driver->getOverrideMaterial().Material.ColorMask=ECP_ALL; - driver->getOverrideMaterial().EnableFlags=0; - driver->getOverrideMaterial().EnablePasses=0; - - if (camera != cameraOld) - { - Game->Device->getSceneManager()->setActiveCamera(cameraOld); - camera->remove(); - } - else - { - camera->setPosition(oldPosition); - camera->setTarget(oldTarget); - } - } - else - { - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,0,0,0)); - Game->Device->getSceneManager()->drawAll(); - } - Game->Device->getGUIEnvironment()->drawAll(); - driver->endScene(); -} - -/* - update the generic scene node -*/ -void CQuake3EventHandler::Animate() -{ - u32 now = Game->Device->getTimer()->getTime(); - - Q3Player * player = Player + 0; - - checkTimeFire ( player->Anim, 4, now ); - - // Query Scene Manager attributes - if ( player->Anim[0].flags & FIRED ) - { - wchar_t msg[128]; - IVideoDriver * driver = Game->Device->getVideoDriver(); - -#ifdef _IRR_SCENEMANAGER_DEBUG - IAttributes * attr = Game->Device->getSceneManager()->getParameters(); - swprintf_irr ( msg, 128, - L"Q3 %s [%ls], FPS:%03d Tri:%.03fm Cull %d/%d nodes (%d,%d,%d)", - Game->CurrentMapName.c_str(), - driver->getName(), - driver->getFPS (), - (f32) driver->getPrimitiveCountDrawn( 0 ) * ( 1.f / 1000000.f ), - attr->getAttributeAsInt ( "culled" ), - attr->getAttributeAsInt ( "calls" ), - attr->getAttributeAsInt ( "drawn_solid" ), - attr->getAttributeAsInt ( "drawn_transparent" ), - attr->getAttributeAsInt ( "drawn_transparent_effect" ) - ); -#else -swprintf_irr ( msg, 128, - L"Q3 %s [%ls], FPS:%03d Tri:%.03fm", - Game->CurrentMapName.c_str(), - driver->getName(), - driver->getFPS (), - (f32) driver->getPrimitiveCountDrawn( 0 ) * ( 1.f / 1000000.f ) - ); -#endif - Game->Device->setWindowCaption( msg ); - - swprintf_irr ( msg, 128, - L"%03d fps, F1 GUI on/off, F2 respawn, F3-F6 toggle Nodes, F7 Collision on/off" - L", F8 Gravity on/off, Right Mouse Toggle GUI", - Game->Device->getVideoDriver()->getFPS () - ); - if ( gui.StatusLine ) - gui.StatusLine->setText ( msg ); - player->Anim[0].flags &= ~FIRED; - } - - // idle.. - if ( player->Anim[1].flags & FIRED ) - { - if ( strcmp ( player->animation, "idle" ) ) - player->setAnim ( "idle" ); - - player->Anim[1].flags &= ~FIRED; - } - - createParticleImpacts ( now ); - -} - - -/* The main game states -*/ -void runGame ( GameData *game ) -{ - if ( game->retVal >= 3 ) - return; - - game->Device = (*game->createExDevice) ( game->deviceParam ); - if ( 0 == game->Device) - { - // could not create selected driver. - game->retVal = 0; - return; - } - - // create an event receiver based on current game data - CQuake3EventHandler *eventHandler = new CQuake3EventHandler( game ); - - // load stored config - game->load ( "explorer.cfg" ); - - // add our media directory and archive to the file system - for ( u32 i = 0; i < game->CurrentArchiveList.size(); ++i ) - { - eventHandler->AddArchive ( game->CurrentArchiveList[i] ); - } - - // Load a Map or startup to the GUI - if ( game->CurrentMapName.size () ) - { - eventHandler->LoadMap ( game->CurrentMapName, 1 ); - if ( 0 == game->loadParam.loadSkyShader ) - eventHandler->AddSky ( 1, "skydome2" ); - eventHandler->CreatePlayers (); - eventHandler->CreateGUI (); - eventHandler->SetGUIActive ( 0 ); - - // set player to last position on restart - if ( game->retVal == 2 ) - { - eventHandler->GetPlayer( 0 )->setpos ( game->PlayerPosition, game->PlayerRotation ); - } - } - else - { - // start up empty - eventHandler->AddSky ( 1, "skydome2" ); - eventHandler->CreatePlayers (); - eventHandler->CreateGUI (); - eventHandler->SetGUIActive ( 1 ); - background_music ( "IrrlichtTheme.ogg" ); - } - - - game->retVal = 3; - while( game->Device->run() ) - { - eventHandler->Animate (); - eventHandler->Render (); - //if ( !game->Device->isWindowActive() ) - game->Device->yield(); - } - - game->Device->setGammaRamp ( 1.f, 1.f, 1.f, 0.f, 0.f ); - delete eventHandler; -} - -#if defined (_IRR_WINDOWS_) && 0 - #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") -#endif - - -/* The main routine, doing all setup -*/ -int IRRCALLCONV main(int argc, char* argv[]) -{ - path prgname(argv[0]); - GameData game ( deletePathFromPath ( prgname, 1 ) ); - - // dynamically load irrlicht - const c8 * dllName = argc > 1 ? argv[1] : "irrlicht.dll"; - game.createExDevice = load_createDeviceEx ( dllName ); - if ( 0 == game.createExDevice ) - { - game.retVal = 3; - printf ( "Could not load %s.\n", dllName ); - return game.retVal; // could not load dll - } - - // start without asking for driver - game.retVal = 1; - do - { - // if driver could not created, ask for another driver - if ( game.retVal == 0 ) - { - game.setDefault (); - // ask user for driver - game.deviceParam.DriverType=driverChoiceConsole(); - if (game.deviceParam.DriverType==video::EDT_COUNT) - game.retVal = 3; - } - runGame ( &game ); - } while ( game.retVal < 3 ); - - return game.retVal; -} - -/* -**/ diff --git a/examples/21.Quake3Explorer/q3factory.cpp b/examples/21.Quake3Explorer/q3factory.cpp deleted file mode 100644 index 476a2ed4..00000000 --- a/examples/21.Quake3Explorer/q3factory.cpp +++ /dev/null @@ -1,825 +0,0 @@ -/*! - Model Factory. - create the additional scenenodes for ( bullets, health... ) - - Defines the Entities for Quake3 -*/ - -#include -#include "q3factory.h" -#include "sound.h" - -using namespace irr; -using namespace scene; -using namespace gui; -using namespace video; -using namespace core; -using namespace quake3; - -//! This list is based on the original quake3. -static const SItemElement Quake3ItemElement [] = { -{ "item_health", - {"models/powerups/health/medium_cross.md3", - "models/powerups/health/medium_sphere.md3"}, - "sound/items/n_health.wav", - "icons/iconh_yellow", - "25 Health", - 25, - HEALTH, - SUB_NONE, - SPECIAL_SFX_BOUNCE | SPECIAL_SFX_ROTATE_1 -}, -{ "item_health_large", - "models/powerups/health/large_cross.md3", - "models/powerups/health/large_sphere.md3", - "sound/items/l_health.wav", - "icons/iconh_red", - "50 Health", - 50, - HEALTH, - SUB_NONE, - SPECIAL_SFX_BOUNCE | SPECIAL_SFX_ROTATE_1 -}, -{ - "item_health_mega", - "models/powerups/health/mega_cross.md3", - "models/powerups/health/mega_sphere.md3", - "sound/items/m_health.wav", - "icons/iconh_mega", - "Mega Health", - 100, - HEALTH, - SUB_NONE, - SPECIAL_SFX_BOUNCE | SPECIAL_SFX_ROTATE_1 -}, -{ - "item_health_small", - "models/powerups/health/small_cross.md3", - "models/powerups/health/small_sphere.md3", - "sound/items/s_health.wav", - "icons/iconh_green", - "5 Health", - 5, - HEALTH, - SUB_NONE, - SPECIAL_SFX_BOUNCE | SPECIAL_SFX_ROTATE_1 -}, -{ "ammo_bullets", - "models/powerups/ammo/machinegunam.md3", - "", - "sound/misc/am_pkup.wav", - "icons/icona_machinegun", - "Bullets", - 50, - AMMO, - MACHINEGUN, - SPECIAL_SFX_BOUNCE, -}, -{ - "ammo_cells", - "models/powerups/ammo/plasmaam.md3", - "", - "sound/misc/am_pkup.wav", - "icons/icona_plasma", - "Cells", - 30, - AMMO, - PLASMAGUN, - SPECIAL_SFX_BOUNCE -}, -{ "ammo_rockets", - "models/powerups/ammo/rocketam.md3", - "", - "", - "icons/icona_rocket", - "Rockets", - 5, - AMMO, - ROCKET_LAUNCHER, - SPECIAL_SFX_ROTATE -}, -{ - "ammo_shells", - "models/powerups/ammo/shotgunam.md3", - "", - "sound/misc/am_pkup.wav", - "icons/icona_shotgun", - "Shells", - 10, - AMMO, - SHOTGUN, - SPECIAL_SFX_ROTATE -}, -{ - "ammo_slugs", - "models/powerups/ammo/railgunam.md3", - "", - "sound/misc/am_pkup.wav", - "icons/icona_railgun", - "Slugs", - 10, - AMMO, - RAILGUN, - SPECIAL_SFX_ROTATE -}, -{ - "item_armor_body", - "models/powerups/armor/armor_red.md3", - "", - "sound/misc/ar2_pkup.wav", - "icons/iconr_red", - "Heavy Armor", - 100, - ARMOR, - SUB_NONE, - SPECIAL_SFX_ROTATE -}, -{ - "item_armor_combat", - "models/powerups/armor/armor_yel.md3", - "", - "sound/misc/ar2_pkup.wav", - "icons/iconr_yellow", - "Armor", - 50, - ARMOR, - SUB_NONE, - SPECIAL_SFX_ROTATE -}, -{ - "item_armor_shard", - "models/powerups/armor/shard.md3", - "", - "sound/misc/ar1_pkup.wav", - "icons/iconr_shard", - "Armor Shared", - 5, - ARMOR, - SUB_NONE, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_gauntlet", - "models/weapons2/gauntlet/gauntlet.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_gauntlet", - "Gauntlet", - 0, - WEAPON, - GAUNTLET, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_shotgun", - "models/weapons2/shotgun/shotgun.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_shotgun", - "Shotgun", - 10, - WEAPON, - SHOTGUN, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_machinegun", - "models/weapons2/machinegun/machinegun.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_machinegun", - "Machinegun", - 40, - WEAPON, - MACHINEGUN, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_grenadelauncher", - "models/weapons2/grenadel/grenadel.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_grenade", - "Grenade Launcher", - 10, - WEAPON, - GRENADE_LAUNCHER, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_rocketlauncher", - "models/weapons2/rocketl/rocketl.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_rocket", - "Rocket Launcher", - 10, - WEAPON, - ROCKET_LAUNCHER, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_lightning", - "models/weapons2/lightning/lightning.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_lightning", - "Lightning Gun", - 100, - WEAPON, - LIGHTNING, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_railgun", - "models/weapons2/railgun/railgun.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_railgun", - "Railgun", - 10, - WEAPON, - RAILGUN, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_plasmagun", - "models/weapons2/plasma/plasma.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_plasma", - "Plasma Gun", - 50, - WEAPON, - PLASMAGUN, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_bfg", - "models/weapons2/bfg/bfg.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_bfg", - "BFG10K", - 20, - WEAPON, - BFG, - SPECIAL_SFX_ROTATE -}, -{ - "weapon_grapplinghook", - "models/weapons2/grapple/grapple.md3", - "", - "sound/misc/w_pkup.wav", - "icons/iconw_grapple", - "Grappling Hook", - 0, - WEAPON, - GRAPPLING_HOOK, - SPECIAL_SFX_ROTATE -}, -{ - 0 -} - -}; - - -/*! -*/ -const SItemElement * getItemElement ( const stringc& key ) -{ - const SItemElement *item = Quake3ItemElement; - - while ( item->key ) - { - if ( 0 == strcmp ( key.c_str(), item->key ) ) - return item; - item += 1; - } - return 0; -} - -/*! - Quake3 Model Factory. - Takes the mesh buffers and creates scenenodes for their associated shaders -*/ -void Q3ShaderFactory ( Q3LevelLoadParameter &loadParam, - IrrlichtDevice *device, - IQ3LevelMesh* mesh, - eQ3MeshIndex meshIndex, - ISceneNode *parent, - IMetaTriangleSelector *meta, - bool showShaderName ) -{ - if ( 0 == mesh || 0 == device ) - return; - - IMeshSceneNode* node = 0; - ISceneManager* smgr = device->getSceneManager(); - ITriangleSelector * selector = 0; - - // the additional mesh can be quite huge and is unoptimized - // Save to cast to SMesh - SMesh * additional_mesh = (SMesh*) mesh->getMesh ( meshIndex ); - if ( 0 == additional_mesh || additional_mesh->getMeshBufferCount() == 0) - return; - - char buf[128]; - if ( loadParam.verbose > 0 ) - { - loadParam.startTime = device->getTimer()->getRealTime(); - if ( loadParam.verbose > 1 ) - { - snprintf_irr(buf, 128, "q3shaderfactory start" ); - device->getLogger()->log( buf, ELL_INFORMATION); - } - } - - IGUIFont *font = 0; - if ( showShaderName ) - font = device->getGUIEnvironment()->getFont("fontlucida.png"); - - IVideoDriver *driver = device->getVideoDriver(); - - // create helper textures - if ( 1 ) - { - tTexArray tex; - u32 pos = 0; - getTextures ( tex, "$redimage $blueimage $whiteimage $checkerimage", pos, - device->getFileSystem(), driver ); - } - - s32 sceneNodeID = 0; - for ( u32 i = 0; i!= additional_mesh->getMeshBufferCount (); ++i ) - { - IMeshBuffer *meshBuffer = additional_mesh->getMeshBuffer ( i ); - const SMaterial &material = meshBuffer->getMaterial(); - - //! The ShaderIndex is stored in the second material parameter - s32 shaderIndex = (s32) material.MaterialTypeParam2; - - // the meshbuffer can be rendered without additional support, or it has no shader - IShader *shader = (IShader *) mesh->getShader ( shaderIndex ); - - // no shader, or mapped to existing material - if ( 0 == shader ) - { - -#if 1 - // clone mesh - SMesh * m = new SMesh (); - m->addMeshBuffer ( meshBuffer ); - SMaterial &mat = m->getMeshBuffer( 0 )->getMaterial(); - if ( mat.getTexture( 0 ) == 0 ) - mat.setTexture ( 0, driver->getTexture ( "$blueimage" ) ); - if ( mat.getTexture( 1 ) == 0 ) - mat.setTexture ( 1, driver->getTexture ( "$redimage" ) ); - - IMesh * store = smgr->getMeshManipulator ()->createMeshWith2TCoords ( m ); - m->drop(); - - node = smgr->addMeshSceneNode ( store, parent, sceneNodeID ); - node->setAutomaticCulling ( scene::EAC_OFF ); - store->drop (); - sceneNodeID += 1; -#endif - } - else if ( 1 ) - { -/* - stringc s; - dumpShader ( s, shader ); - printf ( s.c_str () ); -*/ - // create sceneNode - node = smgr->addQuake3SceneNode ( meshBuffer, shader, parent, sceneNodeID ); - node->setAutomaticCulling ( scene::EAC_FRUSTUM_BOX ); - sceneNodeID += 1; - } - - // show Debug Shader Name - if ( showShaderName && node ) - { - swprintf_irr ( (wchar_t*) buf, 64, L"%hs:%d", node->getName(),node->getID() ); - smgr->addBillboardTextSceneNode( - font, - (wchar_t*) buf, - node, - dimension2d(80.0f, 8.0f), - vector3df(0, 10, 0), - sceneNodeID); - sceneNodeID += 1; - } - - // create Portal Rendertargets - if ( shader ) - { - const SVarGroup *group = shader->getGroup(1); - if ( group->isDefined( "surfaceparm", "portal" ) ) - { - } - - } - - - // add collision - // find out if shader is marked as nonsolid - u8 doCreate = meta !=0 ; - - if ( shader ) - { - const SVarGroup *group = shader->getGroup(1); - if ( group->isDefined( "surfaceparm", "trans" ) - // || group->isDefined( "surfaceparm", "sky" ) - // || group->isDefined( "surfaceparm", "nonsolid" ) - ) - { - if ( !group->isDefined( "surfaceparm", "metalsteps" ) ) - { - doCreate = 0; - } - } - } - - if ( doCreate ) - { - IMesh *m = 0; - - //! controls if triangles are modified by the scenenode during runtime - bool takeOriginal = true; - - if ( takeOriginal ) - { - m = new SMesh (); - ((SMesh*) m )->addMeshBuffer (meshBuffer); - } - else - { - m = node->getMesh(); - } - - //selector = smgr->createOctreeTriangleSelector ( m, 0, 128 ); - selector = smgr->createTriangleSelector ( m, 0 ); - meta->addTriangleSelector ( selector ); - selector->drop (); - - if ( takeOriginal ) - { - delete m; - } - } - - } - -#if 0 - if ( meta ) - { - selector = smgr->createOctreeTriangleSelector ( additional_mesh, 0 ); - meta->addTriangleSelector ( selector ); - selector->drop (); - } -#endif - - if ( loadParam.verbose > 0 ) - { - loadParam.endTime = device->getTimer()->getRealTime (); - snprintf_irr(buf, 128, "q3shaderfactory needed %04d ms to create %d shader nodes", - loadParam.endTime - loadParam.startTime, - sceneNodeID - ); - device->getLogger()->log(buf, ELL_INFORMATION); - } - -} - - -/*! - create Items from Entity -*/ -void Q3ModelFactory ( Q3LevelLoadParameter &loadParam, - IrrlichtDevice *device, - IQ3LevelMesh* masterMesh, - ISceneNode *parent, - bool showShaderName - ) -{ - if ( 0 == masterMesh ) - return; - - tQ3EntityList &entity = masterMesh->getEntityList (); - ISceneManager* smgr = device->getSceneManager(); - - - char buf[128]; - const SVarGroup *group; - IEntity search; - s32 index; - s32 lastIndex; - -/* - stringc s; - FILE *f = 0; - f = fopen ( "entity.txt", "wb" ); - for ( index = 0; (u32) index < entityList.size (); ++index ) - { - const IEntity *entity = &entityList[ index ]; - s = entity->name; - dumpShader ( s, entity ); - fwrite ( s.c_str(), 1, s.size(), f ); - } - fclose ( f ); -*/ - IAnimatedMeshMD3* model; - SMD3Mesh * mesh; - const SMD3MeshBuffer *meshBuffer; - IMeshSceneNode* node; - ISceneNodeAnimator* anim; - const IShader *shader; - u32 pos; - vector3df p; - u32 nodeCount = 0; - tTexArray textureArray; - - IGUIFont *font = 0; - if ( showShaderName ) - font = device->getGUIEnvironment()->getFont("fontlucida.png"); - - const SItemElement *itemElement; - - // walk list - for ( index = 0; (u32) index < entity.size(); ++index ) - { - itemElement = getItemElement ( entity[index].name ); - if ( 0 == itemElement ) - continue; - - pos = 0; - p = getAsVector3df ( entity[index].getGroup(1)->get ( "origin" ), pos ); - - nodeCount += 1; - for ( u32 g = 0; g < 2; ++g ) - { - if ( 0 == itemElement->model[g] || itemElement->model[g][0] == 0 ) - continue; - model = (IAnimatedMeshMD3*) smgr->getMesh( itemElement->model[g] ); - if ( 0 == model ) - continue; - - mesh = model->getOriginalMesh(); - for ( u32 j = 0; j != mesh->Buffer.size (); ++j ) - { - meshBuffer = mesh->Buffer[j]; - if ( 0 == meshBuffer ) - continue; - - shader = masterMesh->getShader ( meshBuffer->Shader.c_str(), false ); - IMeshBuffer *final = model->getMesh(0)->getMeshBuffer(j); - if ( shader ) - { - //!TODO: Hack don't modify the vertexbuffer. make it better;-) - final->getMaterial().ColorMask = 0; - node = smgr->addQuake3SceneNode ( final, shader, parent ); - final->getMaterial().ColorMask = 15; - } - else - { - // clone mesh - SMesh * m = new SMesh (); - m->addMeshBuffer ( final ); - node = smgr->addMeshSceneNode ( m, parent ); - m->drop(); - } - - if ( 0 == node ) - { - snprintf_irr ( buf, 128, "q3ModelFactory shader %s failed", meshBuffer->Shader.c_str() ); - device->getLogger()->log ( buf ); - continue; - } - - // node was maybe centered by shaderscenenode - node->setPosition ( p ); - node->setName ( meshBuffer->Shader ); - node->setAutomaticCulling ( scene::EAC_BOX ); - - // add special effects to node - if ( itemElement->special & SPECIAL_SFX_ROTATE || - (g == 0 && itemElement->special & SPECIAL_SFX_ROTATE_1) - ) - { - anim = smgr->createRotationAnimator ( vector3df ( 0.f, - 2.f, 0.f ) ); - node->addAnimator ( anim ); - anim->drop (); - } - - if ( itemElement->special & SPECIAL_SFX_BOUNCE ) - { - //anim = smgr->createFlyStraightAnimator ( - // p, p + vector3df ( 0.f, 60.f, 0.f ), 1000, true, true ); - anim = smgr->createFlyCircleAnimator ( - p + vector3df( 0.f, 20.f, 0.f ), - 20.f, - 0.005f, - vector3df ( 1.f, 0.f, 0.f ), - core::fract ( nodeCount * 0.05f ), - 1.f - ); - node->addAnimator ( anim ); - anim->drop (); - } - } - } - // show name - if ( showShaderName ) - { - swprintf_irr ( (wchar_t*) buf, sizeof(buf) / 2, L"%hs", itemElement->key ); - smgr->addBillboardTextSceneNode( - font, - (wchar_t*) buf, - parent, - dimension2d(80.0f, 8.0f), - p + vector3df(0, 30, 0), - 0); - } - } - - // music - search.name = "worldspawn"; - index = entity.binary_search_multi ( search, lastIndex ); - - if ( index >= 0 ) - { - group = entity[ index ].getGroup(1); - background_music ( group->get ( "music" ).c_str () ); - } - - // music - search.name = "worldspawn"; - index = entity.binary_search_multi ( search, lastIndex ); - - if ( index >= 0 ) - { - group = entity[ index ].getGroup(1); - background_music ( group->get ( "music" ).c_str () ); - } - - //IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); - //IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); - -} - -/*! - so we need a good starting Position in the level. - we can ask the Quake3 Loader for all entities with class_name "info_player_deathmatch" -*/ -s32 Q3StartPosition ( IQ3LevelMesh* mesh, - ICameraSceneNode* camera, - s32 startposIndex, - const vector3df &translation - ) -{ - if ( 0 == mesh ) - return 0; - - tQ3EntityList &entityList = mesh->getEntityList (); - - IEntity search; - search.name = "info_player_start"; // "info_player_deathmatch"; - - // find all entities in the multi-list - s32 lastIndex; - s32 index = entityList.binary_search_multi ( search, lastIndex ); - - if ( index < 0 ) - { - search.name = "info_player_deathmatch"; - index = entityList.binary_search_multi ( search, lastIndex ); - } - - if ( index < 0 ) - return 0; - - index += core::clamp ( startposIndex, 0, lastIndex - index ); - - u32 parsepos; - - const SVarGroup *group; - group = entityList[ index ].getGroup(1); - - parsepos = 0; - vector3df pos = getAsVector3df ( group->get ( "origin" ), parsepos ); - pos += translation; - - parsepos = 0; - f32 angle = getAsFloat ( group->get ( "angle"), parsepos ); - - vector3df target ( 0.f, 0.f, 1.f ); - target.rotateXZBy ( angle - 90.f, vector3df () ); - - if ( camera ) - { - camera->setPosition ( pos ); - camera->setTarget ( pos + target ); - //! New. FPSCamera and animators catches reset on animate 0 - camera->OnAnimate ( 0 ); - } - return lastIndex - index + 1; -} - - -/*! - gets a accumulated force on a given surface -*/ -vector3df getGravity ( const c8 * surface ) -{ - if ( 0 == strcmp ( surface, "earth" ) ) return vector3df ( 0.f, -900.f, 0.f ); - if ( 0 == strcmp ( surface, "moon" ) ) return vector3df ( 0.f, -6.f , 0.f ); - if ( 0 == strcmp ( surface, "water" ) ) return vector3df ( 0.1f, -2.f, 0.f ); - if ( 0 == strcmp ( surface, "ice" ) ) return vector3df ( 0.2f, -9.f, 0.3f ); - - return vector3df ( 0.f, 0.f, 0.f ); -} - - - -/* - Dynamically load the Irrlicht Library -*/ - -#if defined(_IRR_WINDOWS_API_) -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -#include - -funcptr_createDevice load_createDevice ( const c8 * filename) -{ - return (funcptr_createDevice) GetProcAddress ( LoadLibrary ( filename ), "createDevice" ); -} - -funcptr_createDeviceEx load_createDeviceEx ( const c8 * filename) -{ - return (funcptr_createDeviceEx) GetProcAddress ( LoadLibrary ( filename ), "createDeviceEx" ); -} - -#else - -// TODO: Dynamic Loading for other os - -funcptr_createDevice load_createDevice ( const c8 * filename) -{ - return createDevice; -} - -funcptr_createDeviceEx load_createDeviceEx ( const c8 * filename) -{ - return createDeviceEx; -} - -#endif - -/* - get the current collision response camera animator -*/ -ISceneNodeAnimatorCollisionResponse* camCollisionResponse( IrrlichtDevice * device ) -{ - ICameraSceneNode *camera = device->getSceneManager()->getActiveCamera(); - ISceneNodeAnimatorCollisionResponse *a = 0; - - list::ConstIterator it = camera->getAnimators().begin(); - for (; it != camera->getAnimators().end(); ++it) - { - a = (ISceneNodeAnimatorCollisionResponse*) (*it); - if ( a->getType() == ESNAT_COLLISION_RESPONSE ) - return a; - } - - return 0; -} - - -//! internal Animation -void setTimeFire ( TimeFire *t, u32 delta, u32 flags ) -{ - t->flags = flags; - t->next = 0; - t->delta = delta; -} - - -void checkTimeFire ( TimeFire *t, u32 listSize, u32 now ) -{ - u32 i; - for ( i = 0; i < listSize; ++i ) - { - if ( now < t[i].next ) - continue; - - t[i].next = core::max_ ( now + t[i].delta, t[i].next + t[i].delta ); - t[i].flags |= FIRED; - } -} diff --git a/examples/21.Quake3Explorer/q3factory.h b/examples/21.Quake3Explorer/q3factory.h deleted file mode 100644 index d9606ed0..00000000 --- a/examples/21.Quake3Explorer/q3factory.h +++ /dev/null @@ -1,149 +0,0 @@ -/*! - Model Factory. - create the additional scenenodes for ( bullets, health... ) - - Defines the Entities for Quake3 -*/ -#ifndef __QUAKE3_FACTORY__H_INCLUDED__ -#define __QUAKE3_FACTORY__H_INCLUDED__ - -using namespace irr; -using namespace scene; -using namespace gui; -using namespace video; -using namespace core; -using namespace quake3; -using namespace io; - - - -//! Defines to which group the entities belong -enum eItemGroup -{ - WEAPON, - AMMO, - ARMOR, - HEALTH, - POWERUP -}; - -//! define a supgroup for the item. for e.q the Weapons -enum eItemSubGroup -{ - SUB_NONE = 0, - GAUNTLET, - MACHINEGUN, - SHOTGUN, - GRENADE_LAUNCHER, - ROCKET_LAUNCHER, - LIGHTNING, - RAILGUN, - PLASMAGUN, - BFG, - GRAPPLING_HOOK, - NAILGUN, - PROX_LAUNCHER, - CHAINGUN, -}; - -//! aplly a special effect to the shader -enum eItemSpecialEffect -{ - SPECIAL_SFX_NONE = 0, - SPECIAL_SFX_ROTATE = 1, - SPECIAL_SFX_BOUNCE = 2, - SPECIAL_SFX_ROTATE_1 = 4, -}; - -// a List for defining a model -struct SItemElement -{ - const c8 *key; - const c8 *model[2]; - const c8 *sound; - const c8 *icon; - const c8 *pickup; - s32 value; - eItemGroup group; - eItemSubGroup sub; - u32 special; -}; - - -//! Get's an entity based on it's key -const SItemElement * getItemElement ( const stringc& key ); - -/*! - Quake3 Model Factory. - Takes the mesh buffers and creates scenenodes for their associated shaders -*/ -void Q3ShaderFactory ( Q3LevelLoadParameter &loadParam, - IrrlichtDevice *device, - IQ3LevelMesh* mesh, - eQ3MeshIndex meshIndex, - ISceneNode *parent, - IMetaTriangleSelector *meta, - bool showShaderName - ); - - -/*! - Creates Model based on the entity list -*/ -void Q3ModelFactory ( Q3LevelLoadParameter &loadParam, - IrrlichtDevice *device, - IQ3LevelMesh* masterMesh, - ISceneNode *parent, - bool showShaderName - ); - -/*! - so we need a good starting Position in the level. - we can ask the Quake3 Loader for all entities with class_name "info_player_deathmatch" -*/ -s32 Q3StartPosition ( IQ3LevelMesh* mesh, - ICameraSceneNode* camera, - s32 startposIndex, - const vector3df &translation - ); -/*! - gets a accumulated force on a given surface -*/ -vector3df getGravity ( const c8 * surface ); - - -/* - Dynamically load the Irrlicht Library -*/ -funcptr_createDevice load_createDevice ( const c8 * filename); -funcptr_createDeviceEx load_createDeviceEx ( const c8 * filename); - - -//! Macro for save Dropping an Element -#define dropElement(x) if (x) { x->remove(); x = 0; } - - -/* - get the current collision respone camera animator -*/ -ISceneNodeAnimatorCollisionResponse* camCollisionResponse( IrrlichtDevice * device ); - -//! internal Animation -enum eTimeFireFlag -{ - FIRED = 1, -}; - -struct TimeFire -{ - u32 flags; - u32 next; - u32 delta; -}; - -void setTimeFire ( TimeFire *t, u32 delta, u32 flags = 0 ); -void checkTimeFire ( TimeFire *t, u32 listSize, u32 now ); - -#endif // __QUAKE3_FACTORY__H_INCLUDED__ - - diff --git a/examples/21.Quake3Explorer/sound.cpp b/examples/21.Quake3Explorer/sound.cpp deleted file mode 100644 index f693e660..00000000 --- a/examples/21.Quake3Explorer/sound.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/*! - Sound Factory. - provides a sound interface - -*/ - -#include "sound.h" - - -//#define USE_IRRKLANG - -#ifdef USE_IRRKLANG - -#include -#ifdef _MSC_VER - #pragma comment (lib, "irrKlang.lib") -#endif - -using namespace irrklang; - -struct soundfile: public IFileReader -{ - soundfile ( io::IReadFile* f ): file (f ) {} - virtual ~soundfile () { file->drop (); } - - virtual ik_s32 read(void* buffer, ik_u32 sizeToRead) { return file->read ( buffer, sizeToRead ); } - virtual bool seek(ik_s32 finalPos, bool relativeMovement = false) { return file->seek ( finalPos, relativeMovement ); } - virtual ik_s32 getSize(){ return file->getSize (); } - virtual ik_s32 getPos() {return file->getPos (); } - virtual const ik_c8* getFileName() { return file->getFileName().c_str(); } - io::IReadFile* file; -}; - -struct klangFactory : public irrklang::IFileFactory -{ - klangFactory ( IrrlichtDevice *device ) { Device = device; } - - virtual irrklang::IFileReader* createFileReader(const ik_c8* filename) - { - io::IReadFile* file = Device->getFileSystem()->createAndOpenFile(filename); - if ( 0 == file ) - return 0; - - return new soundfile ( file ); - } - - IrrlichtDevice *Device; -}; - -ISoundEngine *engine = 0; -ISound *backMusic = 0; - -void sound_init ( IrrlichtDevice *device ) -{ - engine = createIrrKlangDevice (); - if ( 0 == engine ) - return; - - klangFactory *f = new klangFactory ( device ); - engine->addFileFactory ( f ); -} - -void sound_shutdown () -{ - if ( backMusic ) - backMusic->drop (); - - if ( engine ) - engine->drop (); -} - -void background_music ( const c8 * file ) -{ - if ( 0 == engine ) - return; - - if ( backMusic ) - { - backMusic->stop (); - backMusic->drop (); - } - - backMusic = engine->play2D ( file, true, false, true ); - - if ( backMusic ) - { - backMusic->setVolume ( 0.5f ); - } -} - -#else - -void sound_init ( IrrlichtDevice *device ) {} -void sound_shutdown () {} -void background_music ( const c8 * file ) {} - -#endif - diff --git a/examples/21.Quake3Explorer/sound.h b/examples/21.Quake3Explorer/sound.h deleted file mode 100644 index 033e9bb6..00000000 --- a/examples/21.Quake3Explorer/sound.h +++ /dev/null @@ -1,18 +0,0 @@ -/*! - Sound Factory. - provides a sound interface - -*/ -#ifndef __QUAKE3_SOUND__H_INCLUDED__ -#define __QUAKE3_SOUND__H_INCLUDED__ - -#include - -using namespace irr; - -void sound_init ( IrrlichtDevice *device ); -void sound_shutdown (); -void background_music ( const c8 * file ); - - -#endif // __QUAKE3_SOUND__H_INCLUDED__ diff --git a/examples/22.MaterialViewer/Makefile b/examples/22.MaterialViewer/Makefile deleted file mode 100644 index fcbdc22e..00000000 --- a/examples/22.MaterialViewer/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 22.MaterialViewer -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/22.MaterialViewer/MaterialViewer.cbp b/examples/22.MaterialViewer/MaterialViewer.cbp deleted file mode 100644 index 7d4a0624..00000000 --- a/examples/22.MaterialViewer/MaterialViewer.cbp +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - diff --git a/examples/22.MaterialViewer/MaterialViewer.vcproj b/examples/22.MaterialViewer/MaterialViewer.vcproj deleted file mode 100644 index 7419359f..00000000 --- a/examples/22.MaterialViewer/MaterialViewer.vcproj +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/22.MaterialViewer/MaterialViewer.xcodeproj/project.pbxproj b/examples/22.MaterialViewer/MaterialViewer.xcodeproj/project.pbxproj deleted file mode 100644 index c278e231..00000000 --- a/examples/22.MaterialViewer/MaterialViewer.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 22.MaterialViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 22.MaterialViewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 22.MaterialViewer.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 22.MaterialViewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "22.MaterialViewer" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 22.MaterialViewer; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 22.MaterialViewer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "MaterialViewer" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 22.MaterialViewer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "MaterialViewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "22.MaterialViewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/22.MaterialViewer/MaterialViewer.xcodeproj/xcshareddata/xcschemes/22.MaterialViewer.xcscheme b/examples/22.MaterialViewer/MaterialViewer.xcodeproj/xcshareddata/xcschemes/22.MaterialViewer.xcscheme deleted file mode 100644 index eed2899f..00000000 --- a/examples/22.MaterialViewer/MaterialViewer.xcodeproj/xcshareddata/xcschemes/22.MaterialViewer.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/22.MaterialViewer/MaterialViewer_vc10.vcxproj b/examples/22.MaterialViewer/MaterialViewer_vc10.vcxproj deleted file mode 100644 index 5e5560bd..00000000 --- a/examples/22.MaterialViewer/MaterialViewer_vc10.vcxproj +++ /dev/null @@ -1,234 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 22.MaterialViewer - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA} - MaterialViewer - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/22.MaterialViewer/MaterialViewer_vc11.vcxproj b/examples/22.MaterialViewer/MaterialViewer_vc11.vcxproj deleted file mode 100644 index 582faee9..00000000 --- a/examples/22.MaterialViewer/MaterialViewer_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 22.MaterialViewer - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA} - MaterialViewer - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/22.MaterialViewer/MaterialViewer_vc12.vcxproj b/examples/22.MaterialViewer/MaterialViewer_vc12.vcxproj deleted file mode 100644 index ca494237..00000000 --- a/examples/22.MaterialViewer/MaterialViewer_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 22.MaterialViewer - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA} - MaterialViewer - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/22.MaterialViewer/MaterialViewer_vc14.vcxproj b/examples/22.MaterialViewer/MaterialViewer_vc14.vcxproj deleted file mode 100644 index f568176e..00000000 --- a/examples/22.MaterialViewer/MaterialViewer_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 22.MaterialViewer - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA} - MaterialViewer - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Release/MaterialViewer.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - .\Release/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - .\Debug/MaterialViewer.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\22.MaterialViewer.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - .\Debug/MaterialViewer.pdb - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/22.MaterialViewer/main.cpp b/examples/22.MaterialViewer/main.cpp deleted file mode 100755 index 358ce02c..00000000 --- a/examples/22.MaterialViewer/main.cpp +++ /dev/null @@ -1,1047 +0,0 @@ -/** Example 022 Material Viewer - -This example can be used to play around with material settings and watch the results. -Only the default non-shader materials are used in here. - -You have a node with a mesh, one dynamic light and global ambient light to play around with. -You can move the light with cursor-keys and +/-. -You can move the camera while left-mouse button is clicked. -*/ - -// TODO: Should be possible to set all material values by the GUI. -// For now just change the defaultMaterial in CApp::init for the rest. -// TODO: Allow users to switch between a sphere and a box mesh. - -#include -#include "driverChoice.h" -#include "exampleHelper.h" -#include "main.h" - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* - Variables within the empty namespace are globals which are restricted to this file. -*/ -namespace -{ - // For the gui id's - enum EGUI_IDS - { - GUI_ID_OPEN_TEXTURE = 1, - GUI_ID_QUIT, - GUI_ID_MAX - }; - - // Name used in texture selection to clear the textures on the node - const core::stringw CLEAR_TEXTURE = L"CLEAR texture"; - - // some useful color constants - const video::SColor SCOL_BLACK = video::SColor(255, 0, 0, 0); - const video::SColor SCOL_BLUE = video::SColor(255, 0, 0, 255); - const video::SColor SCOL_CYAN = video::SColor(255, 0, 255, 255); - const video::SColor SCOL_GRAY = video::SColor(255, 128,128, 128); - const video::SColor SCOL_GREEN = video::SColor(255, 0, 255, 0); - const video::SColor SCOL_MAGENTA = video::SColor(255, 255, 0, 255); - const video::SColor SCOL_RED = video::SColor(255, 255, 0, 0); - const video::SColor SCOL_YELLOW = video::SColor(255, 255, 255, 0); - const video::SColor SCOL_WHITE = video::SColor(255, 255, 255, 255); -}; // namespace - -/* - Returns a new unique number on each call. -*/ -s32 makeUniqueId() -{ - static int unique = GUI_ID_MAX; - ++unique; - return unique; -} - -/* - Find out which vertex-type is needed for the given material type. -*/ -video::E_VERTEX_TYPE getVertexTypeForMaterialType(video::E_MATERIAL_TYPE materialType) -{ - using namespace video; - - switch ( materialType ) - { - case EMT_SOLID: - return EVT_STANDARD; - - case EMT_SOLID_2_LAYER: - return EVT_STANDARD; - - case EMT_LIGHTMAP: - case EMT_LIGHTMAP_ADD: - case EMT_LIGHTMAP_M2: - case EMT_LIGHTMAP_M4: - case EMT_LIGHTMAP_LIGHTING: - case EMT_LIGHTMAP_LIGHTING_M2: - case EMT_LIGHTMAP_LIGHTING_M4: - return EVT_2TCOORDS; - - case EMT_DETAIL_MAP: - return EVT_2TCOORDS; - - case EMT_SPHERE_MAP: - return EVT_STANDARD; - - case EMT_REFLECTION_2_LAYER: - return EVT_2TCOORDS; - - case EMT_TRANSPARENT_ADD_COLOR: - return EVT_STANDARD; - - case EMT_TRANSPARENT_ALPHA_CHANNEL: - return EVT_STANDARD; - - case EMT_TRANSPARENT_ALPHA_CHANNEL_REF: - return EVT_STANDARD; - - case EMT_TRANSPARENT_VERTEX_ALPHA: - return EVT_STANDARD; - - case EMT_TRANSPARENT_REFLECTION_2_LAYER: - return EVT_2TCOORDS; - - case EMT_NORMAL_MAP_SOLID: - case EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR: - case EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA: - case EMT_PARALLAX_MAP_SOLID: - case EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR: - case EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA: - return EVT_TANGENTS; - - case EMT_ONETEXTURE_BLEND: - return EVT_STANDARD; - - case EMT_FORCE_32BIT: - return EVT_STANDARD; - } - return EVT_STANDARD; -} - -/* - Custom GUI-control to edit colorvalues. -*/ -// Constructor -CColorControl::CColorControl(gui::IGUIEnvironment* guiEnv, const core::position2d & pos, const wchar_t *text, IGUIElement* parent, s32 id) - : gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect< s32 >(pos, pos+core::dimension2d(80, 75))) - , DirtyFlag(true) - , Color(0) - , ColorStatic(0) - , EditAlpha(0) - , EditRed(0) - , EditGreen(0) - , EditBlue(0) -{ - using namespace gui; - ButtonSetId = makeUniqueId(); - - const core::rect< s32 > rectControls(0,0,AbsoluteRect.getWidth(),AbsoluteRect.getHeight() ); - IGUIStaticText * groupElement = guiEnv->addStaticText (L"", rectControls, true, false, this, -1, false); - groupElement->setNotClipped(true); - - guiEnv->addStaticText (text, core::rect(0,0,80,15), false, false, groupElement, -1, false); - - EditAlpha = addEditForNumbers(guiEnv, core::position2d(0,15), L"a", -1, groupElement ); - EditRed = addEditForNumbers(guiEnv, core::position2d(0,30), L"r", -1, groupElement ); - EditGreen = addEditForNumbers(guiEnv, core::position2d(0,45), L"g", -1, groupElement ); - EditBlue = addEditForNumbers(guiEnv, core::position2d(0,60), L"b", -1, groupElement ); - - ColorStatic = guiEnv->addStaticText (L"", core::rect(60,15,80,75), true, false, groupElement, -1, true); - - guiEnv->addButton (core::rect(60,35,80,50), groupElement, ButtonSetId, L"set"); - setEditsFromColor(Color); -} - -// event receiver -bool CColorControl::OnEvent(const SEvent &event) -{ - if ( event.EventType != EET_GUI_EVENT ) - return false; - - if ( event.GUIEvent.Caller->getID() == ButtonSetId && event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - Color = getColorFromEdits(); - setEditsFromColor(Color); - } - - return false; -} - -// set the color values -void CColorControl::setColor(const video::SColor& col) -{ - DirtyFlag = true; - Color = col; - setEditsFromColor(Color); -} - -// Add a staticbox for a description + an editbox so users can enter numbers -gui::IGUIEditBox* CColorControl::addEditForNumbers(gui::IGUIEnvironment* guiEnv, const core::position2d & pos, const wchar_t *text, s32 id, gui::IGUIElement * parent) -{ - using namespace gui; - - core::rect< s32 > rect(pos, pos+core::dimension2d(10, 15)); - guiEnv->addStaticText (text, rect, false, false, parent, -1, false); - rect += core::position2d( 20, 0 ); - rect.LowerRightCorner.X += 20; - gui::IGUIEditBox* edit = guiEnv->addEditBox(L"0", rect, true, parent, id); - return edit; -} - -// Get the color value from the editfields -video::SColor CColorControl::getColorFromEdits() const -{ - video::SColor col; - - if (EditAlpha) - { - u32 alpha = core::strtoul10(core::stringc(EditAlpha->getText()).c_str()); - if (alpha > 255) - alpha = 255; - col.setAlpha(alpha); - } - - if (EditRed) - { - u32 red = core::strtoul10(core::stringc(EditRed->getText()).c_str()); - if (red > 255) - red = 255; - col.setRed(red); - } - - if (EditGreen) - { - u32 green = core::strtoul10(core::stringc(EditGreen->getText()).c_str()); - if (green > 255) - green = 255; - col.setGreen(green); - } - - if (EditBlue) - { - u32 blue = core::strtoul10(core::stringc(EditBlue->getText()).c_str()); - if (blue > 255) - blue = 255; - col.setBlue(blue); - } - - return col; -} - -// Fill the editfields with the value for the given color -void CColorControl::setEditsFromColor(video::SColor col) -{ - DirtyFlag = true; - if ( EditAlpha ) - EditAlpha->setText( core::stringw(col.getAlpha()).c_str() ); - if ( EditRed ) - EditRed->setText( core::stringw(col.getRed()).c_str() ); - if ( EditGreen ) - EditGreen->setText( core::stringw(col.getGreen()).c_str() ); - if ( EditBlue ) - EditBlue->setText( core::stringw(col.getBlue()).c_str() ); - if ( ColorStatic ) - ColorStatic->setBackgroundColor(col); -} - -/* - Custom GUI-control for to edit all colors typically used in materials and lights -*/ -// Constructor -CTypicalColorsControl::CTypicalColorsControl(gui::IGUIEnvironment* guiEnv, const core::position2d & pos, bool hasEmissive, IGUIElement* parent, s32 id) - : gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect(pos,pos+core::dimension2d(60,250))) - , ControlAmbientColor(0), ControlDiffuseColor(0), ControlSpecularColor(0), ControlEmissiveColor(0) -{ - ControlAmbientColor = new CColorControl( guiEnv, core::position2d(0, 0), L"Ambient", this); - ControlDiffuseColor = new CColorControl( guiEnv, core::position2d(0, 75), L"Diffuse", this ); - ControlSpecularColor = new CColorControl( guiEnv, core::position2d(0, 150), L"Specular", this ); - if ( hasEmissive ) - { - ControlEmissiveColor = new CColorControl( guiEnv, core::position2d(0, 225), L"Emissive", this ); - } -} - -// Destructor -CTypicalColorsControl::~CTypicalColorsControl() -{ - ControlAmbientColor->drop(); - ControlDiffuseColor->drop(); - if ( ControlEmissiveColor ) - ControlEmissiveColor->drop(); - ControlSpecularColor->drop(); -} - -// Set the color values to those within the material -void CTypicalColorsControl::setColorsToMaterialColors(const video::SMaterial & material) -{ - ControlAmbientColor->setColor(material.AmbientColor); - ControlDiffuseColor->setColor(material.DiffuseColor); - ControlEmissiveColor->setColor(material.EmissiveColor); - ControlSpecularColor->setColor(material.SpecularColor); -} - -// Update all changed colors in the material -void CTypicalColorsControl::updateMaterialColors(video::SMaterial & material) const -{ - if ( ControlAmbientColor->isDirty() ) - material.AmbientColor = ControlAmbientColor->getColor(); - if ( ControlDiffuseColor->isDirty() ) - material.DiffuseColor = ControlDiffuseColor->getColor(); - if ( ControlEmissiveColor->isDirty() ) - material.EmissiveColor = ControlEmissiveColor->getColor(); - if ( ControlSpecularColor->isDirty() ) - material.SpecularColor = ControlSpecularColor->getColor(); -} - -// Set the color values to those from the light data -void CTypicalColorsControl::setColorsToLightDataColors(const video::SLight & lightData) -{ - ControlAmbientColor->setColor(lightData.AmbientColor.toSColor()); - ControlDiffuseColor->setColor(lightData.DiffuseColor.toSColor()); - ControlSpecularColor->setColor(lightData.SpecularColor.toSColor()); -} - -// Update all changed colors in the light data -void CTypicalColorsControl::updateLightColors(video::SLight & lightData) const -{ - if ( ControlAmbientColor->isDirty() ) - lightData.AmbientColor = video::SColorf( ControlAmbientColor->getColor() ); - if ( ControlDiffuseColor->isDirty() ) - lightData.DiffuseColor = video::SColorf( ControlDiffuseColor->getColor() ); - if ( ControlSpecularColor->isDirty() ) - lightData.SpecularColor = video::SColorf(ControlSpecularColor->getColor() ); -} - -// To reset the dirty flags -void CTypicalColorsControl::resetDirty() -{ - ControlAmbientColor->resetDirty(); - ControlDiffuseColor->resetDirty(); - ControlSpecularColor->resetDirty(); - if ( ControlEmissiveColor ) - ControlEmissiveColor->resetDirty(); -} - - -/* - GUI-Control to offer a selection of available textures. -*/ -CTextureControl::CTextureControl(gui::IGUIEnvironment* guiEnv, video::IVideoDriver * driver, const core::position2d & pos, IGUIElement* parent, s32 id) -: gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect(pos,pos+core::dimension2d(150,15))) -, DirtyFlag(true), ComboTexture(0) -{ - core::rect rectCombo(0, 0, AbsoluteRect.getWidth(),AbsoluteRect.getHeight()); - ComboTexture = guiEnv->addComboBox (rectCombo, this); - updateTextures(driver); -} - -bool CTextureControl::OnEvent(const SEvent &event) -{ - if ( event.EventType != EET_GUI_EVENT ) - return false; - - if ( event.GUIEvent.Caller == ComboTexture && event.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED ) - { - DirtyFlag = true; - } - - return false; -} - -// Workaround for a problem with comboboxes. -// We have to get in front when the combobox wants to get in front or combobox-list might be drawn below other elements. -bool CTextureControl::bringToFront(IGUIElement* element) -{ - bool result = gui::IGUIElement::bringToFront(element); - if ( Parent && element == ComboTexture ) - result &= Parent->bringToFront(this); - return result; -} - -// return selected texturename (if any, otherwise 0) -const wchar_t * CTextureControl::getSelectedTextureName() const -{ - s32 selected = ComboTexture->getSelected(); - if ( selected < 0 ) - return 0; - return ComboTexture->getItem(selected); -} - -void CTextureControl::selectTextureByName(const irr::core::stringw& name) -{ - for (u32 i=0; i< ComboTexture->getItemCount(); ++i) - { - if ( name == ComboTexture->getItem(i)) - { - ComboTexture->setSelected(i); - DirtyFlag = true; - return; - } - } -} - -// Put the names of all currently loaded textures in a combobox -void CTextureControl::updateTextures(video::IVideoDriver * driver) -{ - s32 oldSelected = ComboTexture->getSelected(); - s32 selectNew = -1; - core::stringw oldTextureName; - if ( oldSelected >= 0 ) - { - oldTextureName = ComboTexture->getItem(oldSelected); - } - ComboTexture->clear(); - for ( u32 i=0; i < driver->getTextureCount(); ++i ) - { - video::ITexture * texture = driver->getTextureByIndex(i); - core::stringw name( texture->getName() ); - ComboTexture->addItem( name.c_str() ); - if ( !oldTextureName.empty() && selectNew < 0 && name == oldTextureName ) - selectNew = i; - } - - // add another name which can be used to clear the texture - ComboTexture->addItem( CLEAR_TEXTURE.c_str() ); - if ( CLEAR_TEXTURE == oldTextureName ) - selectNew = ComboTexture->getItemCount()-1; - - if ( selectNew >= 0 ) - ComboTexture->setSelected(selectNew); - - DirtyFlag = true; -} - -/* - Control which allows setting some of the material values for a meshscenenode -*/ -void CMaterialControl::init(scene::IMeshSceneNode* node, IrrlichtDevice * device, const core::position2d & pos, const wchar_t * description) -{ - if ( Initialized || !node || !device) // initializing twice or with invalid data not allowed - return; - - Driver = device->getVideoDriver (); - gui::IGUIEnvironment* guiEnv = device->getGUIEnvironment(); - //scene::ISceneManager* smgr = device->getSceneManager(); - const video::SMaterial & material = node->getMaterial(0); - - s32 top = pos.Y; - - // Description - guiEnv->addStaticText(description, core::rect(pos.X, top, pos.X+60, top+15), false, false, 0, -1, false); - top += 15; - - // Control for material type - core::rect rectCombo(pos.X, top, 150, top+15); - top += 15; - ComboMaterial = guiEnv->addComboBox (rectCombo); - for ( int i=0; i <= (int)video::EMT_ONETEXTURE_BLEND; ++i ) - { - ComboMaterial->addItem( core::stringw(video::sBuiltInMaterialTypeNames[i]).c_str() ); - } - ComboMaterial->setSelected( (s32)material.MaterialType ); - - // Control to enable/disabling material lighting - core::rect rectBtn(core::position2d(pos.X, top), core::dimension2d(100, 15)); - top += 15; - ButtonLighting = guiEnv->addButton (rectBtn, 0, -1, L"Lighting"); - ButtonLighting->setIsPushButton(true); - ButtonLighting->setPressed(material.Lighting); - core::rect rectInfo( rectBtn.LowerRightCorner.X, rectBtn.UpperLeftCorner.Y, rectBtn.LowerRightCorner.X+40, rectBtn.UpperLeftCorner.Y+15 ); - InfoLighting = guiEnv->addStaticText(L"", rectInfo, true, false ); - InfoLighting->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER ); - - // Controls for colors - TypicalColorsControl = new CTypicalColorsControl(guiEnv, core::position2d(pos.X, top), true, guiEnv->getRootGUIElement()); - top += 300; - TypicalColorsControl->setColorsToMaterialColors(material); - - // Controls for selecting the material textures - guiEnv->addStaticText(L"Textures", core::rect(pos.X, top, pos.X+60, top+15), false, false, 0, -1, false); - top += 15; - - for (irr::u32 i=0; igetRootGUIElement()); - top += 15; - } - - Initialized = true; -} - -void CMaterialControl::update(scene::IMeshSceneNode* sceneNode, scene::IMeshSceneNode* sceneNode2T, scene::IMeshSceneNode* sceneNodeTangents) -{ - if ( !Initialized ) - return; - - video::SMaterial & material = sceneNode->getMaterial(0); - video::SMaterial & material2T = sceneNode2T->getMaterial(0); - video::SMaterial & materialTangents = sceneNodeTangents->getMaterial(0); - - s32 selectedMaterial = ComboMaterial->getSelected(); - if ( selectedMaterial >= (s32)video::EMT_SOLID && selectedMaterial <= (s32)video::EMT_ONETEXTURE_BLEND) - { - // Show the node which has a mesh to work with the currently selected material - video::E_VERTEX_TYPE vertexType = getVertexTypeForMaterialType((video::E_MATERIAL_TYPE)selectedMaterial); - switch ( vertexType ) - { - case video::EVT_STANDARD: - material.MaterialType = (video::E_MATERIAL_TYPE)selectedMaterial; - sceneNode->setVisible(true); - sceneNode2T->setVisible(false); - sceneNodeTangents->setVisible(false); - break; - case video::EVT_2TCOORDS: - material2T.MaterialType = (video::E_MATERIAL_TYPE)selectedMaterial; - sceneNode->setVisible(false); - sceneNode2T->setVisible(true); - sceneNodeTangents->setVisible(false); - break; - case video::EVT_TANGENTS: - materialTangents.MaterialType = (video::E_MATERIAL_TYPE)selectedMaterial; - sceneNode->setVisible(false); - sceneNode2T->setVisible(false); - sceneNodeTangents->setVisible(true); - break; - } - } - - // Always update materials of all nodes, otherwise the tool is confusing to use. - updateMaterial(material); - updateMaterial(material2T); - updateMaterial(materialTangents); - - if ( ButtonLighting->isPressed() ) - InfoLighting->setText(L"is on"); - else - InfoLighting->setText(L"is off"); - - TypicalColorsControl->resetDirty(); - - for (irr::u32 i=0; iresetDirty(); -} - -void CMaterialControl::updateTextures() -{ - for (irr::u32 i=0; iupdateTextures(Driver); -} - -void CMaterialControl::selectTextures(const irr::core::stringw& name) -{ - for (irr::u32 i=0; iselectTextureByName(name); -} - -bool CMaterialControl::isLightingEnabled() const -{ - return ButtonLighting && ButtonLighting->isPressed(); -} - -void CMaterialControl::updateMaterial(video::SMaterial & material) -{ - TypicalColorsControl->updateMaterialColors(material); - material.Lighting = ButtonLighting->isPressed(); - for (irr::u32 i=0; iisDirty() ) - { - material.TextureLayer[i].Texture = Driver->getTexture( io::path(TextureControls[i]->getSelectedTextureName()) ); - } - } -} - -/* - Control to allow setting the color values of a lightscenenode. -*/ - -void CLightNodeControl::init(scene::ILightSceneNode* node, gui::IGUIEnvironment* guiEnv, const core::position2d & pos, const wchar_t * description) -{ - if ( Initialized || !node || !guiEnv) // initializing twice or with invalid data not allowed - return; - - guiEnv->addStaticText(description, core::rect(pos.X, pos.Y, pos.X+70, pos.Y+15), false, false, 0, -1, false); - TypicalColorsControl = new CTypicalColorsControl(guiEnv, core::position2d(pos.X, pos.Y+15), false, guiEnv->getRootGUIElement()); - const video::SLight & lightData = node->getLightData(); - TypicalColorsControl->setColorsToLightDataColors(lightData); - Initialized = true; -} - -void CLightNodeControl::update(scene::ILightSceneNode* node) -{ - if ( !Initialized ) - return; - - video::SLight & lightData = node->getLightData(); - TypicalColorsControl->updateLightColors(lightData); -} - -/* - Main application class -*/ - -/* - Event handler -*/ -bool CApp::OnEvent(const SEvent &event) -{ - if (event.EventType == EET_GUI_EVENT) - { - gui::IGUIEnvironment* env = Device->getGUIEnvironment(); - - switch(event.GUIEvent.EventType) - { - case gui::EGET_MENU_ITEM_SELECTED: - { - gui::IGUIContextMenu* menu = (gui::IGUIContextMenu*)event.GUIEvent.Caller; - s32 id = menu->getItemCommandId(menu->getSelectedItem()); - - switch(id) - { - case GUI_ID_OPEN_TEXTURE: // File -> Open Texture - env->addFileOpenDialog(L"Please select a texture file to open"); - break; - case GUI_ID_QUIT: // File -> Quit - setRunning(false); - break; - } - } - break; - - case gui::EGET_FILE_SELECTED: - { - // load the model file, selected in the file open dialog - gui::IGUIFileOpenDialog* dialog = - (gui::IGUIFileOpenDialog*)event.GUIEvent.Caller; - loadTexture(io::path(dialog->getFileName()).c_str()); - } - break; - - default: - break; - } - } - else if (event.EventType == EET_KEY_INPUT_EVENT) - { - KeysPressed[event.KeyInput.Key] = event.KeyInput.PressedDown; - } - else if (event.EventType == EET_MOUSE_INPUT_EVENT) - { - if (!MousePressed && event.MouseInput.isLeftPressed()) - { - gui::IGUIEnvironment* guiEnv = Device->getGUIEnvironment(); - if ( guiEnv->getHovered() == guiEnv->getRootGUIElement() ) // Click on background - { - MousePressed = true; - MouseStart.X = event.MouseInput.X; - MouseStart.Y = event.MouseInput.Y; - } - } - else if (MousePressed && !event.MouseInput.isLeftPressed()) - { - MousePressed = false; - } - } - - return false; -} - -// Application initialization -// returns true when it was successful initialized, otherwise false. -bool CApp::init(int argc, char *argv[]) -{ - // ask user for driver - Config.DriverType=driverChoiceConsole(); - if (Config.DriverType==video::EDT_COUNT) - return false; - - // create the device with the settings from our config - Device = createDevice(Config.DriverType, Config.ScreenSize); - if (!Device) - return false; - - Device->setWindowCaption( core::stringw(video::DRIVER_TYPE_NAMES[Config.DriverType]).c_str() ); - Device->setEventReceiver(this); - - scene::ISceneManager* smgr = Device->getSceneManager(); - video::IVideoDriver * driver = Device->getVideoDriver (); - gui::IGUIEnvironment* guiEnv = Device->getGUIEnvironment(); - MeshManipulator = smgr->getMeshManipulator(); - - // set a nicer font - gui::IGUISkin* skin = guiEnv->getSkin(); - gui::IGUIFont* font = guiEnv->getFont(getExampleMediaPath() + "fonthaettenschweiler.bmp"); - if (font) - skin->setFont(font); - - // remove some alpha value because it makes those menus harder to read otherwise - video::SColor col3dHighLight( skin->getColor(gui::EGDC_APP_WORKSPACE) ); - col3dHighLight.setAlpha(255); - video::SColor colHighLight( col3dHighLight ); - skin->setColor(gui::EGDC_HIGH_LIGHT, colHighLight ); - skin->setColor(gui::EGDC_3D_HIGH_LIGHT, col3dHighLight ); - - // Add some textures which are useful to test material settings - createDefaultTextures(driver); - - // create a menu - gui::IGUIContextMenu * menuBar = guiEnv->addMenu(); - menuBar->addItem(L"File", -1, true, true); - - gui::IGUIContextMenu* subMenuFile = menuBar->getSubMenu(0); - subMenuFile->addItem(L"Open texture ...", GUI_ID_OPEN_TEXTURE); - subMenuFile->addSeparator(); - subMenuFile->addItem(L"Quit", GUI_ID_QUIT); - - // a static camera - Camera = smgr->addCameraSceneNode (0, core::vector3df(0, 40, -40), - core::vector3df(0, 10, 0), - -1); - - // default material - video::SMaterial defaultMaterial; - defaultMaterial.Shininess = 20.f; - - // add the nodes which are used to show the materials - SceneNode = smgr->addCubeSceneNode (30.0f, 0, -1, - core::vector3df(0, 0, 0), - core::vector3df(0.f, 45.f, 0.f), - core::vector3df(1.0f, 1.0f, 1.0f)); - SceneNode->getMaterial(0) = defaultMaterial; - - const s32 controlsTop = 20; - MeshMaterialControl = new CMaterialControl(); - MeshMaterialControl->init( SceneNode, Device, core::position2d(10,controlsTop), L"Material" ); - MeshMaterialControl->selectTextures(core::stringw("CARO_A8R8G8B8")); // set a useful default texture - - // create nodes with other vertex types - scene::IMesh * mesh2T = MeshManipulator->createMeshWith2TCoords(SceneNode->getMesh()); - SceneNode2T = smgr->addMeshSceneNode(mesh2T, 0, -1, SceneNode->getPosition(), SceneNode->getRotation(), SceneNode->getScale() ); - mesh2T->drop(); - - scene::IMesh * meshTangents = MeshManipulator->createMeshWithTangents(SceneNode->getMesh(), false, false, false); - SceneNodeTangents = smgr->addMeshSceneNode(meshTangents, 0, -1 - , SceneNode->getPosition(), SceneNode->getRotation(), SceneNode->getScale() ); - meshTangents->drop(); - - - // add one light - NodeLight = smgr->addLightSceneNode(0, core::vector3df(0, 0, -40), - video::SColorf(1.0f, 1.0f, 1.0f), - 35.0f); - LightControl = new CLightNodeControl(); - LightControl->init(NodeLight, guiEnv, core::position2d(550,controlsTop), L"Dynamic light" ); - - // one large cube around everything. That's mainly to make the light more obvious. - scene::IMeshSceneNode* backgroundCube = smgr->addCubeSceneNode (200.0f, 0, -1, core::vector3df(0, 0, 0), - core::vector3df(45, 0, 0), - core::vector3df(1.0f, 1.0f, 1.0f)); - backgroundCube->getMaterial(0).BackfaceCulling = false; // we are within the cube, so we have to disable backface culling to see it - backgroundCube->getMaterial(0).EmissiveColor.set(255,50,50,50); // we keep some self lighting to keep texts visible - - - // Add a the mesh vertex color control - guiEnv->addStaticText(L"Mesh", core::rect(200, controlsTop, 270, controlsTop+15), false, false, 0, -1, false); - ControlVertexColors = new CColorControl( guiEnv, core::position2d(200, controlsTop+15), L"Vertex colors", guiEnv->getRootGUIElement()); - video::S3DVertex * vertices = (video::S3DVertex *)SceneNode->getMesh()->getMeshBuffer(0)->getVertices(); - if ( vertices ) - { - ControlVertexColors->setColor(vertices[0].Color); - } - - // Add a control for ambient light - GlobalAmbient = new CColorControl( guiEnv, core::position2d(550, 300), L"Global ambient", guiEnv->getRootGUIElement()); - GlobalAmbient->setColor( smgr->getAmbientLight().toSColor() ); - - return true; -} - -/* - Update one frame -*/ -bool CApp::update() -{ - using namespace irr; - - video::IVideoDriver* videoDriver = Device->getVideoDriver(); - if ( !Device->run() ) - return false; - - // Figure out delta time since last frame - ITimer * timer = Device->getTimer(); - u32 newTick = timer->getRealTime(); - f32 deltaTime = RealTimeTick > 0 ? f32(newTick-RealTimeTick)/1000.f : 0.f; // in seconds - RealTimeTick = newTick; - - if ( Device->isWindowActive() || Config.RenderInBackground ) - { - gui::IGUIEnvironment* guiEnv = Device->getGUIEnvironment(); - scene::ISceneManager* smgr = Device->getSceneManager(); - gui::IGUISkin * skin = guiEnv->getSkin(); - - // update our controls - MeshMaterialControl->update(SceneNode, SceneNode2T, SceneNodeTangents); - LightControl->update(NodeLight); - - // Update vertices - if ( ControlVertexColors->isDirty() ) - { - MeshManipulator->setVertexColors (SceneNode->getMesh(), ControlVertexColors->getColor()); - MeshManipulator->setVertexColors (SceneNode2T->getMesh(), ControlVertexColors->getColor()); - MeshManipulator->setVertexColors (SceneNodeTangents->getMesh(), ControlVertexColors->getColor()); - ControlVertexColors->resetDirty(); - } - - // update ambient light settings - if ( GlobalAmbient->isDirty() ) - { - smgr->setAmbientLight( GlobalAmbient->getColor() ); - GlobalAmbient->resetDirty(); - } - - // Let the user move the light around - const float zoomSpeed = 10.f * deltaTime; - const float rotationSpeed = 100.f * deltaTime; - if ( KeysPressed[KEY_PLUS] || KeysPressed[KEY_ADD]) - ZoomOut(NodeLight, zoomSpeed); - if ( KeysPressed[KEY_MINUS] || KeysPressed[KEY_SUBTRACT]) - ZoomOut(NodeLight, -zoomSpeed); - if ( KeysPressed[KEY_RIGHT]) - RotateHorizontal(NodeLight, rotationSpeed); - if ( KeysPressed[KEY_LEFT]) - RotateHorizontal(NodeLight, -rotationSpeed); - UpdateRotationAxis(NodeLight, LightRotationAxis); - if ( KeysPressed[KEY_UP]) - RotateAroundAxis(NodeLight, rotationSpeed, LightRotationAxis); - if ( KeysPressed[KEY_DOWN]) - RotateAroundAxis(NodeLight, -rotationSpeed, LightRotationAxis); - - // Let the user move the camera around - if (MousePressed) - { - gui::ICursorControl* cursorControl = Device->getCursorControl(); - const core::position2d& mousePos = cursorControl->getPosition (); - RotateHorizontal(Camera, rotationSpeed * (MouseStart.X - mousePos.X)); - RotateAroundAxis(Camera, rotationSpeed * (mousePos.Y - MouseStart.Y), CameraRotationAxis); - MouseStart = mousePos; - } - - // draw everything - video::SColor bkColor( skin->getColor(gui::EGDC_APP_WORKSPACE) ); - videoDriver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, bkColor); - - smgr->drawAll(); - guiEnv->drawAll(); - - if ( MeshMaterialControl->isLightingEnabled() ) - { - // draw a line from the light to the target - video::SMaterial lineMaterial; - lineMaterial.Lighting = false; - videoDriver->setMaterial(lineMaterial); - videoDriver->setTransform(video::ETS_WORLD, core::IdentityMatrix); - videoDriver->draw3DLine(NodeLight->getAbsolutePosition(), SceneNode->getAbsolutePosition()); - } - - videoDriver->endScene(); - } - - // be nice - Device->sleep( 5 ); - - return true; -} - -// Close down the application -void CApp::quit() -{ - IsRunning = false; - - delete LightControl; - LightControl = NULL; - - delete MeshMaterialControl; - MeshMaterialControl = NULL; - - if ( ControlVertexColors ) - { - ControlVertexColors->drop(); - ControlVertexColors = NULL; - } - if ( GlobalAmbient ) - { - GlobalAmbient->drop(); - GlobalAmbient = NULL; - } - if ( Device ) - { - Device->closeDevice(); - Device->drop(); - Device = NULL; - } -} - -// Create some useful textures. -void CApp::createDefaultTextures(video::IVideoDriver * driver) -{ - const u32 width = 256; - const u32 height = 256; - video::IImage * imageA8R8G8B8 = driver->createImage (video::ECF_A8R8G8B8, core::dimension2d(width, height)); - if ( !imageA8R8G8B8 ) - return; - const u32 pitch = imageA8R8G8B8->getPitch(); - - // Some nice square-pattern with 9 typical colors - // Note that the function put readability over speed, you shouldn't use setPixel at runtime but for initialization it's nice. - for ( u32 y = 0; y < height; ++ y ) - { - for ( u32 x = 0; x < pitch; ++x ) - { - if ( y < height/3 ) - { - if ( x < width/3 ) - imageA8R8G8B8->setPixel (x, y, SCOL_BLACK); - else if ( x < 2*width/3 ) - imageA8R8G8B8->setPixel (x, y, SCOL_BLUE); - else - imageA8R8G8B8->setPixel (x, y, SCOL_CYAN); - } - else if ( y < 2*height/3 ) - { - if ( x < width/3 ) - imageA8R8G8B8->setPixel (x, y, SCOL_GRAY); - else if ( x < 2*width/3 ) - imageA8R8G8B8->setPixel (x, y, SCOL_GREEN); - else - imageA8R8G8B8->setPixel (x, y, SCOL_MAGENTA); - } - else - { - if ( x < width/3 ) - imageA8R8G8B8->setPixel (x, y, SCOL_RED); - else if ( x < 2*width/3 ) - imageA8R8G8B8->setPixel (x, y, SCOL_YELLOW); - else - imageA8R8G8B8->setPixel (x, y, SCOL_WHITE); - } - } - } - driver->addTexture (io::path("CARO_A8R8G8B8"), imageA8R8G8B8); - - // all white - imageA8R8G8B8->fill(SCOL_WHITE); - driver->addTexture (io::path("WHITE_A8R8G8B8"), imageA8R8G8B8); - - // all black - imageA8R8G8B8->fill(SCOL_BLACK); - driver->addTexture (io::path("BLACK_A8R8G8B8"), imageA8R8G8B8); - - // gray-scale - for ( u32 y = 0; y < height; ++ y ) - { - for ( u32 x = 0; x < pitch; ++x ) - { - imageA8R8G8B8->setPixel (x, y, video::SColor(y, x,x,x) ); - } - } - driver->addTexture (io::path("GRAYSCALE_A8R8G8B8"), imageA8R8G8B8); - - imageA8R8G8B8->drop(); -} - -// Load a texture and make sure nodes know it when more textures are available. -void CApp::loadTexture(const io::path &name) -{ - Device->getVideoDriver()->getTexture(name); - MeshMaterialControl->updateTextures(); -} - -void CApp::RotateHorizontal(irr::scene::ISceneNode* node, irr::f32 angle) -{ - if ( node ) - { - core::vector3df pos(node->getPosition()); - core::vector2df dir(pos.X, pos.Z); - dir.rotateBy(angle); - pos.X = dir.X; - pos.Z = dir.Y; - node->setPosition(pos); - } -} - -void CApp::RotateAroundAxis(irr::scene::ISceneNode* node, irr::f32 angle, const irr::core::vector3df& axis) -{ - if ( node ) - { - // TOOD: yeah, doesn't rotate around top/bottom yet. Fixes welcome. - core::vector3df pos(node->getPosition()); - core::matrix4 mat; - mat.setRotationAxisRadians (core::degToRad(angle), axis); - mat.rotateVect(pos); - node->setPosition(pos); - } -} - -void CApp::ZoomOut(irr::scene::ISceneNode* node, irr::f32 units) -{ - if ( node ) - { - core::vector3df pos(node->getPosition()); - irr::f32 len = pos.getLength() + units; - pos.setLength(len); - node->setPosition(pos); - } -} - -void CApp::UpdateRotationAxis(irr::scene::ISceneNode* node, irr::core::vector3df& axis) -{ - // Find a perpendicular axis to the x,z vector. If none found (vector straight up/down) continue to use the existing one. - core::vector3df pos(node->getPosition()); - if ( !core::equals(pos.X, 0.f) || !core::equals(pos.Z, 0.f) ) - { - axis.X = -pos.Z; - axis.Z = pos.X; - axis.normalize(); - } -} - -/* - Short main as most is done in classes. -*/ -int main(int argc, char *argv[]) -{ - CApp APP; - - if ( !APP.init(argc, argv) ) - { - printf("init failed\n"); - APP.quit(); - return 1; - } - - APP.setRunning(true); - - /* - main application loop - */ - while(APP.isRunning()) - { - if ( !APP.update() ) - break; - } - - APP.quit(); - - return 0; -} - -/* -**/ diff --git a/examples/22.MaterialViewer/main.h b/examples/22.MaterialViewer/main.h deleted file mode 100644 index 8fabc01d..00000000 --- a/examples/22.MaterialViewer/main.h +++ /dev/null @@ -1,319 +0,0 @@ -#ifndef EXAMPLE22_MATERIAL_VIEWER_MAIN_H -#define EXAMPLE22_MATERIAL_VIEWER_MAIN_H - -#include - -// Helper control to allow setting colors -class CColorControl : public irr::gui::IGUIElement -{ -public: - CColorControl(irr::gui::IGUIEnvironment* guiEnv, const irr::core::position2d & pos, const wchar_t *text, irr::gui::IGUIElement* parent, irr::s32 id=-1); - - // Event receiver - virtual bool OnEvent(const irr::SEvent &event); - - // Set the color values - void setColor(const irr::video::SColor& col); - - // Get the color values - const irr::video::SColor& getColor() const - { - return Color; - } - - // To reset the dirty flag - void resetDirty() - { - DirtyFlag = false; - } - - // when the color was changed the dirty flag is set - bool isDirty() const - { - return DirtyFlag; - }; - -protected: - - // Add a staticbox for a description + an editbox so users can enter numbers - irr::gui::IGUIEditBox* addEditForNumbers(irr::gui::IGUIEnvironment* guiEnv, const irr::core::position2d & pos, const wchar_t *text, irr::s32 id, irr::gui::IGUIElement * parent); - - // Get the color value from the editfields - irr::video::SColor getColorFromEdits() const; - - // Fill the editfields with the value for the given color - void setEditsFromColor(irr::video::SColor col); - -private: - - bool DirtyFlag; - irr::video::SColor Color; - irr::s32 ButtonSetId; - irr::gui::IGUIStaticText * ColorStatic; - irr::gui::IGUIEditBox * EditAlpha; - irr::gui::IGUIEditBox * EditRed; - irr::gui::IGUIEditBox * EditGreen; - irr::gui::IGUIEditBox * EditBlue; -}; - -/* - Custom GUI-control for to edit all colors typically used in materials and lights -*/ -class CTypicalColorsControl : public irr::gui::IGUIElement -{ -public: - // Constructor - CTypicalColorsControl(irr::gui::IGUIEnvironment* guiEnv, const irr::core::position2d & pos, bool hasEmissive, irr::gui::IGUIElement* parent, irr::s32 id=-1); - - // Destructor - virtual ~CTypicalColorsControl(); - - // Set the color values to those within the material - void setColorsToMaterialColors(const irr::video::SMaterial & material); - - // Update all changed colors in the material - void updateMaterialColors(irr::video::SMaterial & material) const; - - // Set the color values to those from the light data - void setColorsToLightDataColors(const irr::video::SLight & lightData); - - // Update all changed colors in the light data - void updateLightColors(irr::video::SLight & lightData) const; - - // To reset the dirty flags - void resetDirty(); - -private: - CColorControl* ControlAmbientColor; - CColorControl* ControlDiffuseColor; - CColorControl* ControlSpecularColor; - CColorControl* ControlEmissiveColor; -}; - -/* - GUI-Control to offer a selection of available textures. -*/ -class CTextureControl : public irr::gui::IGUIElement -{ -public: - CTextureControl(irr::gui::IGUIEnvironment* guiEnv, irr::video::IVideoDriver * driver, const irr::core::position2d & pos, irr::gui::IGUIElement* parent, irr::s32 id=-1); - - virtual bool OnEvent(const irr::SEvent &event); - - // Workaround for a problem with comboboxes. - // We have to get in front when the combobox wants to get in front or combobox-list might be drawn below other elements. - virtual bool bringToFront(irr::gui::IGUIElement* element); - - // Return selected texturename (if any, otherwise 0) - const wchar_t * getSelectedTextureName() const; - - // Change active selectionbased on the texture name - void selectTextureByName(const irr::core::stringw& name); - - // Reset the dirty flag - void resetDirty() - { - DirtyFlag = false; - } - - // When the texture was changed the dirty flag is set - bool isDirty() const - { - return DirtyFlag; - }; - - // Put the names of all currently loaded textures in a combobox - void updateTextures(irr::video::IVideoDriver * driver); - -private: - bool DirtyFlag; - irr::gui::IGUIComboBox * ComboTexture; -}; - -/* - Control which allows setting some of the material values for a meshscenenode -*/ -class CMaterialControl -{ -public: - // constructor - CMaterialControl() - : Initialized(false), Driver(0) - , TypicalColorsControl(0), ButtonLighting(0), InfoLighting(0), ComboMaterial(0) - { - for (irr::u32 i=0; idrop(); - } - if ( TypicalColorsControl ) - TypicalColorsControl->drop(); - } - - void init(irr::scene::IMeshSceneNode* node, irr::IrrlichtDevice * device, const irr::core::position2d & pos, const wchar_t * description); - - void update(irr::scene::IMeshSceneNode* sceneNode, irr::scene::IMeshSceneNode* sceneNode2T, irr::scene::IMeshSceneNode* sceneNodeTangents); - - void updateTextures(); - - void selectTextures(const irr::core::stringw& name); - - bool isLightingEnabled() const; - -protected: - - void updateMaterial(irr::video::SMaterial & material); - - bool Initialized; - irr::video::IVideoDriver * Driver; - CTypicalColorsControl* TypicalColorsControl; - irr::gui::IGUIButton * ButtonLighting; - irr::gui::IGUIStaticText* InfoLighting; - irr::gui::IGUIComboBox * ComboMaterial; - CTextureControl* TextureControls[irr::video::MATERIAL_MAX_TEXTURES]; -}; - -/* - Control to allow setting the color values of a lightscenenode. -*/ -class CLightNodeControl -{ -public: - // constructor - CLightNodeControl() : Initialized(false), TypicalColorsControl(0) - {} - - ~CLightNodeControl() - { - if ( TypicalColorsControl ) - TypicalColorsControl->drop(); - } - - void init(irr::scene::ILightSceneNode* node, irr::gui::IGUIEnvironment* guiEnv, const irr::core::position2d & pos, const wchar_t * description); - - void update(irr::scene::ILightSceneNode* node); - -protected: - bool Initialized; - CTypicalColorsControl* TypicalColorsControl; -}; - -/* - Application configuration -*/ -struct SConfig -{ - SConfig() - : RenderInBackground(true) - , DriverType(irr::video::EDT_NULL) - , ScreenSize(640, 480) - { - } - - bool RenderInBackground; - irr::video::E_DRIVER_TYPE DriverType; - irr::core::dimension2d ScreenSize; -}; - -/* - Main application class -*/ -class CApp : public irr::IEventReceiver -{ - friend int main(int argc, char *argv[]); - -public: - // constructor - CApp() - : IsRunning(false) - , RealTimeTick(0) - , Device(0) - , MeshManipulator(0) - , Camera(0) - , SceneNode(0), SceneNode2T(0), SceneNodeTangents(0), NodeLight(0) - , CameraRotationAxis(irr::core::vector3df(1,0,0)) - , LightRotationAxis(irr::core::vector3df(1,0,0)) - , MeshMaterialControl(0) - , LightControl(0) - , ControlVertexColors(0) - , GlobalAmbient(0) - , MousePressed(false) - { - memset(KeysPressed, 0, sizeof KeysPressed); - } - - // destructor - ~CApp() - { - } - - // Tell it to stop running - void setRunning(bool appRuns) - { - IsRunning = appRuns; - } - - // Check if it should continue running - bool isRunning() const - { - return IsRunning; - } - - // Event handler - virtual bool OnEvent(const irr::SEvent &event); - -protected: - - // Application initialization - // returns true when it was successful initialized, otherwise false. - bool init(int argc, char *argv[]); - - // Update one frame - bool update(); - - // Close down the application - void quit(); - - // Create some useful textures. - void createDefaultTextures(irr::video::IVideoDriver * driver); - - // Load a texture and make sure nodes know it when more textures are available. - void loadTexture(const irr::io::path &name); - - // Rotate a node around the origin (0,0,0) - void RotateHorizontal(irr::scene::ISceneNode* node, irr::f32 angle); - void RotateAroundAxis(irr::scene::ISceneNode* node, irr::f32 angle, const irr::core::vector3df& axis); - void ZoomOut(irr::scene::ISceneNode* node, irr::f32 units); - void UpdateRotationAxis(irr::scene::ISceneNode* node, irr::core::vector3df& axis); - - -private: - SConfig Config; - bool IsRunning; - irr::u32 RealTimeTick; - irr::IrrlichtDevice * Device; - irr::scene::IMeshManipulator* MeshManipulator; - irr::scene::ICameraSceneNode * Camera; - irr::scene::IMeshSceneNode* SceneNode; - irr::scene::IMeshSceneNode* SceneNode2T; - irr::scene::IMeshSceneNode* SceneNodeTangents; - irr::scene::ILightSceneNode* NodeLight; - irr::core::vector3df CameraRotationAxis; - irr::core::vector3df LightRotationAxis; - CMaterialControl* MeshMaterialControl; - CLightNodeControl* LightControl; - CColorControl* ControlVertexColors; - CColorControl* GlobalAmbient; - bool KeysPressed[irr::KEY_KEY_CODES_COUNT]; - bool MousePressed; - irr::core::position2d MouseStart; -}; - -#endif diff --git a/examples/23.SMeshHandling/Makefile b/examples/23.SMeshHandling/Makefile deleted file mode 100644 index 3c7710b7..00000000 --- a/examples/23.SMeshHandling/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 23.SMeshHandling -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/23.SMeshHandling/SMeshHandling.cbp b/examples/23.SMeshHandling/SMeshHandling.cbp deleted file mode 100644 index 920efacc..00000000 --- a/examples/23.SMeshHandling/SMeshHandling.cbp +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - diff --git a/examples/23.SMeshHandling/SMeshHandling.vcproj b/examples/23.SMeshHandling/SMeshHandling.vcproj deleted file mode 100644 index a63d583b..00000000 --- a/examples/23.SMeshHandling/SMeshHandling.vcproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/23.SMeshHandling/SMeshHandling.xcodeproj/project.pbxproj b/examples/23.SMeshHandling/SMeshHandling.xcodeproj/project.pbxproj deleted file mode 100644 index 4382e543..00000000 --- a/examples/23.SMeshHandling/SMeshHandling.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 23.SMeshHandling.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 23.SMeshHandling.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 23.SMeshHandling.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 23.SMeshHandling */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "23.SMeshHandling" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 23.SMeshHandling; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 23.SMeshHandling.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "SMeshHandling" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 23.SMeshHandling */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "SMeshHandling" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "23.SMeshHandling" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/23.SMeshHandling/SMeshHandling.xcodeproj/xcshareddata/xcschemes/23.SMeshHandling.xcscheme b/examples/23.SMeshHandling/SMeshHandling.xcodeproj/xcshareddata/xcschemes/23.SMeshHandling.xcscheme deleted file mode 100644 index 9a7fc357..00000000 --- a/examples/23.SMeshHandling/SMeshHandling.xcodeproj/xcshareddata/xcschemes/23.SMeshHandling.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj b/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj deleted file mode 100644 index 949f1ce6..00000000 --- a/examples/23.SMeshHandling/SMeshHandling_vc10.vcxproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 23.SMeshHandling - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7} - 23.SMeshHandling - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj b/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj deleted file mode 100644 index 83332f4d..00000000 --- a/examples/23.SMeshHandling/SMeshHandling_vc11.vcxproj +++ /dev/null @@ -1,192 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 23.SMeshHandling - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7} - 23.SMeshHandling - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/23.SMeshHandling/SMeshHandling_vc12.vcxproj b/examples/23.SMeshHandling/SMeshHandling_vc12.vcxproj deleted file mode 100644 index 46b2382c..00000000 --- a/examples/23.SMeshHandling/SMeshHandling_vc12.vcxproj +++ /dev/null @@ -1,192 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 23.SMeshHandling - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7} - 23.SMeshHandling - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/23.SMeshHandling/SMeshHandling_vc14.vcxproj b/examples/23.SMeshHandling/SMeshHandling_vc14.vcxproj deleted file mode 100644 index 6c9b712b..00000000 --- a/examples/23.SMeshHandling/SMeshHandling_vc14.vcxproj +++ /dev/null @@ -1,192 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 23.SMeshHandling - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7} - 23.SMeshHandling - Win32Proj - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - true - true - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - false - false - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)SMeshHandling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\23.SMeshHandling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/23.SMeshHandling/main.cpp b/examples/23.SMeshHandling/main.cpp deleted file mode 100644 index a4ef9ebc..00000000 --- a/examples/23.SMeshHandling/main.cpp +++ /dev/null @@ -1,426 +0,0 @@ -/** Example 023 SMeshBufferHandling - -A tutorial by geoff. - -In this tutorial we'll learn how to create custom meshes and deal with them -with Irrlicht. We'll create an interesting heightmap with some lighting effects. -With keys 1,2,3 you can choose a different mesh layout, which is put into the -mesh buffers as desired. All positions, normals, etc. are updated accordingly. - -Ok, let's start with the headers (I think there's nothing to say about it) -*/ - -#include -#include "driverChoice.h" - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -//Namespaces for the engine -using namespace irr; -using namespace video; -using namespace core; -using namespace scene; -using namespace io; -using namespace gui; - -/* This is the type of the functions which work out the colour. */ -typedef SColor colour_func(f32 x, f32 y, f32 z); - -/* Here comes a set of functions which can be used for coloring the nodes while -creating the mesh. */ - -// Greyscale, based on the height. -SColor grey(f32, f32, f32 z) -{ - u32 n = (u32)(255.f * z); - return SColor(255, n, n, n); -} - -// Interpolation between blue and white, with red added in one -// direction and green in the other. -SColor yellow(f32 x, f32 y, f32) -{ - return SColor(255, 128 + (u32)(127.f * x), 128 + (u32)(127.f * y), 255); -} - -// Pure white. -SColor white(f32, f32, f32) { return SColor(255, 255, 255, 255); } - -/* The type of the functions which generate the heightmap. x and y -range between -0.5 and 0.5, and s is the scale of the heightmap. */ - -typedef f32 generate_func(s16 x, s16 y, f32 s); - -// An interesting sample function :-) -f32 eggbox(s16 x, s16 y, f32 s) -{ - const f32 r = 4.f*sqrtf((f32)(x*x + y*y))/s; - const f32 z = (f32)exp(-r * 2) * (cosf(0.2f * x) + cosf(0.2f * y)); - return 0.25f+0.25f*z; -} - -// A rather dumb sine function :-/ -f32 moresine(s16 x, s16 y, f32 s) -{ - const f32 xx=0.3f*(f32)x/s; - const f32 yy=12*y/s; - const f32 z = sinf(xx*xx+yy)*sinf(xx+yy*yy); - return 0.25f + 0.25f * z; -} - -// A simple function -f32 justexp(s16 x, s16 y, f32 s) -{ - const f32 xx=6*x/s; - const f32 yy=6*y/s; - const f32 z = (xx*xx+yy*yy); - return 0.3f*z*cosf(xx*yy); -} - -/* A simple class for representing heightmaps. Most of this should be obvious. */ - -class HeightMap -{ -private: - const u16 Width; - const u16 Height; - f32 s; - core::array data; -public: - HeightMap(u16 _w, u16 _h) : Width(_w), Height(_h), s(0.f), data(0) - { - s = sqrtf((f32)(Width * Width + Height * Height)); - data.set_used(Width * Height); - } - - // Fill the heightmap with values generated from f. - void generate(generate_func f) - { - u32 i=0; - for(u16 y = 0; y < Height; ++y) - for(u16 x = 0; x < Width; ++x) - set(i++, calc(f, x, y)); - } - - u16 height() const { return Height; } - u16 width() const { return Width; } - - f32 calc(generate_func f, u16 x, u16 y) const - { - const f32 xx = (f32)x - Width*0.5f; - const f32 yy = (f32)y - Height*0.5f; - return f((u16)xx, (u16)yy, s); - } - - // The height at (x, y) is at position y * Width + x. - - void set(u16 x, u16 y, f32 z) { data[y * Width + x] = z; } - void set(u32 i, f32 z) { data[i] = z; } - f32 get(u16 x, u16 y) const { return data[y * Width + x]; } - - /* The only difficult part. This considers the normal at (x, y) to - be the cross product of the vectors between the adjacent points - in the horizontal and vertical directions. - - s is a scaling factor, which is necessary if the height units are - different from the coordinate units; for example, if your map has - heights in meters and the coordinates are in units of a - kilometer. */ - - vector3df getnormal(u16 x, u16 y, f32 s) const - { - const f32 zc = get(x, y); - f32 zl, zr, zu, zd; - - if (x == 0) - { - zr = get(x + 1, y); - zl = zc + zc - zr; - } - else if (x == Width - 1) - { - zl = get(x - 1, y); - zr = zc + zc - zl; - } - else - { - zr = get(x + 1, y); - zl = get(x - 1, y); - } - - if (y == 0) - { - zd = get(x, y + 1); - zu = zc + zc - zd; - } - else if (y == Height - 1) - { - zu = get(x, y - 1); - zd = zc + zc - zu; - } - else - { - zd = get(x, y + 1); - zu = get(x, y - 1); - } - - return vector3df(s * 2 * (zl - zr), 4, s * 2 * (zd - zu)).normalize(); - } -}; - -/* A class which generates a mesh from a heightmap. */ -class TMesh -{ -private: - u16 Width; - u16 Height; - f32 Scale; -public: - SMesh* Mesh; - - TMesh() : Width(0), Height(0), Scale(1.f), Mesh(0) - { - Mesh = new SMesh(); - } - - ~TMesh() - { - Mesh->drop(); - } - - // Unless the heightmap is small, it won't all fit into a single - // SMeshBuffer. This function chops it into pieces and generates a - // buffer from each one. - - void init(const HeightMap &hm, f32 scale, colour_func cf, IVideoDriver *driver) - { - Scale = scale; - - const u32 mp = driver -> getMaximalPrimitiveCount(); - Width = hm.width(); - Height = hm.height(); - - const u32 sw = mp / (6 * Height); // the width of each piece - - u32 i=0; - for(u32 y0 = 0; y0 < Height; y0 += sw) - { - u16 y1 = y0 + sw; - if (y1 >= Height) - y1 = Height - 1; // the last one might be narrower - addstrip(hm, cf, y0, y1, i); - ++i; - } - if (igetMeshBufferCount()) - { - // clear the rest - for (u32 j=i; jgetMeshBufferCount(); ++j) - { - Mesh->getMeshBuffer(j)->drop(); - } - Mesh->MeshBuffers.erase(i,Mesh->getMeshBufferCount()-i); - } - // set dirty flag to make sure that hardware copies of this - // buffer are also updated, see IMesh::setHardwareMappingHint - Mesh->setDirty(); - Mesh->recalculateBoundingBox(); - } - - // Generate a SMeshBuffer which represents all the vertices and - // indices for values of y between y0 and y1, and add it to the - // mesh. - - void addstrip(const HeightMap &hm, colour_func cf, u16 y0, u16 y1, u32 bufNum) - { - SMeshBuffer *buf = 0; - if (bufNumgetMeshBufferCount()) - { - buf = (SMeshBuffer*)Mesh->getMeshBuffer(bufNum); - } - else - { - // create new buffer - buf = new SMeshBuffer(); - Mesh->addMeshBuffer(buf); - // to simplify things we drop here but continue using buf - buf->drop(); - } - buf->Vertices.set_used((1 + y1 - y0) * Width); - - u32 i=0; - for (u16 y = y0; y <= y1; ++y) - { - for (u16 x = 0; x < Width; ++x) - { - const f32 z = hm.get(x, y); - const f32 xx = (f32)x/(f32)Width; - const f32 yy = (f32)y/(f32)Height; - - S3DVertex& v = buf->Vertices[i++]; - v.Pos.set(x, Scale * z, y); - v.Normal.set(hm.getnormal(x, y, Scale)); - v.Color=cf(xx, yy, z); - v.TCoords.set(xx, yy); - } - } - - buf->Indices.set_used(6 * (Width - 1) * (y1 - y0)); - i=0; - for(u16 y = y0; y < y1; ++y) - { - for(u16 x = 0; x < Width - 1; ++x) - { - const u16 n = (y-y0) * Width + x; - buf->Indices[i]=n; - buf->Indices[++i]=n + Width; - buf->Indices[++i]=n + Width + 1; - buf->Indices[++i]=n + Width + 1; - buf->Indices[++i]=n + 1; - buf->Indices[++i]=n; - ++i; - } - } - - buf->recalculateBoundingBox(); - } -}; - -/* -Our event receiver implementation, taken from tutorial 4. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - // This is the one method that we have to implement - virtual bool OnEvent(const SEvent& event) - { - // Remember whether each key is down or up - if (event.EventType == irr::EET_KEY_INPUT_EVENT) - KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown; - - return false; - } - - // This is used to check whether a key is being held down - virtual bool IsKeyDown(EKEY_CODE keyCode) const - { - return KeyIsDown[keyCode]; - } - - MyEventReceiver() - { - for (u32 i=0; igetVideoDriver(); - ISceneManager *smgr = device->getSceneManager(); - device->setWindowCaption(L"Irrlicht Example for SMesh usage."); - - /* - Create the custom mesh and initialize with a heightmap - */ - TMesh mesh; - HeightMap hm = HeightMap(255, 255); - hm.generate(eggbox); - mesh.init(hm, 50.f, grey, driver); - - // Add the mesh to the scene graph - IMeshSceneNode* meshnode = smgr -> addMeshSceneNode(mesh.Mesh); - meshnode->setMaterialFlag(video::EMF_BACK_FACE_CULLING, false); - - // light is just for nice effects - ILightSceneNode *node = smgr->addLightSceneNode(0, vector3df(0,100,0), - SColorf(1.0f, 0.6f, 0.7f, 1.0f), 500.0f); - if (node) - { - node->getLightData().Attenuation.set(0.f, 1.f/500.f, 0.f); - ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(vector3df(0,150,0),250.0f); - if (anim) - { - node->addAnimator(anim); - anim->drop(); - } - } - - ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(); - if (camera) - { - camera->setPosition(vector3df(-20.f, 150.f, -20.f)); - camera->setTarget(vector3df(200.f, -80.f, 150.f)); - camera->setFarValue(20000.0f); - } - - /* - Just a usual render loop with event handling. The custom mesh is - a usual part of the scene graph which gets rendered by drawAll. - */ - while(device->run()) - { - if(!device->isWindowActive()) - { - device->sleep(100); - continue; - } - - if(receiver.IsKeyDown(irr::KEY_KEY_W)) - { - meshnode->setMaterialFlag(video::EMF_WIREFRAME, !meshnode->getMaterial(0).Wireframe); - } - else if(receiver.IsKeyDown(irr::KEY_KEY_1)) - { - hm.generate(eggbox); - mesh.init(hm, 50.f, grey, driver); - } - else if(receiver.IsKeyDown(irr::KEY_KEY_2)) - { - hm.generate(moresine); - mesh.init(hm, 50.f, yellow, driver); - } - else if(receiver.IsKeyDown(irr::KEY_KEY_3)) - { - hm.generate(justexp); - mesh.init(hm, 50.f, yellow, driver); - } - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0xff000000)); - smgr->drawAll(); - driver->endScene(); - } - - device->drop(); - - return 0; -} - -/* -That's it! Just compile and play around with the program. -**/ diff --git a/examples/24.CursorControl/CursorControl.cbp b/examples/24.CursorControl/CursorControl.cbp deleted file mode 100644 index b8aa231f..00000000 --- a/examples/24.CursorControl/CursorControl.cbp +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - diff --git a/examples/24.CursorControl/CursorControl.vcproj b/examples/24.CursorControl/CursorControl.vcproj deleted file mode 100644 index 1bc2f531..00000000 --- a/examples/24.CursorControl/CursorControl.vcproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/24.CursorControl/CursorControl.xcodeproj/project.pbxproj b/examples/24.CursorControl/CursorControl.xcodeproj/project.pbxproj deleted file mode 100644 index 2000a263..00000000 --- a/examples/24.CursorControl/CursorControl.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 24.CursorControl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 24.CursorControl.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 24.CursorControl.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 24.CursorControl */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "24.CursorControl" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 24.CursorControl; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 24.CursorControl.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "CursorControl" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 24.CursorControl */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "CursorControl" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "24.CursorControl" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/24.CursorControl/CursorControl.xcodeproj/xcshareddata/xcschemes/24.CursorControl.xcscheme b/examples/24.CursorControl/CursorControl.xcodeproj/xcshareddata/xcschemes/24.CursorControl.xcscheme deleted file mode 100644 index 2bf741e7..00000000 --- a/examples/24.CursorControl/CursorControl.xcodeproj/xcshareddata/xcschemes/24.CursorControl.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/24.CursorControl/CursorControl_vc10.vcxproj b/examples/24.CursorControl/CursorControl_vc10.vcxproj deleted file mode 100644 index 913c520a..00000000 --- a/examples/24.CursorControl/CursorControl_vc10.vcxproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 24.CursorControl - {02B67A37-50E1-49DB-BECF-905BC029C2FE} - 24.CursorControl - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/24.CursorControl/CursorControl_vc11.vcxproj b/examples/24.CursorControl/CursorControl_vc11.vcxproj deleted file mode 100644 index 7eadc6f1..00000000 --- a/examples/24.CursorControl/CursorControl_vc11.vcxproj +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 24.CursorControl - {02B67A37-50E1-49DB-BECF-905BC029C2FE} - 24.CursorControl - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/24.CursorControl/CursorControl_vc12.vcxproj b/examples/24.CursorControl/CursorControl_vc12.vcxproj deleted file mode 100644 index 26fdf871..00000000 --- a/examples/24.CursorControl/CursorControl_vc12.vcxproj +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 24.CursorControl - {02B67A37-50E1-49DB-BECF-905BC029C2FE} - 24.CursorControl - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/24.CursorControl/CursorControl_vc14.vcxproj b/examples/24.CursorControl/CursorControl_vc14.vcxproj deleted file mode 100644 index 40a0a88e..00000000 --- a/examples/24.CursorControl/CursorControl_vc14.vcxproj +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 24.CursorControl - {02B67A37-50E1-49DB-BECF-905BC029C2FE} - 24.CursorControl - Win32Proj - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)CursorControl.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\24.CursorControl.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\24.CursorControl.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/24.CursorControl/Makefile b/examples/24.CursorControl/Makefile deleted file mode 100644 index f30f3701..00000000 --- a/examples/24.CursorControl/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 24.CursorControl -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/24.CursorControl/main.cpp b/examples/24.CursorControl/main.cpp deleted file mode 100644 index 22c22cb7..00000000 --- a/examples/24.CursorControl/main.cpp +++ /dev/null @@ -1,566 +0,0 @@ -/** Example 024 CursorControl - -Show how to modify cursors and offer some useful tool-functions for creating cursors. -It can also be used for experiments with the mouse in general. -*/ - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -const int DELAY_TIME = 3000; - -enum ETimerAction -{ - ETA_MOUSE_VISIBLE, - ETA_MOUSE_INVISIBLE, -}; - -/* - Structure to allow delayed execution of some actions. -*/ -struct TimerAction -{ - u32 TargetTime; - ETimerAction Action; -}; - -/* -*/ -struct SAppContext -{ - SAppContext() - : Device(0), InfoStatic(0), EventBox(0), CursorBox(0), SpriteBox(0) - , ButtonSetVisible(0), ButtonSetInvisible(0), ButtonSimulateBadFps(0) - , ButtonChangeIcon(0) - , SimulateBadFps(false) - { - } - - void update() - { - if (!Device) - return; - u32 timeNow = Device->getTimer()->getTime(); - for ( u32 i=0; i < TimerActions.size(); ++i ) - { - if ( timeNow >= TimerActions[i].TargetTime ) - { - runTimerAction(TimerActions[i]); - TimerActions.erase(i); - } - else - { - ++i; - } - } - } - - void runTimerAction(const TimerAction& action) - { - if (ETA_MOUSE_VISIBLE == action.Action) - { - Device->getCursorControl()->setVisible(true); - ButtonSetVisible->setEnabled(true); - } - else if ( ETA_MOUSE_INVISIBLE == action.Action) - { - Device->getCursorControl()->setVisible(false); - ButtonSetInvisible->setEnabled(true); - } - } - - /* - Add another icon which the user can click and select as cursor later on. - */ - void addIcon(const stringw& name, const SCursorSprite &sprite, bool addCursor=true) - { - // Sprites are just icons - not yet cursors. They can be displayed by Irrlicht sprite functions and be used to create cursors. - SpriteBox->addItem(name.c_str(), sprite.SpriteId); - Sprites.push_back(sprite); - - // create the cursor together with the icon? - if ( addCursor ) - { - /* Here we create a hardware cursor from a sprite */ - Device->getCursorControl()->addIcon(sprite); - - // ... and add it to the cursors selection listbox to the other system cursors. - CursorBox->addItem(name.c_str()); - } - } - - IrrlichtDevice * Device; - gui::IGUIStaticText * InfoStatic; - gui::IGUIListBox * EventBox; - gui::IGUIListBox * CursorBox; - gui::IGUIListBox * SpriteBox; - gui::IGUIButton * ButtonSetVisible; - gui::IGUIButton * ButtonSetInvisible; - gui::IGUIButton * ButtonSimulateBadFps; - gui::IGUIButton * ButtonChangeIcon; - array TimerActions; - bool SimulateBadFps; - array Sprites; -}; - -/* - Helper function to print mouse event names into a stringw -*/ -void PrintMouseEventName(const SEvent& event, stringw &result) -{ - switch ( event.MouseInput.Event ) - { - case EMIE_LMOUSE_PRESSED_DOWN: result += stringw(L"EMIE_LMOUSE_PRESSED_DOWN"); break; - case EMIE_RMOUSE_PRESSED_DOWN: result += stringw(L"EMIE_RMOUSE_PRESSED_DOWN"); break; - case EMIE_MMOUSE_PRESSED_DOWN: result += stringw(L"EMIE_MMOUSE_PRESSED_DOWN"); break; - case EMIE_LMOUSE_LEFT_UP: result += stringw(L"EMIE_LMOUSE_LEFT_UP"); break; - case EMIE_RMOUSE_LEFT_UP: result += stringw(L"EMIE_RMOUSE_LEFT_UP"); break; - case EMIE_MMOUSE_LEFT_UP: result += stringw(L"EMIE_MMOUSE_LEFT_UP"); break; - case EMIE_MOUSE_MOVED: result += stringw(L"EMIE_MOUSE_MOVED"); break; - case EMIE_MOUSE_WHEEL: result += stringw(L"EMIE_MOUSE_WHEEL"); break; - case EMIE_LMOUSE_DOUBLE_CLICK: result += stringw(L"EMIE_LMOUSE_DOUBLE_CLICK"); break; - case EMIE_RMOUSE_DOUBLE_CLICK: result += stringw(L"EMIE_RMOUSE_DOUBLE_CLICK"); break; - case EMIE_MMOUSE_DOUBLE_CLICK: result += stringw(L"EMIE_MMOUSE_DOUBLE_CLICK"); break; - case EMIE_LMOUSE_TRIPLE_CLICK: result += stringw(L"EMIE_LMOUSE_TRIPLE_CLICK"); break; - case EMIE_RMOUSE_TRIPLE_CLICK: result += stringw(L"EMIE_RMOUSE_TRIPLE_CLICK"); break; - case EMIE_MMOUSE_TRIPLE_CLICK: result += stringw(L"EMIE_MMOUSE_TRIPLE_CLICK"); break; - default: - break; - } -} - -/* - Helper function to print all the state information which get from a mouse-event into a stringw -*/ -void PrintMouseState(const SEvent& event, stringw &result) -{ - result += stringw(L"X: "); - result += stringw(event.MouseInput.X); - result += stringw(L"\n"); - - result += stringw(L"Y: "); - result += stringw(event.MouseInput.Y); - result += stringw(L"\n"); - - - result += stringw(L"Wheel: "); - result += stringw(event.MouseInput.Wheel); - result += stringw(L"\n"); - - result += stringw(L"Shift: "); - if ( event.MouseInput.Shift ) - result += stringw(L"true\n"); - else - result += stringw(L"false\n"); - - result += stringw(L"Control: "); - if ( event.MouseInput.Control ) - result += stringw(L"true\n"); - else - result += stringw(L"false\n"); - - result += stringw(L"ButtonStates: "); - result += stringw(event.MouseInput.ButtonStates); - result += stringw(L"\n"); - - result += stringw(L"isLeftPressed: "); - if ( event.MouseInput.isLeftPressed() ) - result += stringw(L"true\n"); - else - result += stringw(L"false\n"); - - result += stringw(L"isRightPressed: "); - if ( event.MouseInput.isRightPressed() ) - result += stringw(L"true\n"); - else - result += stringw(L"false\n"); - - result += stringw(L"isMiddlePressed: "); - if ( event.MouseInput.isMiddlePressed() ) - result += stringw(L"true\n"); - else - result += stringw(L"false\n"); - - result += stringw(L"Event: "); - - PrintMouseEventName(event, result); - - result += stringw(L"\n"); -} - -/* - A typical event receiver. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - MyEventReceiver(SAppContext & context) : Context(context) { } - - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_GUI_EVENT ) - { - switch ( event.GUIEvent.EventType ) - { - case EGET_BUTTON_CLICKED: - { - u32 timeNow = Context.Device->getTimer()->getTime(); - TimerAction action; - action.TargetTime = timeNow + DELAY_TIME; - if ( event.GUIEvent.Caller == Context.ButtonSetVisible ) - { - action.Action = ETA_MOUSE_VISIBLE; - Context.TimerActions.push_back(action); - Context.ButtonSetVisible->setEnabled(false); - } - else if ( event.GUIEvent.Caller == Context.ButtonSetInvisible ) - { - action.Action = ETA_MOUSE_INVISIBLE; - Context.TimerActions.push_back(action); - Context.ButtonSetInvisible->setEnabled(false); - } - else if ( event.GUIEvent.Caller == Context.ButtonSimulateBadFps ) - { - Context.SimulateBadFps = Context.ButtonSimulateBadFps->isPressed(); - } - else if ( event.GUIEvent.Caller == Context.ButtonChangeIcon ) - { - /* - Replace an existing cursor icon by another icon. - The user has to select both - the icon which should be replaced and the icon which will replace it. - */ - s32 selectedCursor = Context.CursorBox->getSelected(); - s32 selectedSprite = Context.SpriteBox->getSelected(); - if ( selectedCursor >= 0 && selectedSprite >= 0 ) - { - /* - This does replace the icon. - */ - Context.Device->getCursorControl()->changeIcon((ECURSOR_ICON)selectedCursor, Context.Sprites[selectedSprite] ); - - /* - Do also show the new icon. - */ - Context.Device->getCursorControl()->setActiveIcon( ECURSOR_ICON(selectedCursor) ); - } - } - } - break; - case EGET_LISTBOX_CHANGED: - case EGET_LISTBOX_SELECTED_AGAIN: - { - if ( event.GUIEvent.Caller == Context.CursorBox ) - { - /* - Find out which cursor the user selected - */ - s32 selected = Context.CursorBox->getSelected(); - if ( selected >= 0 ) - { - /* - Here we set the new cursor icon which will now be used within our window. - */ - Context.Device->getCursorControl()->setActiveIcon( ECURSOR_ICON(selected) ); - } - } - } - break; - default: - break; - } - } - - if (event.EventType == EET_MOUSE_INPUT_EVENT) - { - stringw infoText; - PrintMouseState(event, infoText); - Context.InfoStatic->setText(infoText.c_str()); - if ( event.MouseInput.Event != EMIE_MOUSE_MOVED && event.MouseInput.Event != EMIE_MOUSE_WHEEL ) // no spam - { - infoText = L""; - PrintMouseEventName(event, infoText); - Context.EventBox->insertItem(0, infoText.c_str(), -1); - } - } - - return false; - } - -private: - SAppContext & Context; -}; - -/* - Use several imagefiles as animation frames for a sprite which can be used as cursor icon. - The images in those files all need to have the same size. - Return sprite index on success or -1 on failure -*/ -s32 AddAnimatedIconToSpriteBank( gui::IGUISpriteBank * spriteBank, video::IVideoDriver* driver, const array< io::path >& files, u32 frameTime ) -{ - if ( !spriteBank || !driver || !files.size() ) - return -1; - - video::ITexture * tex = driver->getTexture( files[0] ); - if ( tex ) - { - array< rect >& spritePositions = spriteBank->getPositions(); - u32 idxRect = spritePositions.size(); - spritePositions.push_back( rect(0,0, tex->getSize().Width, tex->getSize().Height) ); - - SGUISprite sprite; - sprite.frameTime = frameTime; - - array< SGUISprite >& sprites = spriteBank->getSprites(); - u32 startIdx = spriteBank->getTextureCount(); - for ( u32 f=0; f < files.size(); ++f ) - { - tex = driver->getTexture( files[f] ); - if ( tex ) - { - spriteBank->addTexture( driver->getTexture(files[f]) ); - gui::SGUISpriteFrame frame; - frame.rectNumber = idxRect; - frame.textureNumber = startIdx+f; - sprite.Frames.push_back( frame ); - } - } - - sprites.push_back( sprite ); - return sprites.size()-1; - } - - return -1; -} - -/* - Use several images within one imagefile as animation frames for a sprite which can be used as cursor icon - The sizes of the icons within that file all need to have the same size - Return sprite index on success or -1 on failure -*/ -s32 AddAnimatedIconToSpriteBank( gui::IGUISpriteBank * spriteBank, video::IVideoDriver* driver, const io::path& file, const array< rect >& rects, u32 frameTime ) -{ - if ( !spriteBank || !driver || !rects.size() ) - return -1; - - video::ITexture * tex = driver->getTexture( file ); - if ( tex ) - { - array< rect >& spritePositions = spriteBank->getPositions(); - u32 idxRect = spritePositions.size(); - u32 idxTex = spriteBank->getTextureCount(); - spriteBank->addTexture( tex ); - - SGUISprite sprite; - sprite.frameTime = frameTime; - - array< SGUISprite >& sprites = spriteBank->getSprites(); - for ( u32 i=0; i < rects.size(); ++i ) - { - spritePositions.push_back( rects[i] ); - - gui::SGUISpriteFrame frame; - frame.rectNumber = idxRect+i; - frame.textureNumber = idxTex; - sprite.Frames.push_back( frame ); - } - - sprites.push_back( sprite ); - return sprites.size()-1; - } - - return -1; -} - -/* - Create a non-animated icon from the given file and position and put it into the spritebank. - We can use this icon later on in a cursor. -*/ -s32 AddIconToSpriteBank( gui::IGUISpriteBank * spriteBank, video::IVideoDriver* driver, const io::path& file, const core::rect& rect ) -{ - if ( !spriteBank || !driver ) - return -1; - - video::ITexture * tex = driver->getTexture( file ); - if ( tex ) - { - core::array< core::rect >& spritePositions = spriteBank->getPositions(); - spritePositions.push_back( rect ); - array< SGUISprite >& sprites = spriteBank->getSprites(); - spriteBank->addTexture( tex ); - - gui::SGUISpriteFrame frame; - frame.rectNumber = spritePositions.size()-1; - frame.textureNumber = spriteBank->getTextureCount()-1; - - SGUISprite sprite; - sprite.frameTime = 0; - sprite.Frames.push_back( frame ); - - sprites.push_back( sprite ); - - return sprites.size()-1; - } - - return -1; -} - -int main() -{ - video::E_DRIVER_TYPE driverType = driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - IrrlichtDevice * device = createDevice(driverType, dimension2d(640, 480)); - if (device == 0) - return 1; // could not create selected driver. - - // It's sometimes of interest to know how the mouse behaves after a resize - device->setResizable(true); - - device->setWindowCaption(L"Cursor control - Irrlicht engine tutorial"); - video::IVideoDriver* driver = device->getVideoDriver(); - IGUIEnvironment* env = device->getGUIEnvironment(); - - gui::IGUISpriteBank * SpriteBankIcons; - - SAppContext context; - context.Device = device; - - rect< s32 > rectInfoStatic(10,10, 200, 200); - env->addStaticText (L"Cursor state information", rectInfoStatic, true, true); - rectInfoStatic.UpperLeftCorner += dimension2di(0, 15); - context.InfoStatic = env->addStaticText (L"", rectInfoStatic, true, true); - rect< s32 > rectEventBox(10,210, 200, 400); - env->addStaticText (L"click events (new on top)", rectEventBox, true, true); - rectEventBox.UpperLeftCorner += dimension2di(0, 15); - context.EventBox = env->addListBox(rectEventBox); - rect< s32 > rectCursorBox(210,10, 400, 250); - env->addStaticText (L"cursors, click to set the active one", rectCursorBox, true, true); - rectCursorBox.UpperLeftCorner += dimension2di(0, 15); - context.CursorBox = env->addListBox(rectCursorBox); - rect< s32 > rectSpriteBox(210,260, 400, 400); - env->addStaticText (L"sprites", rectSpriteBox, true, true); - rectSpriteBox.UpperLeftCorner += dimension2di(0, 15); - context.SpriteBox = env->addListBox(rectSpriteBox); - - context.ButtonSetVisible = env->addButton( rect( 410, 20, 560, 40 ), 0, -1, L"set visible (delayed)" ); - context.ButtonSetInvisible = env->addButton( rect( 410, 50, 560, 70 ), 0, -1, L"set invisible (delayed)" ); - context.ButtonSimulateBadFps = env->addButton( rect( 410, 80, 560, 100 ), 0, -1, L"simulate bad FPS" ); - context.ButtonSimulateBadFps->setIsPushButton(true); - context.ButtonChangeIcon = env->addButton( rect( 410, 140, 560, 160 ), 0, -1, L"replace cursor icon\n(cursor+sprite must be selected)" ); - - // set the names for all the system cursors - for ( int i=0; i < (int)gui::ECI_COUNT; ++i ) - { - context.CursorBox->addItem(stringw( GUICursorIconNames[i] ).c_str()); - } - - /* - Create sprites which then can be used as cursor icons. - */ - SpriteBankIcons = env->addEmptySpriteBank(io::path("cursor_icons")); - context.SpriteBox->setSpriteBank(SpriteBankIcons); - - const io::path mediaPath = getExampleMediaPath(); - - // create one animated icon from several files - array< io::path > files; - files.push_back( io::path(mediaPath + "icon_crosshairs16x16bw1.png") ); - files.push_back( io::path(mediaPath + "icon_crosshairs16x16bw2.png") ); - files.push_back( io::path(mediaPath + "icon_crosshairs16x16bw3.png") ); - files.push_back( io::path(mediaPath + "icon_crosshairs16x16bw3.png") ); - files.push_back( io::path(mediaPath + "icon_crosshairs16x16bw2.png") ); - SCursorSprite spriteBw; // the sprite + some additional information needed for cursors - spriteBw.SpriteId = AddAnimatedIconToSpriteBank( SpriteBankIcons, driver, files, 200 ); - spriteBw.SpriteBank = SpriteBankIcons; - spriteBw.HotSpot = position2d(7,7); - context.addIcon(L"crosshair_bw", spriteBw); - - // create one animated icon from one file - array< rect > iconRects; - iconRects.push_back( rect(0,0, 16, 16) ); - iconRects.push_back( rect(16,0, 32, 16) ); - iconRects.push_back( rect(0,16, 16, 32) ); - iconRects.push_back( rect(0,16, 16, 32) ); - iconRects.push_back( rect(16,0, 32, 16) ); - SCursorSprite spriteCol; // the sprite + some additional information needed for cursors - spriteCol.SpriteId = AddAnimatedIconToSpriteBank( SpriteBankIcons, driver, io::path(mediaPath + "icon_crosshairs16x16col.png"), iconRects, 200 ); - spriteCol.HotSpot = position2d(7,7); - spriteCol.SpriteBank = SpriteBankIcons; - context.addIcon(L"crosshair_colored", spriteCol); - - // Create some non-animated icons - rect rectIcon; - SCursorSprite spriteNonAnimated(SpriteBankIcons, 0, position2d(7,7)); - - rectIcon = rect(0,0, 16, 16); - spriteNonAnimated.SpriteId = AddIconToSpriteBank( SpriteBankIcons, driver, io::path(mediaPath + "icon_crosshairs16x16col.png"), rectIcon ); - context.addIcon(L"crosshair_col1", spriteNonAnimated, false); - - rectIcon = rect(16,0, 32, 16); - spriteNonAnimated.SpriteId = AddIconToSpriteBank( SpriteBankIcons, driver, io::path(mediaPath + "icon_crosshairs16x16col.png"), rectIcon ); - context.addIcon(L"crosshair_col2", spriteNonAnimated, false); - - rectIcon = rect(0,16, 16, 32); - spriteNonAnimated.SpriteId = AddIconToSpriteBank( SpriteBankIcons, driver, io::path(mediaPath + "icon_crosshairs16x16col.png"), rectIcon ); - context.addIcon(L"crosshair_col3", spriteNonAnimated, false); - - - MyEventReceiver receiver(context); - device->setEventReceiver(&receiver); - - while(device->run() && driver) - { - // if (device->isWindowActive()) - { - u32 realTimeNow = device->getTimer()->getRealTime(); - - context.update(); - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,200,200,200)); - - env->drawAll(); - - // draw custom sprite with Irrlicht functions for comparison. It should usually look the same as the cursors. - if ( context.SpriteBox ) - { - s32 selectedSprite = context.SpriteBox->getSelected(); - if ( selectedSprite >= 0 && context.Sprites[selectedSprite].SpriteId >= 0 ) - { - SpriteBankIcons->draw2DSprite(u32(context.Sprites[selectedSprite].SpriteId), position2di(580, 140), 0, video::SColor(255, 255, 255, 255), 0, realTimeNow); - } - } - - driver->endScene(); - } - - // By simulating bad fps we can find out if hardware-support for cursors works or not. If it works the cursor will move as usual,while it otherwise will just update with 2 fps now. - if ( context.SimulateBadFps ) - { - device->sleep(500); // 2 fps - } - else - { - device->sleep(10); - } - } - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/26.OcclusionQuery/Makefile b/examples/26.OcclusionQuery/Makefile deleted file mode 100644 index b01efd30..00000000 --- a/examples/26.OcclusionQuery/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 26.OcclusionQuery -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/26.OcclusionQuery/OcclusionQuery.cbp b/examples/26.OcclusionQuery/OcclusionQuery.cbp deleted file mode 100644 index 09587e5d..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/26.OcclusionQuery/OcclusionQuery.vcproj b/examples/26.OcclusionQuery/OcclusionQuery.vcproj deleted file mode 100644 index 602f2d3d..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery.vcproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/project.pbxproj b/examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/project.pbxproj deleted file mode 100644 index 26ea259a..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 26.OcclusionQuery.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 26.OcclusionQuery.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 26.OcclusionQuery.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 26.OcclusionQuery */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "26.OcclusionQuery" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 26.OcclusionQuery; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 26.OcclusionQuery.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "OcclusionQuery" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 26.OcclusionQuery */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "OcclusionQuery" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "26.OcclusionQuery" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/xcshareddata/xcschemes/26.OcclusionQuery.xcscheme b/examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/xcshareddata/xcschemes/26.OcclusionQuery.xcscheme deleted file mode 100644 index 3004daa8..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery.xcodeproj/xcshareddata/xcschemes/26.OcclusionQuery.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/26.OcclusionQuery/OcclusionQuery_vc10.vcxproj b/examples/26.OcclusionQuery/OcclusionQuery_vc10.vcxproj deleted file mode 100644 index 370d3683..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery_vc10.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 26.OcclusionQuery - {5CE0E2E7-879D-4152-B61D-24E7D0707B45} - OcclusionQuery - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/26.OcclusionQuery/OcclusionQuery_vc11.vcxproj b/examples/26.OcclusionQuery/OcclusionQuery_vc11.vcxproj deleted file mode 100644 index 370d3683..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 26.OcclusionQuery - {5CE0E2E7-879D-4152-B61D-24E7D0707B45} - OcclusionQuery - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/26.OcclusionQuery/OcclusionQuery_vc12.vcxproj b/examples/26.OcclusionQuery/OcclusionQuery_vc12.vcxproj deleted file mode 100644 index e181a45f..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 26.OcclusionQuery - {5CE0E2E7-879D-4152-B61D-24E7D0707B45} - OcclusionQuery - - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - Application - false - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/26.OcclusionQuery/OcclusionQuery_vc14.vcxproj b/examples/26.OcclusionQuery/OcclusionQuery_vc14.vcxproj deleted file mode 100644 index d52b6d59..00000000 --- a/examples/26.OcclusionQuery/OcclusionQuery_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 26.OcclusionQuery - {5CE0E2E7-879D-4152-B61D-24E7D0707B45} - OcclusionQuery - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug\OcclusionQuery.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release\OcclusionQuery.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\26.OcclusionQuery.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/26.OcclusionQuery/main.cpp b/examples/26.OcclusionQuery/main.cpp deleted file mode 100644 index 6aea63cb..00000000 --- a/examples/26.OcclusionQuery/main.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/** Example 026 OcclusionQuery - -This tutorial shows how to speed up rendering by use of the -OcclusionQuery feature. The usual rendering tries to avoid rendering of -scene nodes by culling those nodes which are outside the visible area, the -view frustum. However, this technique does not cope with occluded objects -which are still in the line of sight, but occluded by some larger object -between the object and the eye (camera). Occlusion queries check exactly that. -The queries basically measure the number of pixels that a previous render -left on the screen. -Since those pixels cannot be recognized at the end of a rendering anymore, -the pixel count is measured directly when rendering. Thus, one needs to render -the occluder (the object in front) first. This object needs to write to the -z-buffer in order to become a real occluder. Then the node is rendered and in -case a z-pass happens, i.e. the pixel is written to the framebuffer, the pixel -is counted in the query. -The result of a query is the number of pixels which got through. One can, based -on this number, judge if the scene node is visible enough to be rendered, or if -the node should be removed in the next round. Also note that the number of -pixels is a safe over approximation in general. The pixels might be overdrawn -later on, and the GPU tries to avoid inaccuracies which could lead to false -negatives in the queries. - -As you might have recognized already, we had to render the node to get the -numbers. So where's the benefit, you might say. There are several ways where -occlusion queries can help. It is often a good idea to just render the bbox -of the node instead of the actual mesh. This is really fast and is a safe over -approximation. If you need a more exact render with the actual geometry, it's -a good idea to render with just basic solid material. Avoid complex shaders -and state changes through textures. There's no need while just doing the -occlusion query. At least if the render is not used for the actual scene. This -is the third way to optimize occlusion queries. Just check the queries every -5th or 10th frame, or even less frequent. This depends on the movement speed -of the objects and camera. -*/ - -#ifdef _MSC_VER -// We'll also define this to stop MSVC complaining about sprintf(). -#define _CRT_SECURE_NO_WARNINGS -#pragma comment(lib, "Irrlicht.lib") -#endif - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - -/* -We need keyboard input events to switch some parameters -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - // This is the one method that we have to implement - virtual bool OnEvent(const SEvent& event) - { - // Remember whether each key is down or up - if (event.EventType == irr::EET_KEY_INPUT_EVENT) - KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown; - - return false; - } - - // This is used to check whether a key is being held down - virtual bool IsKeyDown(EKEY_CODE keyCode) const - { - return KeyIsDown[keyCode]; - } - - MyEventReceiver() - { - for (u32 i=0; i(640, 480), 16, false, false, false, &receiver); - - if (device == 0) - return 1; // could not create selected driver. - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - const io::path mediaPath = getExampleMediaPath(); - - smgr->getGUIEnvironment()->addStaticText(L"Press Space to hide occluder.", core::recti(10,10, 200,50)); - - /* - Create the node to be occluded. We create a sphere node with high poly count. - */ - scene::ISceneNode * node = smgr->addSphereSceneNode(10, 64); - if (node) - { - node->setPosition(core::vector3df(0,0,60)); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "wall.bmp")); - node->setMaterialFlag(video::EMF_LIGHTING, false); - } - - /* - Now we create another node, the occluder. It's a simple plane. - */ - scene::ISceneNode* plane = smgr->addMeshSceneNode(smgr->addHillPlaneMesh( - "plane", core::dimension2df(10,10), core::dimension2du(2,2)), 0, -1, - core::vector3df(0,0,20), core::vector3df(270,0,0)); - - if (plane) - { - plane->setMaterialTexture(0, driver->getTexture(mediaPath + "t351sml.jpg")); - plane->setMaterialFlag(video::EMF_LIGHTING, false); - plane->setMaterialFlag(video::EMF_BACK_FACE_CULLING, true); - } - - /* - Here we create the occlusion query. Because we don't have a plain mesh scene node - (ESNT_MESH or ESNT_ANIMATED_MESH), we pass the base geometry as well. Instead, - we could also pass a simpler mesh or the bounding box. But we will use a time - based method, where the occlusion query renders to the frame buffer and in case - of success (occlusion), the mesh is not drawn for several frames. - */ - driver->addOcclusionQuery(node, ((scene::IMeshSceneNode*)node)->getMesh()); - - /* - We have done everything, just a camera and draw it. We also write the - current frames per second and the name of the driver to the caption of the - window to examine the render speedup. - We also store the time for measuring the time since the last occlusion query ran - and store whether the node should be visible in the next frames. - */ - smgr->addCameraSceneNode(); - int lastFPS = -1; - u32 timeNow = device->getTimer()->getTime(); - bool nodeVisible=true; - - while(device->run()) - { - plane->setVisible(!receiver.IsKeyDown(irr::KEY_SPACE)); - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,113,113,133)); - /* - First, we draw the scene, possibly without the occluded element. This is necessary - because we need the occluder to be drawn first. You can also use several scene - managers to collect a number of possible occluders in a separately rendered - scene. - */ - node->setVisible(nodeVisible); - smgr->drawAll(); - smgr->getGUIEnvironment()->drawAll(); - - /* - Once in a while, here every 100 ms, we check the visibility. We run the queries, - update the pixel value, and query the result. Since we already rendered the node - we render the query invisible. The update is made blocking, as we need the result - immediately. If you don't need the result immediately, e.g. because you have other - things to render, you can call the update non-blocking. This gives the GPU more - time to pass back the results without flushing the render pipeline. - If the update was called non-blocking, the result from getOcclusionQueryResult is - either the previous value, or 0xffffffff if no value has been generated at all, yet. - The result is taken immediately as visibility flag for the node. - */ - if (device->getTimer()->getTime()-timeNow>100) - { - driver->runAllOcclusionQueries(false); - driver->updateAllOcclusionQueries(); - nodeVisible=driver->getOcclusionQueryResult(node)>0; - timeNow=device->getTimer()->getTime(); - } - - driver->endScene(); - - int fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw tmp(L"OcclusionQuery Example ["); - tmp += driver->getName(); - tmp += L"] fps: "; - tmp += fps; - - device->setWindowCaption(tmp.c_str()); - lastFPS = fps; - } - } - - /* - In the end, delete the Irrlicht device. - */ - device->drop(); - - return 0; -} - -/* -That's it. Compile and play around with the program. -**/ diff --git a/examples/27.PostProcessing/Makefile b/examples/27.PostProcessing/Makefile deleted file mode 100644 index c5905005..00000000 --- a/examples/27.PostProcessing/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler -Target = 27.PostProcessing -Sources = main.cpp - -# general compiler settings -CPPFLAGS = -I../../include -I/usr/X11R6/include -CXXFLAGS = -O3 -ffast-math -#CXXFLAGS = -g -Wall - -#default target is Linux -all: all_linux - -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif - -# target specific settings -all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32: LDFLAGS = -L../../lib/Win32-gcc -lIrrlicht -lopengl32 -lm -all_win32 clean_win32: SYSTEM=Win32-gcc -all_win32 clean_win32: SUF=.exe -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF) - -all_linux all_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 clean clean_linux clean_win32 diff --git a/examples/27.PostProcessing/PostProcessing.cbp b/examples/27.PostProcessing/PostProcessing.cbp deleted file mode 100644 index 8c7f68e6..00000000 --- a/examples/27.PostProcessing/PostProcessing.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/27.PostProcessing/PostProcessing_vc10.vcxproj b/examples/27.PostProcessing/PostProcessing_vc10.vcxproj deleted file mode 100644 index 65e47f37..00000000 --- a/examples/27.PostProcessing/PostProcessing_vc10.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 27.PostProcessing - {2B885150-210F-4CA7-957E-2C3D75974308} - PostProcessing - - - - Application - false - MultiByte - - - Application - false - MultiByte - - - Application - false - MultiByte - - - Application - false - MultiByte - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/27.PostProcessing/PostProcessing_vc11.vcxproj b/examples/27.PostProcessing/PostProcessing_vc11.vcxproj deleted file mode 100644 index 8a732900..00000000 --- a/examples/27.PostProcessing/PostProcessing_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 27.PostProcessing - {F864F96D-F6AE-43E2-9A12-218B1A081255} - PostProcessing - - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/27.PostProcessing/PostProcessing_vc12.vcxproj b/examples/27.PostProcessing/PostProcessing_vc12.vcxproj deleted file mode 100644 index 8aef23bd..00000000 --- a/examples/27.PostProcessing/PostProcessing_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 27.PostProcessing - {17E74625-568E-4008-897E-CAD12A332B0C} - PostProcessing - - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/27.PostProcessing/PostProcessing_vc14.vcxproj b/examples/27.PostProcessing/PostProcessing_vc14.vcxproj deleted file mode 100644 index a39c5551..00000000 --- a/examples/27.PostProcessing/PostProcessing_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 27.PostProcessing - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2} - PostProcessing - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/PostProcessing.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/PostProcessing.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\27.PostProcessing.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/27.PostProcessing/main.cpp b/examples/27.PostProcessing/main.cpp deleted file mode 100644 index 2f49ccfc..00000000 --- a/examples/27.PostProcessing/main.cpp +++ /dev/null @@ -1,417 +0,0 @@ -/** Example 027 Post Processing - -This tutorial shows how to implement post processing for D3D9 and OpenGL with -the engine. In order to do post processing, scene objects are firstly rendered -to render target. With the help of screen quad, the render target texture -is then drawn on the quad with shader-defined effects applied. - -This tutorial shows how to create a screen quad. It also shows how to create a -render target texture and associate it with the quad. Effects are defined as -shaders which are applied during rendering the quad with the render target -texture attached to it. - -A simple color inverse example is presented in this tutorial. The effect is -written in HLSL and GLSL. - -@author Boshen Guan - -We include all headers and define necessary variables as we have done before. -*/ -#include "driverChoice.h" -#include "exampleHelper.h" - -#include - -using namespace irr; - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -/* -We write a class derived from IShaderConstantSetCallBack class and implement -OnSetConstants callback interface. In this callback, we will set constants -used by the shader. -In this example, our HLSL shader needs texture size as input in its vertex -shader. Therefore, we set texture size in OnSetConstants callback using -setVertexShaderConstant function. -*/ - -IrrlichtDevice* device = 0; -video::ITexture* rt = 0; - -class QuadShaderCallBack : public video::IShaderConstantSetCallBack -{ -public: - QuadShaderCallBack() : FirstUpdate(true), TextureSizeID(-1), TextureSamplerID(-1) - { } - - virtual void OnSetConstants(video::IMaterialRendererServices* services, - s32 userData) - { - core::dimension2d size = rt->getSize(); - - // get texture size array - f32 textureSize[] = - { - (f32)size.Width, (f32)size.Height - }; - - if ( FirstUpdate ) - { - TextureSizeID = services->getVertexShaderConstantID("TextureSize"); - TextureSamplerID = services->getPixelShaderConstantID("TextureSampler"); - } - - // set texture size to vertex shader - services->setVertexShaderConstant(TextureSizeID, reinterpret_cast(textureSize), 2); - - // set texture for an OpenGL driver - s32 textureLayer = 0; - services->setPixelShaderConstant(TextureSamplerID, &textureLayer, 1); - } - -private: - bool FirstUpdate; - s32 TextureSizeID; - s32 TextureSamplerID; -}; - -class ScreenQuad : public IReferenceCounted -{ -public: - - ScreenQuad(video::IVideoDriver* driver) - : Driver(driver) - { - // --------------------------------> u - // |[1](-1, 1)----------[2](1, 1) - // | | ( 0, 0) / | (1, 0) - // | | / | - // | | / | - // | | / | - // | | / | - // | | / | - // | | / | - // | | / | - // | | / | - // |[0](-1, -1)---------[3](1, -1) - // | ( 0, 1) (1, 1) - // V - // v - - /* - A screen quad is composed of two adjacent triangles with 4 vertices. - Vertex [0], [1] and [2] create the first triangle and Vertex [0], - [2] and [3] create the second one. To map texture on the quad, UV - coordinates are assigned to the vertices. The origin of UV coordinate - locates on the top-left corner. And the value of UVs range from 0 to 1. - */ - - // define vertices array - - Vertices[0] = irr::video::S3DVertex(-1.0f, -1.0f, 0.0f, 1, 1, 0, irr::video::SColor(0,255,255,255), 0.0f, 1.0f); - Vertices[1] = irr::video::S3DVertex(-1.0f, 1.0f, 0.0f, 1, 1, 0, irr::video::SColor(0,255,255,255), 0.0f, 0.0f); - Vertices[2] = irr::video::S3DVertex( 1.0f, 1.0f, 0.0f, 1, 1, 0, irr::video::SColor(0,255,255,255), 1.0f, 0.0f); - Vertices[3] = irr::video::S3DVertex( 1.0f, -1.0f, 0.0f, 1, 1, 0, irr::video::SColor(0,255,255,255), 1.0f, 1.0f); - - // define indices for triangles - - Indices[0] = 0; - Indices[1] = 1; - Indices[2] = 2; - Indices[3] = 0; - Indices[4] = 2; - Indices[5] = 3; - - // turn off lighting as default - Material.setFlag(video::EMF_LIGHTING, false); - - // set texture warp settings to clamp to edge pixel - for (u32 i = 0; i < video::MATERIAL_MAX_TEXTURES; i++) - { - Material.TextureLayer[i].TextureWrapU = video::ETC_CLAMP_TO_EDGE; - Material.TextureLayer[i].TextureWrapV = video::ETC_CLAMP_TO_EDGE; - } - } - - virtual ~ScreenQuad() {} - - - //! render the screen quad - virtual void render() - { - // set the material of screen quad - Driver->setMaterial(Material); - - // set matrices to fit the quad to full viewport - Driver->setTransform(video::ETS_WORLD, core::IdentityMatrix); - Driver->setTransform(video::ETS_VIEW, core::IdentityMatrix); - Driver->setTransform(video::ETS_PROJECTION, core::IdentityMatrix); - - // draw screen quad - Driver->drawVertexPrimitiveList(Vertices, 4, Indices, 2); - } - - //! sets a flag of material to a new value - virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) - { - Material.setFlag(flag, newvalue); - } - - //! sets the texture of the specified layer in material to the new texture. - void setMaterialTexture(u32 textureLayer, video::ITexture* texture) - { - Material.setTexture(textureLayer, texture); - } - - //! sets the material type to a new material type. - virtual void setMaterialType(video::E_MATERIAL_TYPE newType) - { - Material.MaterialType = newType; - } - -private: - - video::IVideoDriver *Driver; - video::S3DVertex Vertices[4]; - u16 Indices[6]; - video::SMaterial Material; -}; - -/* -We start up the engine just like before. Then shader programs are selected -according to the driver type. -*/ -int main() -{ - // ask user for driver - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // create device - device = createDevice(driverType, core::dimension2d(640, 480)); - - if (device == 0) - return 1; // could not create selected driver. - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - - /* - In this example, high level post processing shaders are loaded for both - Direct3D and OpenGL drivers. - File pp_d3d9.hlsl is for Direct3D 9, and pp_opengl.frag/pp_opengl.vert - are for OpenGL. - */ - - const io::path mediaPath = getExampleMediaPath(); - io::path vsFileName; // filename for the vertex shader - io::path psFileName; // filename for the pixel shader - - switch(driverType) - { - case video::EDT_DIRECT3D9: - psFileName = mediaPath + "pp_d3d9.hlsl"; - vsFileName = psFileName; // both shaders are in the same file - break; - - case video::EDT_OPENGL: - psFileName = mediaPath + "pp_opengl.frag"; - vsFileName = mediaPath + "pp_opengl.vert"; - break; - } - - /* - Check for hardware capability of executing the corresponding shaders - on selected renderer. This is not necessary though. - */ - - if (!driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1)) - { - device->getLogger()->log("WARNING: Pixel shaders disabled "\ - "because of missing driver/hardware support."); - psFileName = ""; - } - - if (!driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1)) - { - device->getLogger()->log("WARNING: Vertex shaders disabled "\ - "because of missing driver/hardware support."); - vsFileName = ""; - } - - /* - An animated mesh is loaded to be displayed. As in most examples, - we'll take the fairy md2 model. - */ - - // load and display animated fairy mesh - - scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode( - smgr->getMesh(mediaPath + "faerie.md2")); - - if (fairy) - { - fairy->setMaterialTexture(0, - driver->getTexture(mediaPath + "faerie2.bmp")); // set diffuse texture - fairy->setMaterialFlag(video::EMF_LIGHTING, false); // disable dynamic lighting - fairy->setPosition(core::vector3df(-10,0,-100)); - fairy->setMD2Animation ( scene::EMAT_STAND ); - } - - // add scene camera - smgr->addCameraSceneNode(0, core::vector3df(10,10,-80), - core::vector3df(-10,10,-100)); - - /* - We create a render target texture (RTT) with the same size as frame buffer. - Instead of rendering the scene directly to the frame buffer, we firstly - render it to this RTT. Post processing is then applied based on this RTT. - RTT size needs not to be the same with frame buffer though. However in this - example, we expect the result of rendering to RTT to be consistent with the - result of rendering directly to the frame buffer. Therefore, the size of - RTT keeps the same with frame buffer. - */ - - // create render target - - if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET)) - { - rt = driver->addRenderTargetTexture(core::dimension2d(640, 480), "RTT1"); - } - else - { - device->getLogger()->log("Your hardware or this renderer is not able to use the "\ - "render to texture feature. RTT Disabled."); - } - - /* - Post processing is achieved by rendering a screen quad with this RTT (with - previously rendered result) as a texture on the quad. A screen quad is - geometry of flat plane composed of two adjacent triangles covering the - entire area of viewport. In this pass of rendering, RTT works just like - a normal texture and is drawn on the quad during rendering. We can then - take control of this rendering process by applying various shader-defined - materials to the quad. In other words, we can achieve different effect by - writing different shaders. - This process is called post processing because it normally does not rely - on scene geometry. The inputs of this process are just textures, or in - other words, just images. With the help of screen quad, we can draw these - images on the screen with different effects. For example, we can adjust - contrast, make grayscale, add noise, do more fancy effect such as blur, - bloom, ghost, or just like in this example, we invert the color to produce - negative image. - Note that post processing is not limited to use only one texture. It can - take multiple textures as shader inputs to provide desired result. In - addition, post processing can also be chained to produce compound result. - */ - - // we create a screen quad - ScreenQuad *screenQuad = new ScreenQuad(driver); - - // turn off mip maps and bilinear filter since we do not want interpolated result - screenQuad->setMaterialFlag(video::EMF_USE_MIP_MAPS, false); - screenQuad->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); - - // set quad texture to RTT we just create - screenQuad->setMaterialTexture(0, rt); - - /* - Let's create material for the quad. Like in other example, we create material - using IGPUProgrammingServices and call addShaderMaterialFromFiles, which - returns a material type identifier. - */ - - // create materials - - video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices(); - s32 ppMaterialType = 0; - - if (gpu) - { - // We write a QuadShaderCallBack class that implements OnSetConstants - // callback of IShaderConstantSetCallBack class at the beginning of - // this tutorial. We set shader constants in this callback. - - // create an instance of callback class - - QuadShaderCallBack* mc = new QuadShaderCallBack(); - - // create material from post processing shaders - - ppMaterialType = gpu->addHighLevelShaderMaterialFromFiles( - vsFileName, "vertexMain", video::EVST_VS_1_1, - psFileName, "pixelMain", video::EPST_PS_1_1, mc); - - mc->drop(); - } - - // set post processing material type to the quad - screenQuad->setMaterialType((video::E_MATERIAL_TYPE)ppMaterialType); - - /* - Now draw everything. That's all. - */ - - int lastFPS = -1; - - while(device->run()) - { - if (device->isWindowActive()) - { - driver->beginScene(true, true, video::SColor(255,0,0,0)); - - if (rt) - { - // draw scene into render target - - // set render target to RTT - driver->setRenderTarget(rt, true, true, video::SColor(255,0,0,0)); - - // draw scene to RTT just like normal rendering - smgr->drawAll(); - - // after rendering to RTT, we change render target back - driver->setRenderTarget(0, true, true, video::SColor(255,0,0,0)); - - // render screen quad to apply post processing - screenQuad->render(); - } - else - { - // draw scene normally - smgr->drawAll(); - } - - driver->endScene(); - - int fps = driver->getFPS(); - - if (lastFPS != fps) - { - core::stringw str = L"Irrlicht Engine - Post processing example ["; - str += driver->getName(); - str += "] FPS:"; - str += fps; - - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - } - } - - // do not forget to manually drop the screen quad - - screenQuad->drop(); - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/28.CubeMapping/CubeMapping.cbp b/examples/28.CubeMapping/CubeMapping.cbp deleted file mode 100644 index f8025e49..00000000 --- a/examples/28.CubeMapping/CubeMapping.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - diff --git a/examples/28.CubeMapping/CubeMapping_vc10.vcxproj b/examples/28.CubeMapping/CubeMapping_vc10.vcxproj deleted file mode 100644 index 403cd970..00000000 --- a/examples/28.CubeMapping/CubeMapping_vc10.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 28.CubeMapping - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7} - CubeMapping - - - - Application - false - MultiByte - - - Application - false - MultiByte - - - Application - false - MultiByte - - - Application - false - MultiByte - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/28.CubeMapping/CubeMapping_vc11.vcxproj b/examples/28.CubeMapping/CubeMapping_vc11.vcxproj deleted file mode 100644 index bd8bbb92..00000000 --- a/examples/28.CubeMapping/CubeMapping_vc11.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 28.CubeMapping - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553} - CubeMapping - - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/28.CubeMapping/CubeMapping_vc12.vcxproj b/examples/28.CubeMapping/CubeMapping_vc12.vcxproj deleted file mode 100644 index 1c7f9201..00000000 --- a/examples/28.CubeMapping/CubeMapping_vc12.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 28.CubeMapping - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5} - CubeMapping - - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - Application - false - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/28.CubeMapping/CubeMapping_vc14.vcxproj b/examples/28.CubeMapping/CubeMapping_vc14.vcxproj deleted file mode 100644 index 55e11efc..00000000 --- a/examples/28.CubeMapping/CubeMapping_vc14.vcxproj +++ /dev/null @@ -1,235 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 28.CubeMapping - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A} - CubeMapping - - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - Application - false - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Debug/CubeMapping.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - .\Release/CubeMapping.tlb - - - - - MaxSpeed - OnlyExplicitInline - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\28.CubeMapping.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Console - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - \ No newline at end of file diff --git a/examples/28.CubeMapping/Makefile b/examples/28.CubeMapping/Makefile deleted file mode 100644 index 22514c2c..00000000 --- a/examples/28.CubeMapping/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler -Target = 28.CubeMapping -Sources = main.cpp - -# general compiler settings -CPPFLAGS = -I../../include -I/usr/X11R6/include -CXXFLAGS = -O3 -ffast-math -#CXXFLAGS = -g -Wall - -#default target is Linux -all: all_linux - -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif - -# target specific settings -all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32: LDFLAGS = -L../../lib/Win32-gcc -lIrrlicht -lopengl32 -lm -all_win32 clean_win32: SYSTEM=Win32-gcc -all_win32 clean_win32: SUF=.exe -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF) - -all_linux all_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 clean clean_linux clean_win32 diff --git a/examples/28.CubeMapping/main.cpp b/examples/28.CubeMapping/main.cpp deleted file mode 100644 index b831d318..00000000 --- a/examples/28.CubeMapping/main.cpp +++ /dev/null @@ -1,770 +0,0 @@ -/** Example 028 CubeMapping - -Shows usage of cubemap textures and how to do some simple environment mapping. -Cubemap textures have images for all 6 directions of a cube in a single texture. -Environment is used to reflect the environment around an object onto the object. -Cubemaps only work with shader materials which are written to support cube mapping. - -@author Michael Zeilfelder, based on EnvCubeMap example from irrSpintz engine. - -Start with the usual includes. -*/ - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -using namespace irr; - - -/* - A callback class for our cubemap shader. - We need a shader material which maps the cubemap texture to - the polygon vertices of objects. -*/ -class CubeMapReflectionCallback : public video::IShaderConstantSetCallBack -{ -public: - CubeMapReflectionCallback(scene::ISceneManager* smgr, int styleUVW) - : SceneMgr(smgr) - , StyleUVW(styleUVW), Roughness(0.f) - , styleUvwID(-1) , worldViewProjID(-1), worldID(-1), cameraPosID(-1) - {} - - /* - Setting the style to map vertex UV-coordinates to the cubemap textures. - - Specular style is typically used for mirrors and highlight reflections. - - Diffuse style is commonly used in image based lighting calculations and - often in combination with a higher roughness. Think of it as the sum of all - light which reaches a point on your object. - - Using model vertices directly for UV's is just nice for testing sometimes. - Maybe has more uses? Experiment around :-) - */ - void SetStyleUVW(int style) - { - StyleUVW = style; - } - - int GetStyleUVW() const - { - return StyleUVW; - } - - /* - We could also call this sharpness as the rougher a material the less - sharp the reflections of a cubemap are (light for rough materials - spreads out more while smooth materials reflect it more like a mirror). - Roughness is calculated using the mipmaps of the cubemap texture. - Note that rendertarget cubemap textures won't have mipmaps, so unfortunately - it won't work for those. - Also currently only OpenGL is able to interpolate seamless over cubemap borders. - On Direct3D9 you will only smooth per side, but not over side-borders. - */ - void SetRoughness(float roughness) - { - Roughness = roughness; - } - - float getRoughness() const - { - return Roughness; - } - - /* - Typical code which passes a few values from c++ to shader. - */ - virtual void OnSetMaterial(const video::SMaterial& material) - {} - - virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData) - { - video::IVideoDriver* driver = services->getVideoDriver(); - - if ( worldViewProjID < 0 ) // first update - { - styleUvwID = services->getVertexShaderConstantID("StyleUVW"); - if( driver->getDriverType() == video::EDT_DIRECT3D9 ) - { - worldViewProjID = services->getVertexShaderConstantID("WorldViewProj"); - } - worldID = services->getVertexShaderConstantID("World"); - cameraPosID = services->getVertexShaderConstantID("CameraPos"); - roughnessID = services->getPixelShaderConstantID("Roughness"); - } - - services->setVertexShaderConstant(styleUvwID, &StyleUVW, 1 ); - - irr::core::matrix4 world = driver->getTransform(irr::video::ETS_WORLD); - services->setVertexShaderConstant(worldID, world.pointer(), 16); - - if( driver->getDriverType() == video::EDT_DIRECT3D9 ) - { - irr::core::matrix4 worldViewProj; - worldViewProj = driver->getTransform(irr::video::ETS_PROJECTION); - worldViewProj *= driver->getTransform(irr::video::ETS_VIEW); - worldViewProj *= world; - services->setVertexShaderConstant(worldViewProjID, worldViewProj.pointer(), 16); - } - - core::vector3df cameraPos = SceneMgr->getActiveCamera()->getAbsolutePosition(); - services->setVertexShaderConstant(cameraPosID, &cameraPos.X, 3 ); - services->setPixelShaderConstant(roughnessID, &Roughness, 1 ); - } - -private: - scene::ISceneManager* SceneMgr; - - int StyleUVW; // 0 = specular, 1=diffuse, 2 = use model vertex coordinates for uvw. - float Roughness; // cubemap 0 = specular ... highest value depends on number of mipmaps in the texture - - irr::s32 styleUvwID; - irr::s32 worldViewProjID; - irr::s32 worldID; - irr::s32 cameraPosID; - irr::s32 roughnessID; -}; - -/* - To keep the example compact our event-receiver acts also like a main - application class. So it handles user input, updates the dynamic parts of - the UI and it keeps some 3d nodes around. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - MyEventReceiver() : Driver(0), Shader(0) - ,BackgroundSkybox(0), BackgroundCube(0) - , CubemapUpdates(2) - , CurrentStyleUVW(0), CurrentRoughness(0) - , NeedCubemapUpdate(true) - { - StyleNamesUVW.push_back( L"specular" ); - StyleNamesUVW.push_back( L"diffuse" ); - StyleNamesUVW.push_back( L"model coordinates" ); - } - - // Handle the key input - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown == false) - { - switch(event.KeyInput.Key ) - { - case KEY_SPACE: - // Switch between different texture mapping styles - if ( Shader ) - { - Shader->SetStyleUVW((Shader->GetStyleUVW()+1)%StyleNamesUVW.size()); - updateStyleUVW(); - } - break; - case KEY_KEY_B: - // Switch between our 2 different backgrounds - if ( BackgroundSkybox && BackgroundCube ) - { - if ( BackgroundSkybox->isVisible() ) - { - BackgroundSkybox->setVisible(false); - BackgroundCube->setVisible(true); - } - else - { - BackgroundSkybox->setVisible(true); - BackgroundCube->setVisible(false); - } - NeedCubemapUpdate = true; - } - break; - case KEY_KEY_I: - // Show/hide the info text nodes - for (u32 i=0; isetVisible(!InfoTextNodes[i]->isVisible()); - break; - case KEY_KEY_S: - // Enable/disable seamless smoothing of mipmaps over cube borders - if ( Driver ) - { - Driver->disableFeature(video::EVDF_TEXTURE_CUBEMAP_SEAMLESS, Driver->queryFeature(video::EVDF_TEXTURE_CUBEMAP_SEAMLESS) ); - updateSeamless(); - } - break; - case KEY_KEY_U: - // Switch dynamic cubemap updates on/off. - CubemapUpdates = (CubemapUpdates+1) % 3; - updateCubemapUpdates(); - break; - case KEY_PLUS: - case KEY_ADD: - // Make material rougher - if ( Shader ) - { - Shader->SetRoughness( Shader->getRoughness() + 0.5f ); - updateRoughness(); - } - break; - case KEY_MINUS: - case KEY_SUBTRACT: - { - // Make material smoother - if ( Shader ) - { - float roughness = Shader->getRoughness() - 0.5f; - if ( roughness >= 0.f ) - { - Shader->SetRoughness(roughness); - updateRoughness(); - } - } - break; - } - default: - break; - } - } - - return false; - } - - // Some helper functions to update the UI - void updateStyleUVW() - { - if ( CurrentStyleUVW && Shader) - CurrentStyleUVW->setText(StyleNamesUVW[Shader->GetStyleUVW()].c_str()); - } - - void updateRoughness() - { - if ( CurrentRoughness && Shader ) - { - CurrentRoughness->setText( irr::core::stringw(Shader->getRoughness()).c_str() ); - } - } - - void updateSeamless() - { - if ( CurrentSeamlessCubemap && Driver ) - { - CurrentSeamlessCubemap->setText( Driver->queryFeature(video::EVDF_TEXTURE_CUBEMAP_SEAMLESS) ? L"ON" : L"OFF" ); - } - } - - void updateCubemapUpdates() - { - if ( CurrentCubemapUpdates ) - { - switch ( CubemapUpdates ) - { - case 0: CurrentCubemapUpdates->setText( L"static"); break; - case 1: CurrentCubemapUpdates->setText( L"dynamic" ); break; - case 2: CurrentCubemapUpdates->setText( L"dynamic+mips" ); break; - } - } - } - - // Check if the cubemap textures should be updated with new screenshots - // return 0 for no update, 1 for update, 2 for update and fix mip-maps - int checkCubemapUpdate() - { - if ( NeedCubemapUpdate || CubemapUpdates == 2) - { - NeedCubemapUpdate = false; - return 2; - } - - return CubemapUpdates; - } - - // Add some text-node floating above it's parent node. - void addInfoTextNode(irr::gui::IGUIFont* font, const wchar_t* text, irr::scene::ISceneNode* parent) - { - if ( parent ) - { - const video::SColor infoTextCol(250, 70, 90, 90); - core::dimension2du dim(font->getDimension(text)); - core::dimension2df dimf((f32)dim.Width, (f32)dim.Height); - scene::IBillboardTextSceneNode* infoNode = parent->getSceneManager()->addBillboardTextSceneNode( font, text, parent, dimf, core::vector3df(0, 120, 0), -1, infoTextCol, infoTextCol); - InfoTextNodes.push_back(infoNode); - } - } - - irr::video::IVideoDriver* Driver; - CubeMapReflectionCallback* Shader; - - scene::ISceneNode* BackgroundSkybox; - scene::ISceneNode* BackgroundCube; - irr::core::array InfoTextNodes; - - int CubemapUpdates; // 0 = static, 1 = dynamic, 2 = dynamic with rtt - - irr::core::array StyleNamesUVW; - - irr::gui::IGUIStaticText* CurrentStyleUVW; - irr::gui::IGUIStaticText* CurrentRoughness; - irr::gui::IGUIStaticText* CurrentSeamlessCubemap; - irr::gui::IGUIStaticText* CurrentCubemapUpdates; - -private: - bool NeedCubemapUpdate; -}; - -/* Workaround for OpenGL's upside-down images. - Texture origins (0,0) in OpenGL are usually at the left-bottom instead of the more common left-top image formats. - Irrlicht internally uses textures with left-top origin and then corrects the texture-matrices in the fixed-function pipeline. - For shader materials it's left to the users to handle those UV-flips for the texture-matrix. - Render target textures (RTT's) in OpenGL are rendered with left-bottom origin and Irrlicht can't change that, so all RTT textures - in memory are upside-down (unlike all other Irrlicht textures). - In the fixed function pipeline Irrlicht handles this by flipping the RTT's texture matrix once more and for shaders it's again - left to the users to handle it. - Cubemap textures are different from other textures in OpenGL. Each cube side has left-top as the origin. So not flipping Irrlicht textures for those would be fine. - Except - OpenGL RTT's still render left-bottom - even when the target is a cubemap RTT. - I found no good way around this so far - it just seems messed up as we get a left-handed/right handed coordinate system change that way. - - So... the following 2 defines are two different workarounds I found. Both are ugly, which one is better in reality depends probably on the scene. - Only use one of those: - CUBEMAP_UPSIDE_DOWN_GL_PROJECTION is relatively fast as it just changes the project matrix. The problem is that changing the projection matrix - means changing front/backside culling. So every node rendered has to flip the material flags for those. - - CUBEMAP_USPIDE_DOWN_RTT will change the texture memory itself and flip the image upside-down. - While easier to do, this involves texture-locking and is very slow. -*/ -#define CUBEMAP_UPSIDE_DOWN_GL_PROJECTION -//#define CUBEMAP_USPIDE_DOWN_RTT - - -// Flip frontface/backface culling for all nodes -#ifdef CUBEMAP_UPSIDE_DOWN_GL_PROJECTION -void flipCullingFlags(const core::array& nodes) -{ - for ( irr::u32 n=0; n < nodes.size(); ++n ) - { - scene::ISceneNode* node = nodes[n]; - const irr::u32 matCount = node->getMaterialCount(); - for ( irr::u32 m=0; m < matCount; ++m) - { - video::SMaterial& mat = node->getMaterial(m); - mat.BackfaceCulling = !mat.BackfaceCulling; - mat.FrontfaceCulling = !mat.FrontfaceCulling; - } - } -} -#endif - - -/* - Render the environment around a node into a cubemap texture. -*/ -void renderEnvironmentCubeMap(irr::video::IVideoDriver* driver, irr::scene::ICameraSceneNode* cubeMapCamera, irr::scene::ISceneNode* cubeCenterNode, video::IRenderTarget* cubeMapRT, video::ITexture* dynamicCubeMapRTT, video::ITexture* depthStencilRTT) -{ - // Change to the cubemap camera which has a few specific render-settings - scene::ISceneManager* smgr = cubeMapCamera->getSceneManager(); - scene::ICameraSceneNode * oldCam = smgr->getActiveCamera(); - smgr->setActiveCamera( cubeMapCamera ); - - /* - We want to see everything around the center node, so hide the node - itself, otherwise it would be in the way. - Then set the camera to that node's position. - */ - cubeCenterNode->setVisible( false ); - const core::vector3df center( cubeCenterNode->getAbsolutePosition() ); - cubeMapCamera->setPosition( center ); - - /* - Render all 6 directions. Which means simple setting the camera target/up - vector to all 6 directions and then render the full scene each time. - So yeah - updating an environment cube-map means 6 full renders for each - object which needs an environment map. In other words - you generally only - want to do that in pre-processing, not in realtime. - */ - const core::vector3df targetVecs[6] = { - core::vector3df(1.f, 0.f, 0.f), - core::vector3df(-1.f, 0.f, 0.f), - core::vector3df(0.f, 1.f, 0.f), - core::vector3df(0.f, -1.f, 0.f), - core::vector3df(0.f, 0.f, 1.f), - core::vector3df(0.f, 0.f, -1.f) - }; - - const core::vector3df upVecs[6] = { - core::vector3df( 0,1,0 ), - core::vector3df( 0,1,0 ), - core::vector3df( 0,0,-1 ), - core::vector3df( 0,0,1 ), - core::vector3df( 0,1,0 ), - core::vector3df( 0,1,0 ) - }; - for ( int s=0; s<6; ++s ) - { - cubeMapCamera->setUpVector( upVecs[s] ); - cubeMapCamera->setTarget( center + targetVecs[s] ); - // Here we tell into which side of the cubemap texture we want to write - cubeMapRT->setTexture(dynamicCubeMapRTT, depthStencilRTT, (video::E_CUBE_SURFACE)(video::ECS_POSX + s)); - driver->setRenderTargetEx(cubeMapRT, video::ECBF_ALL); - smgr->drawAll(); - -#ifdef CUBEMAP_USPIDE_DOWN_RTT - // This works because the lock for rtt's always flips in Irrlicht. - // So in this case lock() unlock will result in a flipped texture - // But be warned - it's very, very slow! - driver->setRenderTarget(0); // to avoid accessing active rt - dynamicCubeMapRTT->lock(video::ETLM_READ_WRITE, 0, s, video::ETLF_FLIP_Y_UP_RTT); - dynamicCubeMapRTT->unlock(); -#endif - } - - //dynamicCubeMapRTT->regenerateMipMapLevels(); // Unfortunately we can't seem to have mipmaps for rtt's - - driver->setRenderTarget(0); - cubeCenterNode->setVisible( true ); - smgr->setActiveCamera( oldCam ); -} - -/* - Typical setup at the main start. -*/ -int main() -{ - // Ask user for driver - video::E_DRIVER_TYPE driverType = driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - // Create device - MyEventReceiver eventReceiver; - const core::dimension2d dimDevice(1024, 768); - IrrlichtDevice* device = createDevice( driverType, dimDevice, 32, false, false, false, &eventReceiver ); - if (!device) - return 1; - - const io::path mediaPath = getExampleMediaPath(); - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* env = device->getGUIEnvironment(); - eventReceiver.Driver = driver; - - // Set window title - core::stringw strCaption(L"Cubemap example - Irrlicht Engine ["); - strCaption += driver->getName(); - strCaption += L"]"; - device->setWindowCaption(strCaption.c_str()); - - // set a nicer font - gui::IGUISkin* skin = env->getSkin(); - gui::IGUIFont* font = env->getFont(mediaPath + "fonthaettenschweiler.bmp"); - if (font) - skin->setFont(font); - - /* - Create a shader material for cube mapping - */ - video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices(); - s32 cubeMapReflectionMaterial = 0; - if( gpu ) - { - // Decide on shader to use based on active driver - irr::io::path vsFileName; - irr::io::path psFileName; - switch( driverType ) - { - case video::EDT_DIRECT3D9: - vsFileName = mediaPath + "cubeMapReflectionVS.hlsl"; - psFileName = mediaPath + "cubeMapReflectionPS.hlsl"; - break; - - case video::EDT_OPENGL: - vsFileName = mediaPath + "cubeMapReflection.vert"; - psFileName = mediaPath + "cubeMapReflection.frag"; - break; - } - - CubeMapReflectionCallback* cubeMapCB = new CubeMapReflectionCallback(smgr, 2); - cubeMapReflectionMaterial = gpu->addHighLevelShaderMaterialFromFiles( - vsFileName, "VS", video::EVST_VS_1_1, - psFileName, "PS", video::EPST_PS_3_0, - cubeMapCB, video::EMT_SOLID ); - if ( cubeMapReflectionMaterial >= 0 ) - eventReceiver.Shader = cubeMapCB; - cubeMapCB->drop(); - } - - // add fps camera - scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.f, 1.f); - camera->setPosition( core::vector3df( 0,10,-200 ) ); - device->getCursorControl()->setVisible(false); - - /* - Get 6 images forming a cubemap. The coordinate system used in those images - seemed to be different than the one in Irrlicht. I decided to leave it like - that because it's pretty common that way. If you get cubemap textures which - seem to have x/y/z axis named different you'll just have to experiment until - you figured out the correct order. - */ - core::array cubeMapImages; - cubeMapImages.push_back(driver->createImageFromFile( mediaPath + "cubemap_posx.jpg" )); - cubeMapImages.push_back(driver->createImageFromFile( mediaPath + "cubemap_negx.jpg" )); - cubeMapImages.push_back(driver->createImageFromFile( mediaPath + "cubemap_posy.jpg" )); - cubeMapImages.push_back(driver->createImageFromFile( mediaPath + "cubemap_negy.jpg" )); - cubeMapImages.push_back(driver->createImageFromFile( mediaPath + "cubemap_posz.jpg" )); - cubeMapImages.push_back(driver->createImageFromFile( mediaPath + "cubemap_negz.jpg" )); - - /* Create a cubemap texture from those images. Note that 6 images become a single texture now. */ - video::ITexture* cubeMapStaticTex = 0; - cubeMapStaticTex = driver->addTextureCubemap("cm", cubeMapImages[0], cubeMapImages[1], cubeMapImages[2], cubeMapImages[3], cubeMapImages[4], cubeMapImages[5]); - for ( u32 i=0; idrop(); - cubeMapImages.clear(); - - /* Create a render target, cubemap render-target-textures and a camera with settings for cube mapping */ - video::IRenderTarget* cubeMapRT = driver->addRenderTarget(); - video::ITexture* dynamicCubeMapRTT = 0; - video::ITexture* depthStencilRTT = 0; - video::ITexture* dynamicCubeMapRTT_intermediate = 0; // just for rendering, but not used in material - video::ITexture* dynamicCubeMapTex = 0; // dynamic and with mipmaps - scene::ICameraSceneNode* cubeMapCamera = 0; - if( driver->queryFeature( video::EVDF_RENDER_TO_TARGET ) ) - { - // Create cube map textures and render target cubemap textures. - const u32 dynamicCubeMapSize = 512; - dynamicCubeMapRTT = driver->addRenderTargetTextureCubemap(dynamicCubeMapSize, "cube_rtr"); - depthStencilRTT = driver->addRenderTargetTexture(irr::core::dimension2du(dynamicCubeMapSize, dynamicCubeMapSize), "cubemap_ds", irr::video::ECF_D24S8); - - dynamicCubeMapRTT_intermediate = driver->addRenderTargetTextureCubemap(dynamicCubeMapSize, "cube_rtr"); - dynamicCubeMapTex = driver->addTextureCubemap(dynamicCubeMapSize, "cube_tex"); - - // Camera for creating an environment cubemap - cubeMapCamera = smgr->addCameraSceneNode(); - cubeMapCamera->setFOV(core::PI* 0.5f); // 90° view angle - cubeMapCamera->setAspectRatio(1.f); // it's a cube... all sides have the same length - smgr->setActiveCamera( camera ); - } - - /* - Add sphere-nodes which will be using the cubemaps as materials. - You may also want to experiment with other node-types here! - */ - - scene::ISceneNode* sphereNode = 0; - scene::ISceneNode* sphereNode2 = 0; - scene::ISceneNode* sphereNode3 = 0; - scene::IMesh* sphereMesh = smgr->getGeometryCreator()->createSphereMesh(100.f); - if( sphereMesh ) - { - // Nothing really special here except they need the shader material to display cubemaps. - sphereNode = smgr->addMeshSceneNode( sphereMesh ); - sphereNode->setPosition( core::vector3df(-250,0,0) ); - sphereNode->updateAbsolutePosition(); - sphereNode->setMaterialFlag( video::EMF_LIGHTING, false ); - sphereNode->setMaterialTexture( 0, dynamicCubeMapRTT ); - sphereNode->setMaterialType( (video::E_MATERIAL_TYPE)cubeMapReflectionMaterial ); - eventReceiver.addInfoTextNode(font, L"Cubemap dynamic rtt, no mip-maps", sphereNode); - - if ( dynamicCubeMapTex ) - { - sphereNode3 = smgr->addMeshSceneNode( sphereMesh ); - sphereNode3->setPosition( core::vector3df(0,0,250) ); - sphereNode3->updateAbsolutePosition(); - sphereNode3->setMaterialFlag( video::EMF_LIGHTING, false ); - sphereNode3->setMaterialTexture( 0, dynamicCubeMapTex ); - sphereNode3->getMaterial(0).TextureLayer[0].TrilinearFilter = false; // this is default anyway. It would be faster - but you can only access integer mip-levels - no filtering between mip-levels. - sphereNode3->setMaterialType( (video::E_MATERIAL_TYPE)cubeMapReflectionMaterial ); - eventReceiver.addInfoTextNode(font, L"Cubemap dynamic with mip-maps", sphereNode3); - } - - if ( cubeMapStaticTex ) - { - sphereNode2 = smgr->addMeshSceneNode( sphereMesh ); - sphereNode2->setPosition( core::vector3df(250,0,0) ); - sphereNode2->updateAbsolutePosition(); - sphereNode2->setMaterialFlag( video::EMF_LIGHTING, false ); - sphereNode2->setMaterialTexture( 0, cubeMapStaticTex ); - sphereNode2->getMaterial(0).TextureLayer[0].TrilinearFilter = true; // this way smoothing happens between different mip-levels. - sphereNode2->setMaterialType( (video::E_MATERIAL_TYPE)cubeMapReflectionMaterial ); - eventReceiver.addInfoTextNode(font, L"Cubemap fixed images", sphereNode2); - } - - sphereMesh->drop(); - } - - /* Add some background which will show up in the environment maps. - For first one we use the same textures as used in the spheres. - Note the difference between a skybox and a cubemap is that the skybox really uses 6 different - textures. While the cubemap uses a single texture created from 6 images. */ - eventReceiver.BackgroundSkybox = smgr->addSkyBoxSceneNode( - driver->getTexture(mediaPath + "cubemap_posy.jpg"), // top - driver->getTexture(mediaPath + "cubemap_negy.jpg"), // bottom - driver->getTexture(mediaPath + "cubemap_posz.jpg"), // left - driver->getTexture(mediaPath + "cubemap_negz.jpg"), // right - driver->getTexture(mediaPath + "cubemap_posx.jpg"), // front - driver->getTexture(mediaPath + "cubemap_negx.jpg")); // back - - - - /* Another background for comparison and to make it more obvious - when the spheres reflect the environment and when they use static cubemaps. */ - scene::IMesh * cubeMesh = smgr->getGeometryCreator()->createCubeMesh( core::vector3df(10.f, 10.f, 10.f), scene::ECMT_6BUF_4VTX_NP); - smgr->getMeshManipulator()->scale(cubeMesh, core::vector3df(-1, 1, 1)); - if( cubeMesh ) - { - smgr->getMeshManipulator()->setVertexColors( cubeMesh->getMeshBuffer(0), video::SColor(255, 240, 10, 10) ); - smgr->getMeshManipulator()->setVertexColors( cubeMesh->getMeshBuffer(1), video::SColor(255, 240, 130, 10) ); - smgr->getMeshManipulator()->setVertexColors( cubeMesh->getMeshBuffer(2), video::SColor(255, 50, 250, 10) ); - smgr->getMeshManipulator()->setVertexColors( cubeMesh->getMeshBuffer(3), video::SColor(255, 70, 10, 250) ); - smgr->getMeshManipulator()->setVertexColors( cubeMesh->getMeshBuffer(4), video::SColor(255, 240, 250, 10) ); - smgr->getMeshManipulator()->setVertexColors( cubeMesh->getMeshBuffer(5), video::SColor(255, 85, 250, 250) ); - - eventReceiver.BackgroundCube = smgr->addMeshSceneNode( cubeMesh ); - cubeMesh->drop(); - - eventReceiver.BackgroundCube->setScale( core::vector3df( 200, 200, 200 ) ); - eventReceiver.BackgroundCube->setMaterialFlag( video::EMF_LIGHTING, false ); - eventReceiver.BackgroundCube->setVisible(false); - } - -#ifdef CUBEMAP_UPSIDE_DOWN_GL_PROJECTION - if ( driverType == video::EDT_OPENGL ) - { - // Flip projection matrix (note this also flips front/backface culling) - core::matrix4 matProj = cubeMapCamera->getProjectionMatrix(); - matProj[4] = -matProj[4]; - matProj[5] = -matProj[5]; - matProj[6] = -matProj[6]; - matProj[7] = -matProj[7]; - cubeMapCamera->setProjectionMatrix(matProj); - } -#endif - - /* - Add some moving node to show the difference between static/dynamic environment maps - */ - scene::IMeshSceneNode * movingNode = smgr->addCubeSceneNode(30.f); - movingNode->getMaterial(0).Lighting = false; - smgr->getMeshManipulator()->setVertexColors( movingNode->getMesh()->getMeshBuffer(0), video::SColor(255, 230, 200, 150)); - scene::ISceneNodeAnimator* circleAnimator = smgr->createFlyCircleAnimator(core::vector3df(-125, -50.f, 125), 300.f, 0.0005f); - movingNode->addAnimator(circleAnimator); - circleAnimator->drop(); - - /* Add some UI */ - if ( eventReceiver.Shader ) - { - skin->setColor(gui::EGDC_3D_FACE, video::SColor(50, 160, 120, 120)); - - u32 top = dimDevice.Height - 200; - const u32 left = dimDevice.Width - 350; - const u32 right = dimDevice.Width - 10; - irr::gui::IGUIStaticText * stextUVW = env->addStaticText(L" Style of generating texture coordinates:\n Change with (space)", core::recti(left, top, right, top+35), false, true, 0, -1, true); - top += 40; - stextUVW->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_UPPERLEFT); - eventReceiver.CurrentStyleUVW = env->addStaticText(L"", core::recti(240,0, 400, 20), false, false, stextUVW); - eventReceiver.updateStyleUVW(); - - irr::gui::IGUIStaticText * stextRoughness = env->addStaticText(L" Roughness:\n Change with (+) and (-)", core::recti(left, top, right, top+35), false, true, 0, -1, true); - top += 40; - eventReceiver.CurrentRoughness = env->addStaticText( L"", core::recti(240,0, 400, 20), false, false, stextRoughness); - eventReceiver.updateRoughness(); - - irr::gui::IGUIStaticText * stextSeamlessCupemap = env->addStaticText(L" Seamless cubemap (with roughness):\n Change with (s)", core::recti(left, top, right, top+35), false, true, 0, -1, true); - top += 40; - eventReceiver.CurrentSeamlessCubemap = env->addStaticText( L"", core::recti(240,0, 400, 20), false, false, stextSeamlessCupemap); - eventReceiver.updateSeamless(); - - irr::gui::IGUIStaticText * stextUpdates = env->addStaticText(L" Cubemap updates:\n Change with (u)", core::recti(left, top, right, top+35), false, true, 0, -1, true); - top += 40; - eventReceiver.CurrentCubemapUpdates = env->addStaticText( L"", core::recti(240,0, 400, 20), false, false, stextUpdates); - eventReceiver.updateCubemapUpdates(); - - env->addStaticText(L" Change background with (b)", core::recti(left, top, right, top+15), false, true, 0, -1, true); - top += 20; - - env->addStaticText(L" Show/hide info nodes with (i)", core::recti(left, top, right, top+15), false, true, 0, -1, true); - } - - - /* Main loop */ - while(device->run()) - { - if (device->isWindowActive()) - { - driver->beginScene(true, true, video::SColor(255, 127, 127, 255)); - - /* Check if we want to update the environment maps. - Usually not something you'll do every frame, but either once at the star - or maybe updating an environment map once in a while. - */ - int updateCubemaps = eventReceiver.checkCubemapUpdate(); - if( dynamicCubeMapRTT && sphereNode && updateCubemaps > 0 ) - { -#ifdef CUBEMAP_UPSIDE_DOWN_GL_PROJECTION - core::array allNodes; - if ( driverType == video::EDT_OPENGL ) - { - /* - Flipping projection matrix flips front/backface culling. - We only have a skybox so in this case this still would be fast, with more objects it's getting more ugly. - */ - smgr->getSceneNodesFromType(scene::ESNT_ANY, allNodes); - flipCullingFlags(allNodes); - } -#endif - /* - If rendered just once then this node has still a white (or even undefined) texture at this point - Just hiding it and render the background when rendering the cubemap for the other node is less noticable - than having a big white dot in the environment texture. - Render order can matter if you want several environment maps in your scene. - */ - if (sphereNode3) - sphereNode3->setVisible(false); - - renderEnvironmentCubeMap(driver, cubeMapCamera, sphereNode, cubeMapRT, dynamicCubeMapRTT, depthStencilRTT); - - if ( sphereNode3) - { - if ( updateCubemaps == 2 ) - { - /* - Our rtt's unfortunately don't have mipmaps (sorry, not sure if we can get that somehow...) - So if we want mipmaps in the dynamic cubemap we have to copy it to a non-rtt texture. - Warning: Very, very slow. Far slower than just creating an environment map as this - will copy the texture from GPU to main memory - copy it to a new texture, create mip-maps and - upload the result back to the GPU. - */ - renderEnvironmentCubeMap(driver, cubeMapCamera, sphereNode3, cubeMapRT, dynamicCubeMapRTT_intermediate, depthStencilRTT); - for ( int i=0; i<6; ++i) - { - void * rtData = dynamicCubeMapRTT_intermediate->lock(video::ETLM_READ_ONLY, 0, i, video::ETLF_NONE); - void * tData = dynamicCubeMapTex->lock(video::ETLM_READ_WRITE, 0, i); - memcpy(tData, rtData, dynamicCubeMapTex->getPitch()*dynamicCubeMapTex->getSize().Width); - dynamicCubeMapRTT_intermediate->unlock(); - dynamicCubeMapTex->unlock(); - dynamicCubeMapTex->regenerateMipMapLevels(); - } - } - sphereNode3->setVisible(true); - } - -#ifdef CUBEMAP_UPSIDE_DOWN_GL_PROJECTION - if ( driverType == video::EDT_OPENGL ) - { - flipCullingFlags(allNodes); - } -#endif - } - - smgr->drawAll(); - env->drawAll(); - - driver->endScene(); - } - } - - device->drop(); - - return 0; -} - -/* -**/ diff --git a/examples/29.HardwareSkinning/where_is_it.txt b/examples/29.HardwareSkinning/where_is_it.txt deleted file mode 100644 index afe0b22e..00000000 --- a/examples/29.HardwareSkinning/where_is_it.txt +++ /dev/null @@ -1,2 +0,0 @@ -This example is currently only available in Irrlicht svn branch for the shader-pipeline: https://sourceforge.net/p/irrlicht/code/HEAD/tree/branches/shader-pipeline -It will be merged with the svn trunk at some point in the future. diff --git a/examples/30.Profiling/Makefile b/examples/30.Profiling/Makefile deleted file mode 100644 index fa113d48..00000000 --- a/examples/30.Profiling/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 30.Profiling -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/30.Profiling/Profiling.cbp b/examples/30.Profiling/Profiling.cbp deleted file mode 100644 index 0f71fbde..00000000 --- a/examples/30.Profiling/Profiling.cbp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/examples/30.Profiling/Profiling.vcproj b/examples/30.Profiling/Profiling.vcproj deleted file mode 100644 index 494f9bb4..00000000 --- a/examples/30.Profiling/Profiling.vcproj +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/30.Profiling/Profiling.xcodeproj/project.pbxproj b/examples/30.Profiling/Profiling.xcodeproj/project.pbxproj deleted file mode 100644 index 6468c707..00000000 --- a/examples/30.Profiling/Profiling.xcodeproj/project.pbxproj +++ /dev/null @@ -1,324 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* 30.Profiling.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 30.Profiling.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* 30.Profiling.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* 30.Profiling */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "30.Profiling" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = 30.Profiling; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* 30.Profiling.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Profiling" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* 30.Profiling */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Profiling" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "30.Profiling" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/30.Profiling/Profiling.xcodeproj/xcshareddata/xcschemes/30.Profiling.xcscheme b/examples/30.Profiling/Profiling.xcodeproj/xcshareddata/xcschemes/30.Profiling.xcscheme deleted file mode 100644 index 111087e8..00000000 --- a/examples/30.Profiling/Profiling.xcodeproj/xcshareddata/xcschemes/30.Profiling.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/30.Profiling/Profiling_vc10.vcxproj b/examples/30.Profiling/Profiling_vc10.vcxproj deleted file mode 100644 index 7fba2fa9..00000000 --- a/examples/30.Profiling/Profiling_vc10.vcxproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 30.Profiling - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97} - 30.Profiling - Win32Proj - - - - Application - MultiByte - - - Application - MultiByte - - - Application - MultiByte - - - Application - MultiByte - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/30.Profiling/Profiling_vc11.vcxproj b/examples/30.Profiling/Profiling_vc11.vcxproj deleted file mode 100644 index 265698a9..00000000 --- a/examples/30.Profiling/Profiling_vc11.vcxproj +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 30.Profiling - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97} - 30.Profiling - Win32Proj - - - - Application - MultiByte - v110 - - - Application - MultiByte - v110 - - - Application - MultiByte - v110 - - - Application - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/30.Profiling/Profiling_vc12.vcxproj b/examples/30.Profiling/Profiling_vc12.vcxproj deleted file mode 100644 index 1b5e4972..00000000 --- a/examples/30.Profiling/Profiling_vc12.vcxproj +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 30.Profiling - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97} - 30.Profiling - Win32Proj - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/30.Profiling/Profiling_vc14.vcxproj b/examples/30.Profiling/Profiling_vc14.vcxproj deleted file mode 100644 index caf33cd9..00000000 --- a/examples/30.Profiling/Profiling_vc14.vcxproj +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 30.Profiling - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97} - 30.Profiling - Win32Proj - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - $(OutDir)Profiling.pdb - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win32-VisualStudio\30.Profiling.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - Sync - - - Level3 - - - Cdecl - - - ..\..\bin\Win64-VisualStudio\30.Profiling.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - - \ No newline at end of file diff --git a/examples/30.Profiling/main.cpp b/examples/30.Profiling/main.cpp deleted file mode 100644 index 0ad479af..00000000 --- a/examples/30.Profiling/main.cpp +++ /dev/null @@ -1,507 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h -// Copyright by Michael Zeilfelder - -/** Example 030 Profiling - -Profiling is used to get runtime information about code code. - -There exist several independent profiling tools. -Examples for free profilers are "gprof" for the GNU toolchain and "very sleepy" -from codersnotes for Windows. Proprietary tools are for example "VTune" from -Intel or "AMD APP Profiler". Those tools work by sampling the running -application regularly to get statistic information about the called functions. -The way to use them is to compile your application with special flags -to include profiling information (some also work with debug information). They -also might allow to profile only certain parts of the code, although -most can't do that. The sampling is usually rather time-consuming which means -the application will be very slow when collecting the profiling data. It's often -useful to start with one of those tools to get an overview over the bottlenecks -in your application. Those tools have the advantage that they don't need any -modifications inside the code. - -Once you need to dig deeper the Irrlicht profiler can help you. It works nearly -like a stopwatch. You add start/stop blocks into the parts of your code which -you need to check and the Irrlicht profiler will give you then the exact times -of execution for those parts. And unlike general profiler tools you don't just -get average information about the run-time but also worst-cases. Which tends -to be information you really for a stable framerate. Also the Irrlicht profiler -has a low overhead and affects only the areas which you want to time. So you -can profile applications with nearly original speed. - -Irrlicht itself has such profiling information, which is useful to figure out -where the runtime inside the engine is spend. To get that profiling data you -need to recompile Irrlicht with _IRR_COMPILE_WITH_PROFILING_ enabled as -collecting profiling information is disabled by default for speed reasons. -*/ - -/* - It's usually a good idea to wrap all your profile code with a define. - That way you don't have to worry too much about the runtime profiling - itself takes. You can remove the profiling code completely when you release - the software by removing a single define.Or sometimes you might want to - have several such defines for different areas of your application code. -*/ -#define ENABLE_MY_PROFILE // comment out to remove the profiling code -#ifdef ENABLE_MY_PROFILE - // calls code X - #define MY_PROFILE(X) X -#else - // removes the code for X in the pre-processor - #define MY_PROFILE(X) -#endif // IRR_PROFILE - -#include -#include "driverChoice.h" -#include "exampleHelper.h" - -#ifdef _MSC_VER -#pragma comment(lib, "Irrlicht.lib") -#endif - - -using namespace irr; -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -/* - We have the choice between working with fixed and with automatic profiling id's. - Here are some fixed ID's we will be using. -*/ -enum EProfiles -{ - EP_APP_TIME_ONCE, - EP_APP_TIME_UPDATED, - EP_SCOPE1, - EP_SCOPE2, - EP_DRAW_SCENE -}; - -// For our example scenes -enum EScenes -{ - ES_NONE, // no scene set - ES_CUBE, - ES_QUAKE_MAP, - ES_DWARVES, - - ES_COUNT // counting how many scenes we have -}; - -/* - Controlling the profiling display is application specific behavior. - We use function keys in our case and play around with all the parameters. - In real applications you will likely only need something to make the - profiling-display visible/invisible and switch pages while the parameters - can be set to fixed values. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - // constructor - MyEventReceiver(ISceneManager * smgr) : GuiProfiler(0), IncludeOverview(true), IgnoreUncalled(false), ActiveScene(ES_NONE), SceneManager(smgr) {} - - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_KEY_INPUT_EVENT) - { - if ( event.KeyInput.PressedDown ) - { - /* - Catching keys to control the profiling display and the profiler itself - */ - switch ( event.KeyInput.Key ) - { - case KEY_F1: - GuiProfiler->setVisible( !GuiProfiler->isVisible() ); - break; - case KEY_F2: - GuiProfiler->nextPage(IncludeOverview); - break; - case KEY_F3: - GuiProfiler->previousPage(IncludeOverview); - break; - case KEY_F4: - GuiProfiler->firstPage(IncludeOverview); - break; - case KEY_F5: - IncludeOverview = !IncludeOverview; - GuiProfiler->firstPage(IncludeOverview); // not strictly needed, but otherwise the update won't update - break; - case KEY_F6: - /* - You can set more filters. This one filters out profile data which was never called. - */ - IgnoreUncalled = !IgnoreUncalled; - GuiProfiler->setFilters(IgnoreUncalled ? 1 : 0, 0, 0.f, 0); - break; - case KEY_F7: - GuiProfiler->setShowGroupsTogether( !GuiProfiler->getShowGroupsTogether() ); - break; - case KEY_F8: - NextScene(); - break; - case KEY_F9: - { - u32 index = 0; - if ( getProfiler().findGroupIndex(index, L"grp runtime") ) - { - getProfiler().resetGroup(index); - } - } - break; - case KEY_F10: - { - u32 index = 0; - if ( getProfiler().findDataIndex(index, L"scope 3") ) - { - getProfiler().resetDataByIndex(index); - } - } - break; - case KEY_F11: - getProfiler().resetAll(); - break; - case KEY_KEY_F: - GuiProfiler->setFrozen(!GuiProfiler->getFrozen()); - break; - default: - break; - } - } - } - - return false; - } - - /* - Some example scenes so we have something to profile - */ - void NextScene() - { - SceneManager->clear(); - ActiveScene = (ActiveScene+1) % ES_COUNT; - if ( ActiveScene == 0 ) - ActiveScene = ActiveScene+1; - - switch ( ActiveScene ) - { - case ES_CUBE: - { - /* - Simple scene with cube and light. - */ - MY_PROFILE(CProfileScope p(L"cube", L"grp switch scene");) - - SceneManager->addCameraSceneNode (0, core::vector3df(0, 0, 0), - core::vector3df(0, 0, 100), - -1); - - SceneManager->addCubeSceneNode (30.0f, 0, -1, - core::vector3df(0, 20, 100), - core::vector3df(45, 45, 45), - core::vector3df(1.0f, 1.0f, 1.0f)); - - SceneManager->addLightSceneNode(0, core::vector3df(0, 0, 0), - video::SColorf(1.0f, 1.0f, 1.0f), - 100.0f); - } - break; - case ES_QUAKE_MAP: - { - /* - Our typical Irrlicht example quake map. - */ - MY_PROFILE(CProfileScope p(L"quake map", L"grp switch scene");) - - scene::IAnimatedMesh* mesh = SceneManager->getMesh("20kdm2.bsp"); - scene::ISceneNode* node = 0; - - if (mesh) - node = SceneManager->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024); - if (node) - node->setPosition(core::vector3df(-1300,-144,-1249)); - SceneManager->addCameraSceneNodeFPS(); - } - break; - case ES_DWARVES: - { - /* - Stress-test Irrlicht a little bit by creating many objects. - */ - MY_PROFILE(CProfileScope p(L"dwarfes", L"grp switch scene");) - - scene::IAnimatedMesh* aniMesh = SceneManager->getMesh( getExampleMediaPath() + "dwarf.x" ); - if (aniMesh) - { - scene::IMesh * mesh = aniMesh->getMesh (0); - if ( !mesh ) - break; - - /* - You can never have too many dwarves. So let's make some. - */ - const int nodesX = 30; - const int nodesY = 5; - const int nodesZ = 30; - - aabbox3df bbox = mesh->getBoundingBox(); - vector3df extent = bbox.getExtent(); - const f32 GAP = 10.f; - f32 halfSizeX = 0.5f * (nodesX*extent.X + GAP*(nodesX-1)); - f32 halfSizeY = 0.5f * (nodesY*extent.Y + GAP*(nodesY-1)); - f32 halfSizeZ = 0.5f * (nodesZ*extent.Z + GAP*(nodesZ-1)); - - for ( int x = 0; x < nodesX; ++x ) - { - irr::f32 gapX = x > 0 ? (x-1)*GAP : 0.f; - irr::f32 posX = -halfSizeX + x*extent.X + gapX; - for ( int y = 0; y < nodesY; ++y ) - { - irr::f32 gapY = y > 0 ? (y-1)*GAP : 0.f; - irr::f32 posY = -halfSizeY + y*extent.Y + gapY; - for ( int z=0; z < nodesZ; ++z ) - { - irr::f32 gapZ = z > 0 ? (z-1)*GAP : 0.f; - irr::f32 posZ = -halfSizeZ + z*extent.Z + gapZ; - scene::IAnimatedMeshSceneNode * node = SceneManager->addAnimatedMeshSceneNode(aniMesh, NULL, -1, vector3df(posX, posY, posZ) ); - node->setMaterialFlag(video::EMF_LIGHTING, false); - } - } - } - - irr::scene::ICameraSceneNode * camera = SceneManager->addCameraSceneNodeFPS(0, 20.f, 0.1f ); - camera->updateAbsolutePosition(); - camera->setTarget( vector3df(0,0,0) ); - camera->updateAbsolutePosition(); - camera->setPosition(irr::core::vector3df(halfSizeX+extent.X, halfSizeY+extent.Y, halfSizeZ+extent.Z)); - camera->updateAbsolutePosition(); - } - } - break; - } - } - - IGUIProfiler * GuiProfiler; - bool IncludeOverview; - bool IgnoreUncalled; - u32 ActiveScene; - scene::ISceneManager* SceneManager; -}; - -void recursive(int recursion) -{ - /* - As the profiler uses internally counters for start stop and only - takes profile data when that counter is zero we count all recursions - as a single call. - If you want to profile each call on it's own you have to use explicit start/stop calls and - stop the profile id right before the recursive call. - */ - MY_PROFILE(CProfileScope p3(L"recursive", L"grp runtime");) - if (recursion > 0 ) - recursive(recursion-1); -} - -int main() -{ - /* - Setup, nothing special here. - */ - video::E_DRIVER_TYPE driverType=driverChoiceConsole(); - if (driverType==video::EDT_COUNT) - return 1; - - /* - Profiler is independent of the device - so we can time the device setup - */ - MY_PROFILE(s32 pDev = getProfiler().add(L"createDevice", L"grp runtime");) - MY_PROFILE(getProfiler().start(pDev);) - - IrrlichtDevice * device = createDevice(driverType, core::dimension2d(640, 480)); - if (device == 0) - { - /* - When working with start/stop you should add a stop to all exit paths. - Although in this case it wouldn't matter as we don't do anything with it when we quit here. - */ - MY_PROFILE(getProfiler().stop(pDev);) - return 1; // could not create selected driver. - } - MY_PROFILE(getProfiler().stop(pDev);) - - video::IVideoDriver* driver = device->getVideoDriver(); - IGUIEnvironment* env = device->getGUIEnvironment(); - scene::ISceneManager* smgr = device->getSceneManager(); - - const io::path mediaPath = getExampleMediaPath(); - - /* - A map we use for one of our test-scenes. - */ - device->getFileSystem()->addFileArchive(mediaPath + "map-20kdm2.pk3"); - - MyEventReceiver receiver(smgr); - device->setEventReceiver(&receiver); - receiver.NextScene(); - - /* - Show some info about the controls used in this example - */ - IGUIStaticText * staticText = env->addStaticText( - L" to show/hide the profiling display\n" - L" to show the next page\n" - L" to show the previous page\n" - L" to show the first page\n" - L" to flip between including the group overview\n" - L" to flip between ignoring and showing uncalled data\n" - L" to flip between showing 1 group per page or all together\n" - L" to change our scene\n" - L" to reset the \"grp runtime\" data\n" - L" to reset the scope 3 data\n" - L" to reset all data\n" - L" to freeze/unfreeze the display\n" - , recti(10,10, 250, 140), true, true, 0, -1, true); - staticText->setWordWrap(false); - - /* - IGUIProfiler is can be used to show active profiling data at runtime. - */ - receiver.GuiProfiler = env->addProfilerDisplay(core::recti(40, 140, 600, 470)); - receiver.GuiProfiler->setDrawBackground(true); - - /* - Get a monospaced font - it's nicer when working with rows of numbers. - */ - IGUIFont* font = env->getFont(mediaPath + "fontcourier.bmp"); - if (font) - receiver.GuiProfiler->setOverrideFont(font); - - - /* - Adding ID's has to be done before the start/stop calls. - This allows start/stop to be really fast and we still have nice information like - names and groups. - Groups are created automatically each time an ID with a new group-name is added. - Groups exist to sort the display data in a nicer way. - */ - MY_PROFILE( - getProfiler().add(EP_APP_TIME_ONCE, L"full time", L"grp runtime"); - getProfiler().add(EP_APP_TIME_UPDATED, L"full time updated", L"grp runtime"); - getProfiler().add(EP_SCOPE1, L"scope 1", L"grp runtime"); - getProfiler().add(EP_DRAW_SCENE, L"draw scene", L"grp runtime"); - ) - - /* - Two timers which run the whole time. One will be continuously updated the other won't. - */ - MY_PROFILE(getProfiler().start(EP_APP_TIME_ONCE);) - MY_PROFILE(getProfiler().start(EP_APP_TIME_UPDATED);) - - s32 lastFPS = -1; - while(device->run() && driver) - { - if (device->isWindowActive()) - { - /* - For comparison show the FPS in the title bar - */ - s32 fps = driver->getFPS(); - if (lastFPS != fps) - { - core::stringw str = L"FPS: "; - str += fps; - device->setWindowCaption(str.c_str()); - lastFPS = fps; - } - - /* - Times are only updated on stop() calls. So if we want a long-running timer - to update we have to stop() and start() it in between. - Note that this will also update the call-counter and is rarely needed. - */ - MY_PROFILE(getProfiler().stop(EP_APP_TIME_UPDATED);) - MY_PROFILE(getProfiler().start(EP_APP_TIME_UPDATED);) - - /* - The following CProfileScope's will all do the same thing: - they measure the time this loop takes. They call start() - when the object is created and call stop() when it - is destroyed. - - The first one creates an ID on it's first call and will - do constant string-comparisons for the name. It's - the slowest, but most comfortable solution. Use it when you - just need to run a quick check without the hassle of setting - up id's. - */ - MY_PROFILE(CProfileScope p3(L"scope 3", L"grp runtime");) - - /* - Second CProfileScope solution will create a data block on first - call. So it's a little bit slower on the first run. But usually - that's hardly noticeable. - */ - MY_PROFILE(CProfileScope p2(EP_SCOPE2, L"scope 2", L"grp runtime");) - - /* - Last CProfileScope solution is the fastest one. But you must add - the id before you can use it like that. - */ - MY_PROFILE(CProfileScope p1(EP_SCOPE1)); - - /* - Call a recursive function to show how profiler only counts it once. - */ - recursive(5); - - driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,200,200,200)); - - /* - If you want to profile only some lines and not a complete scope - then you have to work with start() and stop() calls. - */ - MY_PROFILE(getProfiler().start(EP_DRAW_SCENE);) - smgr->drawAll(); - MY_PROFILE(getProfiler().stop(EP_DRAW_SCENE);) - - /* - If it doesn't matter if the profiler takes some time you can also - be lazy and create id's automatically on the spot: - */ - MY_PROFILE(s32 pEnv = getProfiler().add(L"draw env", L"grp runtime");) - MY_PROFILE(getProfiler().start(pEnv);) - env->drawAll(); - MY_PROFILE(getProfiler().stop(pEnv);) - - driver->endScene(); - } - } - - /* - Shutdown. - */ - device->drop(); - - /* - The profiler is independent of an device - so we can still work with it. - */ - - MY_PROFILE(getProfiler().stop(EP_APP_TIME_UPDATED)); - MY_PROFILE(getProfiler().stop(EP_APP_TIME_ONCE)); - - /* - Print a complete overview of the profiling data to the console. - */ - MY_PROFILE(core::stringw output); - MY_PROFILE(getProfiler().printAll(output)); - MY_PROFILE(printf("%s", core::stringc(output).c_str() )); - - return 0; -} - -/* -**/ diff --git a/examples/AutomatedTest/main.cpp b/examples/AutomatedTest/main.cpp index b155696c..386e14c8 100644 --- a/examples/AutomatedTest/main.cpp +++ b/examples/AutomatedTest/main.cpp @@ -45,18 +45,19 @@ int main(int argc, char *argv[]) const io::path mediaPath = getExampleMediaPath(); - scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "sydney.md2"); + scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "coolguy_opt.x"); if (!mesh) return 1; scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh); if (node) { node->setMaterialFlag(video::EMF_LIGHTING, false); - node->setMD2Animation(scene::EMAT_STAND); - node->setMaterialTexture(0, driver->getTexture(mediaPath + "sydney.bmp")); + node->setFrameLoop(0, 29); + node->setAnimationSpeed(30); + node->setMaterialTexture(0, driver->getTexture(mediaPath + "cooltexture.png")); } - smgr->addCameraSceneNode(0, core::vector3df(0,30,-40), core::vector3df(0,5,0)); + smgr->addCameraSceneNode(0, core::vector3df(0,4,5), core::vector3df(0,2,0)); s32 n = 0; SEvent event; diff --git a/examples/BuildAllExamples.workspace b/examples/BuildAllExamples.workspace deleted file mode 100644 index d5cb5827..00000000 --- a/examples/BuildAllExamples.workspace +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/BuildAllExamples.xcworkspace/contents.xcworkspacedata b/examples/BuildAllExamples.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index ae4d7b20..00000000 --- a/examples/BuildAllExamples.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/BuildAllExamples_vc10.sln b/examples/BuildAllExamples_vc10.sln deleted file mode 100644 index 27618b7c..00000000 --- a/examples/BuildAllExamples_vc10.sln +++ /dev/null @@ -1,437 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Irrlicht", "..\source\Irrlicht\Irrlicht10.0.vcxproj", "{E08E042A-6C45-411B-92BE-3CC31331019F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01.HelloWorld", "01.HelloWorld\HelloWorld_vc10.vcxproj", "{5AD4C95C-BA38-4692-BA4B-8C25A86208F9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02.Quake3Map", "02.Quake3Map\Quake3Map_vc10.vcxproj", "{D1A464A2-D479-458C-98A2-60965D823CD1}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03.CustomSceneNode", "03.CustomSceneNode\CustomSceneNode_vc10.vcxproj", "{171CCDFA-C140-4956-8EB7-F0168F4521D3}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.Movement", "04.Movement\Movement_vc10.vcxproj", "{7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "05.UserInterface", "05.UserInterface\UserInterface_vc10.vcxproj", "{622C9DD7-0391-49FF-AF53-24F9D5A8EC53}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06.2DGraphics", "06.2DGraphics\2DGraphics_vc10.vcxproj", "{E71B6F18-10DC-4101-A541-F6D33F71B2BD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.Collision", "07.Collision\Collision_vc10.vcxproj", "{3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.SpecialFX", "08.SpecialFX\SpecialFX_vc10.vcxproj", "{C869BF55-B9D6-4980-BC92-60FA0CF8411A}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "09.Meshviewer", "09.Meshviewer\Meshviewer_vc10.vcxproj", "{2AE24484-22FC-481B-9A40-7CD0DA5C8E06}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "10.Shaders", "10.Shaders\Shaders_vc10.vcxproj", "{27158C82-CD15-4A9B-9848-35E7065B209F}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "11.PerPixelLighting", "11.PerPixelLighting\PerPixelLighting_vc10.vcxproj", "{C4B42409-542D-4EFC-9E6B-44713FD47A33}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "12.TerrainRendering", "12.TerrainRendering\TerrainRendering_vc10.vcxproj", "{3A5B74E5-6390-43B0-A459-2793B81FFD31}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "13.RenderToTexture", "13.RenderToTexture\RenderToTexture_vc10.vcxproj", "{0914E5C8-5352-467B-8421-C9EB35BD5596}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "14.Win32Window", "14.Win32Window\Win32Window_vc10.vcxproj", "{772FBE05-D05A-467B-9842-BEC409EEA8D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "15.LoadIrrFile", "15.LoadIrrFile\LoadIrrFile_vc10.vcxproj", "{78C9F424-523C-49AC-94B7-823AA4A26BF9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16.Quake3MapShader", "16.Quake3MapShader\Quake3MapShader_vc10.vcxproj", "{EB3B38EA-5CE7-4983-845B-880661E69D09}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17.HelloWorld_Mobile", "17.HelloWorld_Mobile\17. HelloWorld for Windows Mobile on PC_vc10.vcxproj", "{2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "18.SplitScreen", "18.SplitScreen\SplitScreen_vc10.vcxproj", "{1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "19.MouseAndJoystick", "19.MouseAndJoystick\MouseAndJoystick_vc10.vcxproj", "{FE853A36-E0D1-4AC5-A792-B643E70D2953}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "20.ManagedLights", "20.ManagedLights\ManagedLights_vc10.vcxproj", "{16007FE2-142B-47F8-93E1-519BA3F39E71}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "21.Quake3Explorer", "21.Quake3Explorer\Quake3Explorer_vc10.vcxproj", "{CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "22.MaterialViewer", "22.MaterialViewer\MaterialViewer_vc10.vcxproj", "{4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "23.SMeshHandling", "23.SMeshHandling\SMeshHandling_vc10.vcxproj", "{6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "24.CursorControl", "24.CursorControl\CursorControl_vc10.vcxproj", "{02B67A37-50E1-49DB-BECF-905BC029C2FE}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo_vc10.vcxproj", "{6F076455-D955-45D4-9C68-4AD4E45F2D47}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUIEditor", "..\tools\GUIEditor\GUI Editor_vc10.vcxproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FontTool", "..\tools\IrrFontTool\newFontTool\irrFontTool_vc10.vcxproj", "{4D53E40F-37E3-42B1-8848-F4C6F8313A17}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MeshConverter", "..\tools\MeshConverter\MeshConverter_vc10.vcxproj", "{E72B637E-4AA6-46F3-885F-AC67B4B470ED}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "26.OcclusionQuery", "26.OcclusionQuery\OcclusionQuery_vc10.vcxproj", "{5CE0E2E7-879D-4152-B61D-24E7D0707B45}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "25.XmlHandling", "25.XmlHandling\XmlHandling_vc10.vcxproj", "{8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "30.Profiling", "30.Profiling\Profiling_vc10.vcxproj", "{65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "27.PostProcessing", "27.PostProcessing\PostProcessing_vc10.vcxproj", "{2B885150-210F-4CA7-957E-2C3D75974308}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "28.CubeMapping", "28.CubeMapping\CubeMapping_vc10.vcxproj", "{9A2CE404-75E2-4195-837D-BED5B0FF3FA7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.ActiveCfg = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.Build.0 = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.ActiveCfg = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.Build.0 = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.ActiveCfg = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.Build.0 = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.ActiveCfg = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.Build.0 = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|Win32.ActiveCfg = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|Win32.Build.0 = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|x64.ActiveCfg = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|x64.Build.0 = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|Win32.ActiveCfg = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|Win32.Build.0 = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|x64.ActiveCfg = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.Build.0 = Release|x64 - {2B885150-210F-4CA7-957E-2C3D75974308}.Debug|Win32.ActiveCfg = Debug|Win32 - {2B885150-210F-4CA7-957E-2C3D75974308}.Debug|Win32.Build.0 = Debug|Win32 - {2B885150-210F-4CA7-957E-2C3D75974308}.Debug|x64.ActiveCfg = Debug|x64 - {2B885150-210F-4CA7-957E-2C3D75974308}.Debug|x64.Build.0 = Debug|x64 - {2B885150-210F-4CA7-957E-2C3D75974308}.Release|Win32.ActiveCfg = Release|Win32 - {2B885150-210F-4CA7-957E-2C3D75974308}.Release|Win32.Build.0 = Release|Win32 - {2B885150-210F-4CA7-957E-2C3D75974308}.Release|x64.ActiveCfg = Release|x64 - {2B885150-210F-4CA7-957E-2C3D75974308}.Release|x64.Build.0 = Release|x64 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Debug|Win32.ActiveCfg = Debug|Win32 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Debug|Win32.Build.0 = Debug|Win32 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Debug|x64.ActiveCfg = Debug|x64 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Debug|x64.Build.0 = Debug|x64 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Release|Win32.ActiveCfg = Release|Win32 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Release|Win32.Build.0 = Release|Win32 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Release|x64.ActiveCfg = Release|x64 - {9A2CE404-75E2-4195-837D-BED5B0FF3FA7}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/BuildAllExamples_vc11.sln b/examples/BuildAllExamples_vc11.sln deleted file mode 100644 index 6b5b06e2..00000000 --- a/examples/BuildAllExamples_vc11.sln +++ /dev/null @@ -1,440 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Irrlicht", "..\source\Irrlicht\Irrlicht11.0.vcxproj", "{E08E042A-6C45-411B-92BE-3CC31331019F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01.HelloWorld", "01.HelloWorld\HelloWorld_vc11.vcxproj", "{5AD4C95C-BA38-4692-BA4B-8C25A86208F9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02.Quake3Map", "02.Quake3Map\Quake3Map_vc11.vcxproj", "{D1A464A2-D479-458C-98A2-60965D823CD1}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03.CustomSceneNode", "03.CustomSceneNode\CustomSceneNode_vc11.vcxproj", "{171CCDFA-C140-4956-8EB7-F0168F4521D3}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.Movement", "04.Movement\Movement_vc11.vcxproj", "{7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "05.UserInterface", "05.UserInterface\UserInterface_vc11.vcxproj", "{622C9DD7-0391-49FF-AF53-24F9D5A8EC53}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06.2DGraphics", "06.2DGraphics\2DGraphics_vc11.vcxproj", "{E71B6F18-10DC-4101-A541-F6D33F71B2BD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.Collision", "07.Collision\Collision_vc11.vcxproj", "{3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.SpecialFX", "08.SpecialFX\SpecialFX_vc11.vcxproj", "{C869BF55-B9D6-4980-BC92-60FA0CF8411A}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "09.Meshviewer", "09.Meshviewer\Meshviewer_vc11.vcxproj", "{2AE24484-22FC-481B-9A40-7CD0DA5C8E06}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "10.Shaders", "10.Shaders\Shaders_vc11.vcxproj", "{27158C82-CD15-4A9B-9848-35E7065B209F}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "11.PerPixelLighting", "11.PerPixelLighting\PerPixelLighting_vc11.vcxproj", "{C4B42409-542D-4EFC-9E6B-44713FD47A33}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "12.TerrainRendering", "12.TerrainRendering\TerrainRendering_vc11.vcxproj", "{3A5B74E5-6390-43B0-A459-2793B81FFD31}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "13.RenderToTexture", "13.RenderToTexture\RenderToTexture_vc11.vcxproj", "{0914E5C8-5352-467B-8421-C9EB35BD5596}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "14.Win32Window", "14.Win32Window\Win32Window_vc11.vcxproj", "{772FBE05-D05A-467B-9842-BEC409EEA8D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "15.LoadIrrFile", "15.LoadIrrFile\LoadIrrFile_vc11.vcxproj", "{78C9F424-523C-49AC-94B7-823AA4A26BF9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16.Quake3MapShader", "16.Quake3MapShader\Quake3MapShader_vc11.vcxproj", "{EB3B38EA-5CE7-4983-845B-880661E69D09}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17.HelloWorld_Mobile", "17.HelloWorld_Mobile\17. HelloWorld for Windows Mobile on PC_vc11.vcxproj", "{2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "18.SplitScreen", "18.SplitScreen\SplitScreen_vc11.vcxproj", "{1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "19.MouseAndJoystick", "19.MouseAndJoystick\MouseAndJoystick_vc11.vcxproj", "{FE853A36-E0D1-4AC5-A792-B643E70D2953}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "20.ManagedLights", "20.ManagedLights\ManagedLights_vc11.vcxproj", "{16007FE2-142B-47F8-93E1-519BA3F39E71}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "21.Quake3Explorer", "21.Quake3Explorer\Quake3Explorer_vc11.vcxproj", "{CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "22.MaterialViewer", "22.MaterialViewer\MaterialViewer_vc11.vcxproj", "{4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "23.SMeshHandling", "23.SMeshHandling\SMeshHandling_vc11.vcxproj", "{6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "24.CursorControl", "24.CursorControl\CursorControl_vc11.vcxproj", "{02B67A37-50E1-49DB-BECF-905BC029C2FE}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo_vc11.vcxproj", "{6F076455-D955-45D4-9C68-4AD4E45F2D47}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUIEditor", "..\tools\GUIEditor\GUI Editor_vc11.vcxproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FontTool", "..\tools\IrrFontTool\newFontTool\irrFontTool_vc11.vcxproj", "{4D53E40F-37E3-42B1-8848-F4C6F8313A17}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MeshConverter", "..\tools\MeshConverter\MeshConverter_vc11.vcxproj", "{E72B637E-4AA6-46F3-885F-AC67B4B470ED}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "26.OcclusionQuery", "26.OcclusionQuery\OcclusionQuery_vc11.vcxproj", "{5CE0E2E7-879D-4152-B61D-24E7D0707B45}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "25.XmlHandling", "25.XmlHandling\XmlHandling_vc11.vcxproj", "{8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "30.Profiling", "30.Profiling\Profiling_vc11.vcxproj", "{65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "27.PostProcessing", "27.PostProcessing\PostProcessing_vc11.vcxproj", "{F864F96D-F6AE-43E2-9A12-218B1A081255}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "28.CubeMapping", "28.CubeMapping\CubeMapping_vc11.vcxproj", "{3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.ActiveCfg = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.Build.0 = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.ActiveCfg = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.Build.0 = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.ActiveCfg = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.Build.0 = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.ActiveCfg = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.Build.0 = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|Win32.ActiveCfg = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|Win32.Build.0 = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|x64.ActiveCfg = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|x64.Build.0 = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|Win32.ActiveCfg = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|Win32.Build.0 = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|x64.ActiveCfg = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.Build.0 = Release|x64 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Debug|Win32.ActiveCfg = Debug|Win32 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Debug|Win32.Build.0 = Debug|Win32 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Debug|x64.ActiveCfg = Debug|x64 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Debug|x64.Build.0 = Debug|x64 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Release|Win32.ActiveCfg = Release|Win32 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Release|Win32.Build.0 = Release|Win32 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Release|x64.ActiveCfg = Release|x64 - {F864F96D-F6AE-43E2-9A12-218B1A081255}.Release|x64.Build.0 = Release|x64 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Debug|Win32.ActiveCfg = Debug|Win32 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Debug|Win32.Build.0 = Debug|Win32 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Debug|x64.ActiveCfg = Debug|x64 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Debug|x64.Build.0 = Debug|x64 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Release|Win32.ActiveCfg = Release|Win32 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Release|Win32.Build.0 = Release|Win32 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Release|x64.ActiveCfg = Release|x64 - {3DAD16DC-3D80-46EA-ADD8-C4418CEDE553}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/BuildAllExamples_vc12.sln b/examples/BuildAllExamples_vc12.sln deleted file mode 100644 index a6786e25..00000000 --- a/examples/BuildAllExamples_vc12.sln +++ /dev/null @@ -1,1132 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01.HelloWorld", "01.HelloWorld\HelloWorld_vc12.vcxproj", "{5AD4C95C-BA38-4692-BA4B-8C25A86208F9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02.Quake3Map", "02.Quake3Map\Quake3Map_vc12.vcxproj", "{D1A464A2-D479-458C-98A2-60965D823CD1}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03.CustomSceneNode", "03.CustomSceneNode\CustomSceneNode_vc12.vcxproj", "{171CCDFA-C140-4956-8EB7-F0168F4521D3}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.Movement", "04.Movement\Movement_vc12.vcxproj", "{7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "05.UserInterface", "05.UserInterface\UserInterface_vc12.vcxproj", "{622C9DD7-0391-49FF-AF53-24F9D5A8EC53}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06.2DGraphics", "06.2DGraphics\2DGraphics_vc12.vcxproj", "{E71B6F18-10DC-4101-A541-F6D33F71B2BD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.Collision", "07.Collision\Collision_vc12.vcxproj", "{3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.SpecialFX", "08.SpecialFX\SpecialFX_vc12.vcxproj", "{C869BF55-B9D6-4980-BC92-60FA0CF8411A}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "09.Meshviewer", "09.Meshviewer\Meshviewer_vc12.vcxproj", "{2AE24484-22FC-481B-9A40-7CD0DA5C8E06}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "10.Shaders", "10.Shaders\Shaders_vc12.vcxproj", "{27158C82-CD15-4A9B-9848-35E7065B209F}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "11.PerPixelLighting", "11.PerPixelLighting\PerPixelLighting_vc12.vcxproj", "{C4B42409-542D-4EFC-9E6B-44713FD47A33}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "12.TerrainRendering", "12.TerrainRendering\TerrainRendering_vc12.vcxproj", "{3A5B74E5-6390-43B0-A459-2793B81FFD31}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "13.RenderToTexture", "13.RenderToTexture\RenderToTexture_vc12.vcxproj", "{0914E5C8-5352-467B-8421-C9EB35BD5596}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "14.Win32Window", "14.Win32Window\Win32Window_vc12.vcxproj", "{772FBE05-D05A-467B-9842-BEC409EEA8D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "15.LoadIrrFile", "15.LoadIrrFile\LoadIrrFile_vc12.vcxproj", "{78C9F424-523C-49AC-94B7-823AA4A26BF9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16.Quake3MapShader", "16.Quake3MapShader\Quake3MapShader_vc12.vcxproj", "{EB3B38EA-5CE7-4983-845B-880661E69D09}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17.HelloWorld_Mobile", "17.HelloWorld_Mobile\17. HelloWorld for Windows Mobile on PC_vc12.vcxproj", "{2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "18.SplitScreen", "18.SplitScreen\SplitScreen_vc12.vcxproj", "{1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "19.MouseAndJoystick", "19.MouseAndJoystick\MouseAndJoystick_vc12.vcxproj", "{FE853A36-E0D1-4AC5-A792-B643E70D2953}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "20.ManagedLights", "20.ManagedLights\ManagedLights_vc12.vcxproj", "{16007FE2-142B-47F8-93E1-519BA3F39E71}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "21.Quake3Explorer", "21.Quake3Explorer\Quake3Explorer_vc12.vcxproj", "{CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "22.MaterialViewer", "22.MaterialViewer\MaterialViewer_vc12.vcxproj", "{4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "23.SMeshHandling", "23.SMeshHandling\SMeshHandling_vc12.vcxproj", "{6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "24.CursorControl", "24.CursorControl\CursorControl_vc12.vcxproj", "{02B67A37-50E1-49DB-BECF-905BC029C2FE}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "25.XmlHandling", "25.XmlHandling\XmlHandling_vc12.vcxproj", "{8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "26.OcclusionQuery", "26.OcclusionQuery\OcclusionQuery_vc12.vcxproj", "{5CE0E2E7-879D-4152-B61D-24E7D0707B45}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "30.Profiling", "30.Profiling\Profiling_vc12.vcxproj", "{65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUIEditor", "..\tools\GUIEditor\GUI Editor_vc12.vcxproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FontTool", "..\tools\IrrFontTool\newFontTool\irrFontTool_vc12.vcxproj", "{4D53E40F-37E3-42B1-8848-F4C6F8313A17}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MeshConverter", "..\tools\MeshConverter\MeshConverter_vc12.vcxproj", "{E72B637E-4AA6-46F3-885F-AC67B4B470ED}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo_vc12.vcxproj", "{6F076455-D955-45D4-9C68-4AD4E45F2D47}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Irrlicht", "..\source\Irrlicht\Irrlicht12.0.vcxproj", "{E08E042A-6C45-411B-92BE-3CC31331019F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "27.PostProcessing", "27.PostProcessing\PostProcessing_vc12.vcxproj", "{17E74625-568E-4008-897E-CAD12A332B0C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "28.CubeMapping", "28.CubeMapping\CubeMapping_vc12.vcxproj", "{1FDD5E75-9EB3-4467-B672-0BFC105B84A5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release - Fast FPU|Win32 = Release - Fast FPU|Win32 - Release - Fast FPU|x64 = Release - Fast FPU|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - SDL-Debug|Win32 = SDL-Debug|Win32 - SDL-Debug|x64 = SDL-Debug|x64 - Static lib - Debug|Win32 = Static lib - Debug|Win32 - Static lib - Debug|x64 = Static lib - Debug|x64 - Static lib - Release - Fast FPU|Win32 = Static lib - Release - Fast FPU|Win32 - Static lib - Release - Fast FPU|x64 = Static lib - Release - Fast FPU|x64 - Static lib - Release|Win32 = Static lib - Release|Win32 - Static lib - Release|x64 = Static lib - Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|x64.Build.0 = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|Win32.ActiveCfg = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|Win32.Build.0 = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|x64.ActiveCfg = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Debug|x64.Build.0 = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release - Fast FPU|x64.Build.0 = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|Win32.ActiveCfg = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|Win32.Build.0 = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|x64.ActiveCfg = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Release|x64.Build.0 = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.SDL-Debug|x64.Build.0 = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Debug|x64.Build.0 = Debug|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release|Win32.Build.0 = Release|Win32 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release|x64.ActiveCfg = Release|x64 - {2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}.Static lib - Release|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|x64.Build.0 = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.ActiveCfg = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.Build.0 = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.ActiveCfg = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.Build.0 = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|Win32.ActiveCfg = Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|Win32.Build.0 = Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|x64.ActiveCfg = Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|x64.Build.0 = Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.ActiveCfg = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.Build.0 = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.ActiveCfg = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.Build.0 = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|Win32.ActiveCfg = SDL-Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|Win32.Build.0 = SDL-Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|x64.ActiveCfg = SDL-Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|x64.Build.0 = SDL-Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|Win32.ActiveCfg = Static lib - Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|Win32.Build.0 = Static lib - Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|x64.ActiveCfg = Static lib - Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|x64.Build.0 = Static lib - Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Static lib - Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|Win32.Build.0 = Static lib - Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|x64.ActiveCfg = Static lib - Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|x64.Build.0 = Static lib - Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|Win32.ActiveCfg = Static lib - Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|Win32.Build.0 = Static lib - Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|x64.ActiveCfg = Static lib - Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|x64.Build.0 = Static lib - Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Debug|Win32.ActiveCfg = Debug|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Debug|Win32.Build.0 = Debug|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Debug|x64.ActiveCfg = Debug|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Debug|x64.Build.0 = Debug|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release - Fast FPU|x64.Build.0 = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release|Win32.ActiveCfg = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release|Win32.Build.0 = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release|x64.ActiveCfg = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Release|x64.Build.0 = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.SDL-Debug|x64.Build.0 = Debug|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Debug|x64.Build.0 = Debug|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release|Win32.Build.0 = Release|Win32 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release|x64.ActiveCfg = Release|x64 - {17E74625-568E-4008-897E-CAD12A332B0C}.Static lib - Release|x64.Build.0 = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Debug|Win32.ActiveCfg = Debug|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Debug|Win32.Build.0 = Debug|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Debug|x64.ActiveCfg = Debug|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Debug|x64.Build.0 = Debug|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release - Fast FPU|x64.Build.0 = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release|Win32.ActiveCfg = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release|Win32.Build.0 = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release|x64.ActiveCfg = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Release|x64.Build.0 = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.SDL-Debug|x64.Build.0 = Debug|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Debug|x64.Build.0 = Debug|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release|Win32.Build.0 = Release|Win32 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release|x64.ActiveCfg = Release|x64 - {1FDD5E75-9EB3-4467-B672-0BFC105B84A5}.Static lib - Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/BuildAllExamples_vc14.sln b/examples/BuildAllExamples_vc14.sln deleted file mode 100644 index 4766c3b5..00000000 --- a/examples/BuildAllExamples_vc14.sln +++ /dev/null @@ -1,1099 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "01.HelloWorld", "01.HelloWorld\HelloWorld_vc14.vcxproj", "{5AD4C95C-BA38-4692-BA4B-8C25A86208F9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "02.Quake3Map", "02.Quake3Map\Quake3Map_vc14.vcxproj", "{D1A464A2-D479-458C-98A2-60965D823CD1}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03.CustomSceneNode", "03.CustomSceneNode\CustomSceneNode_vc14.vcxproj", "{171CCDFA-C140-4956-8EB7-F0168F4521D3}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.Movement", "04.Movement\Movement_vc14.vcxproj", "{7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "05.UserInterface", "05.UserInterface\UserInterface_vc14.vcxproj", "{622C9DD7-0391-49FF-AF53-24F9D5A8EC53}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06.2DGraphics", "06.2DGraphics\2DGraphics_vc14.vcxproj", "{E71B6F18-10DC-4101-A541-F6D33F71B2BD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.Collision", "07.Collision\Collision_vc14.vcxproj", "{3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "08.SpecialFX", "08.SpecialFX\SpecialFX_vc14.vcxproj", "{C869BF55-B9D6-4980-BC92-60FA0CF8411A}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "09.Meshviewer", "09.Meshviewer\Meshviewer_vc14.vcxproj", "{2AE24484-22FC-481B-9A40-7CD0DA5C8E06}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "10.Shaders", "10.Shaders\Shaders_vc14.vcxproj", "{27158C82-CD15-4A9B-9848-35E7065B209F}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "11.PerPixelLighting", "11.PerPixelLighting\PerPixelLighting_vc14.vcxproj", "{C4B42409-542D-4EFC-9E6B-44713FD47A33}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "12.TerrainRendering", "12.TerrainRendering\TerrainRendering_vc14.vcxproj", "{3A5B74E5-6390-43B0-A459-2793B81FFD31}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "13.RenderToTexture", "13.RenderToTexture\RenderToTexture_vc14.vcxproj", "{0914E5C8-5352-467B-8421-C9EB35BD5596}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "14.Win32Window", "14.Win32Window\Win32Window_vc14.vcxproj", "{772FBE05-D05A-467B-9842-BEC409EEA8D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "15.LoadIrrFile", "15.LoadIrrFile\LoadIrrFile_vc14.vcxproj", "{78C9F424-523C-49AC-94B7-823AA4A26BF9}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "16.Quake3MapShader", "16.Quake3MapShader\Quake3MapShader_vc14.vcxproj", "{EB3B38EA-5CE7-4983-845B-880661E69D09}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "18.SplitScreen", "18.SplitScreen\SplitScreen_vc14.vcxproj", "{1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "19.MouseAndJoystick", "19.MouseAndJoystick\MouseAndJoystick_vc14.vcxproj", "{FE853A36-E0D1-4AC5-A792-B643E70D2953}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "20.ManagedLights", "20.ManagedLights\ManagedLights_vc14.vcxproj", "{16007FE2-142B-47F8-93E1-519BA3F39E71}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "21.Quake3Explorer", "21.Quake3Explorer\Quake3Explorer_vc14.vcxproj", "{CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "22.MaterialViewer", "22.MaterialViewer\MaterialViewer_vc14.vcxproj", "{4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "23.SMeshHandling", "23.SMeshHandling\SMeshHandling_vc14.vcxproj", "{6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "24.CursorControl", "24.CursorControl\CursorControl_vc14.vcxproj", "{02B67A37-50E1-49DB-BECF-905BC029C2FE}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "25.XmlHandling", "25.XmlHandling\XmlHandling_vc14.vcxproj", "{8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "26.OcclusionQuery", "26.OcclusionQuery\OcclusionQuery_vc14.vcxproj", "{5CE0E2E7-879D-4152-B61D-24E7D0707B45}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "30.Profiling", "30.Profiling\Profiling_vc14.vcxproj", "{65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUIEditor", "..\tools\GUIEditor\GUI Editor_vc14.vcxproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FontTool", "..\tools\IrrFontTool\newFontTool\irrFontTool_vc14.vcxproj", "{4D53E40F-37E3-42B1-8848-F4C6F8313A17}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MeshConverter", "..\tools\MeshConverter\MeshConverter_vc14.vcxproj", "{E72B637E-4AA6-46F3-885F-AC67B4B470ED}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo_vc14.vcxproj", "{6F076455-D955-45D4-9C68-4AD4E45F2D47}" - ProjectSection(ProjectDependencies) = postProject - {E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Irrlicht", "..\source\Irrlicht\Irrlicht14.0.vcxproj", "{E08E042A-6C45-411B-92BE-3CC31331019F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "27.PostProcessing", "27.PostProcessing\PostProcessing_vc14.vcxproj", "{F25F2AC4-AEDA-4A95-9769-01A2652B54A2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "28.CubeMapping", "28.CubeMapping\CubeMapping_vc14.vcxproj", "{DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release - Fast FPU|Win32 = Release - Fast FPU|Win32 - Release - Fast FPU|x64 = Release - Fast FPU|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - SDL-Debug|Win32 = SDL-Debug|Win32 - SDL-Debug|x64 = SDL-Debug|x64 - Static lib - Debug|Win32 = Static lib - Debug|Win32 - Static lib - Debug|x64 = Static lib - Debug|x64 - Static lib - Release - Fast FPU|Win32 = Static lib - Release - Fast FPU|Win32 - Static lib - Release - Fast FPU|x64 = Static lib - Release - Fast FPU|x64 - Static lib - Release|Win32 = Static lib - Release|Win32 - Static lib - Release|x64 = Static lib - Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release - Fast FPU|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Release|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.SDL-Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Debug|x64.Build.0 = Debug|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|Win32.Build.0 = Release|Win32 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|x64.ActiveCfg = Release|x64 - {5AD4C95C-BA38-4692-BA4B-8C25A86208F9}.Static lib - Release|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release - Fast FPU|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Release|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.SDL-Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Debug|x64.Build.0 = Debug|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|Win32.Build.0 = Release|Win32 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|x64.ActiveCfg = Release|x64 - {D1A464A2-D479-458C-98A2-60965D823CD1}.Static lib - Release|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release - Fast FPU|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Release|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.SDL-Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Debug|x64.Build.0 = Debug|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|Win32.Build.0 = Release|Win32 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|x64.ActiveCfg = Release|x64 - {171CCDFA-C140-4956-8EB7-F0168F4521D3}.Static lib - Release|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release - Fast FPU|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Release|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.SDL-Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Debug|x64.Build.0 = Debug|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|Win32.Build.0 = Release|Win32 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|x64.ActiveCfg = Release|x64 - {7BDBB7E8-E0C9-4A0D-83C1-D389D6140FEF}.Static lib - Release|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release - Fast FPU|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Release|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.SDL-Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Debug|x64.Build.0 = Debug|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|Win32.Build.0 = Release|Win32 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|x64.ActiveCfg = Release|x64 - {622C9DD7-0391-49FF-AF53-24F9D5A8EC53}.Static lib - Release|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release - Fast FPU|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Release|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.SDL-Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Debug|x64.Build.0 = Debug|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|Win32.Build.0 = Release|Win32 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|x64.ActiveCfg = Release|x64 - {E71B6F18-10DC-4101-A541-F6D33F71B2BD}.Static lib - Release|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release - Fast FPU|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Release|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.SDL-Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Debug|x64.Build.0 = Debug|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|Win32.Build.0 = Release|Win32 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|x64.ActiveCfg = Release|x64 - {3E30297B-5BE3-4A5C-B31E-08A28ADDB29E}.Static lib - Release|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release - Fast FPU|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Release|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.SDL-Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Debug|x64.Build.0 = Debug|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|Win32.Build.0 = Release|Win32 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|x64.ActiveCfg = Release|x64 - {C869BF55-B9D6-4980-BC92-60FA0CF8411A}.Static lib - Release|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release - Fast FPU|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Release|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.SDL-Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Debug|x64.Build.0 = Debug|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|Win32.Build.0 = Release|Win32 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|x64.ActiveCfg = Release|x64 - {2AE24484-22FC-481B-9A40-7CD0DA5C8E06}.Static lib - Release|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release - Fast FPU|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Release|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.SDL-Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Debug|x64.Build.0 = Debug|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|Win32.Build.0 = Release|Win32 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|x64.ActiveCfg = Release|x64 - {27158C82-CD15-4A9B-9848-35E7065B209F}.Static lib - Release|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release - Fast FPU|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Release|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.SDL-Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Debug|x64.Build.0 = Debug|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|Win32.Build.0 = Release|Win32 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|x64.ActiveCfg = Release|x64 - {C4B42409-542D-4EFC-9E6B-44713FD47A33}.Static lib - Release|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release - Fast FPU|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Release|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.SDL-Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Debug|x64.Build.0 = Debug|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|Win32.Build.0 = Release|Win32 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|x64.ActiveCfg = Release|x64 - {3A5B74E5-6390-43B0-A459-2793B81FFD31}.Static lib - Release|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release - Fast FPU|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Release|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.SDL-Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Debug|x64.Build.0 = Debug|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|Win32.Build.0 = Release|Win32 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|x64.ActiveCfg = Release|x64 - {0914E5C8-5352-467B-8421-C9EB35BD5596}.Static lib - Release|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release - Fast FPU|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Release|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.SDL-Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Debug|x64.Build.0 = Debug|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|Win32.Build.0 = Release|Win32 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|x64.ActiveCfg = Release|x64 - {772FBE05-D05A-467B-9842-BEC409EEA8D0}.Static lib - Release|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release - Fast FPU|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Release|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.SDL-Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Debug|x64.Build.0 = Debug|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|Win32.Build.0 = Release|Win32 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|x64.ActiveCfg = Release|x64 - {78C9F424-523C-49AC-94B7-823AA4A26BF9}.Static lib - Release|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release - Fast FPU|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Release|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.SDL-Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Debug|x64.Build.0 = Debug|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|Win32.Build.0 = Release|Win32 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|x64.ActiveCfg = Release|x64 - {EB3B38EA-5CE7-4983-845B-880661E69D09}.Static lib - Release|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release - Fast FPU|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Release|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.SDL-Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Debug|x64.Build.0 = Debug|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|Win32.Build.0 = Release|Win32 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|x64.ActiveCfg = Release|x64 - {1AB9413E-4F53-42A3-8CB2-CB4BE22336D0}.Static lib - Release|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release - Fast FPU|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Release|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.SDL-Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Debug|x64.Build.0 = Debug|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|Win32.Build.0 = Release|Win32 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|x64.ActiveCfg = Release|x64 - {FE853A36-E0D1-4AC5-A792-B643E70D2953}.Static lib - Release|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release - Fast FPU|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Release|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.SDL-Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Debug|x64.Build.0 = Debug|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|Win32.Build.0 = Release|Win32 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|x64.ActiveCfg = Release|x64 - {16007FE2-142B-47F8-93E1-519BA3F39E71}.Static lib - Release|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release - Fast FPU|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Release|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.SDL-Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Debug|x64.Build.0 = Debug|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|Win32.Build.0 = Release|Win32 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|x64.ActiveCfg = Release|x64 - {CDC4AAA9-72E1-4FFA-A04D-7EF59D8B97CD}.Static lib - Release|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release - Fast FPU|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Release|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.SDL-Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Debug|x64.Build.0 = Debug|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|Win32.Build.0 = Release|Win32 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|x64.ActiveCfg = Release|x64 - {4E6C2F8D-BA92-4C5B-96FD-72D4FE8BD7FA}.Static lib - Release|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release - Fast FPU|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Release|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.SDL-Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Debug|x64.Build.0 = Debug|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|Win32.Build.0 = Release|Win32 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|x64.ActiveCfg = Release|x64 - {6AEC2AA2-C9FF-4B7D-B07A-94A9D34B41D7}.Static lib - Release|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release - Fast FPU|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Release|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.SDL-Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Debug|x64.Build.0 = Debug|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|Win32.Build.0 = Release|Win32 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|x64.ActiveCfg = Release|x64 - {02B67A37-50E1-49DB-BECF-905BC029C2FE}.Static lib - Release|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release - Fast FPU|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Release|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.SDL-Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Debug|x64.Build.0 = Debug|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|Win32.Build.0 = Release|Win32 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|x64.ActiveCfg = Release|x64 - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E}.Static lib - Release|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release - Fast FPU|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Release|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.SDL-Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Debug|x64.Build.0 = Debug|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|Win32.Build.0 = Release|Win32 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|x64.ActiveCfg = Release|x64 - {5CE0E2E7-879D-4152-B61D-24E7D0707B45}.Static lib - Release|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release - Fast FPU|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Release|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.SDL-Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Debug|x64.Build.0 = Debug|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|Win32.Build.0 = Release|Win32 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|x64.ActiveCfg = Release|x64 - {65D9DE2E-B73E-4ADF-96D1-BF4A8B7F4F97}.Static lib - Release|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release - Fast FPU|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.SDL-Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Debug|x64.Build.0 = Debug|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|Win32.Build.0 = Release|Win32 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|x64.ActiveCfg = Release|x64 - {853A396E-C031-4C26-A716-5B4E176BE11D}.Static lib - Release|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release - Fast FPU|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.SDL-Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Debug|x64.Build.0 = Debug|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|Win32.Build.0 = Release|Win32 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|x64.ActiveCfg = Release|x64 - {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Static lib - Release|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release - Fast FPU|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Release|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.SDL-Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Debug|x64.Build.0 = Debug|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|Win32.Build.0 = Release|Win32 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|x64.ActiveCfg = Release|x64 - {E72B637E-4AA6-46F3-885F-AC67B4B470ED}.Static lib - Release|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release - Fast FPU|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Release|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.SDL-Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Debug|x64.Build.0 = Debug|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|Win32.Build.0 = Release|Win32 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|x64.ActiveCfg = Release|x64 - {6F076455-D955-45D4-9C68-4AD4E45F2D47}.Static lib - Release|x64.Build.0 = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.ActiveCfg = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|Win32.Build.0 = Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.ActiveCfg = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Debug|x64.Build.0 = Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|Win32.ActiveCfg = Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|Win32.Build.0 = Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|x64.ActiveCfg = Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release - Fast FPU|x64.Build.0 = Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.ActiveCfg = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|Win32.Build.0 = Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.ActiveCfg = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Release|x64.Build.0 = Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|Win32.ActiveCfg = SDL-Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|Win32.Build.0 = SDL-Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|x64.ActiveCfg = SDL-Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.SDL-Debug|x64.Build.0 = SDL-Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|Win32.ActiveCfg = Static lib - Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|Win32.Build.0 = Static lib - Debug|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|x64.ActiveCfg = Static lib - Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Debug|x64.Build.0 = Static lib - Debug|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Static lib - Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|Win32.Build.0 = Static lib - Release - Fast FPU|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|x64.ActiveCfg = Static lib - Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release - Fast FPU|x64.Build.0 = Static lib - Release - Fast FPU|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|Win32.ActiveCfg = Static lib - Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|Win32.Build.0 = Static lib - Release|Win32 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|x64.ActiveCfg = Static lib - Release|x64 - {E08E042A-6C45-411B-92BE-3CC31331019F}.Static lib - Release|x64.Build.0 = Static lib - Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Debug|Win32.ActiveCfg = Debug|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Debug|Win32.Build.0 = Debug|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Debug|x64.ActiveCfg = Debug|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Debug|x64.Build.0 = Debug|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release - Fast FPU|x64.Build.0 = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release|Win32.ActiveCfg = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release|Win32.Build.0 = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release|x64.ActiveCfg = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Release|x64.Build.0 = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.SDL-Debug|x64.Build.0 = Debug|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Debug|x64.Build.0 = Debug|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release|Win32.Build.0 = Release|Win32 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release|x64.ActiveCfg = Release|x64 - {F25F2AC4-AEDA-4A95-9769-01A2652B54A2}.Static lib - Release|x64.Build.0 = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Debug|Win32.ActiveCfg = Debug|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Debug|Win32.Build.0 = Debug|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Debug|x64.ActiveCfg = Debug|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Debug|x64.Build.0 = Debug|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release - Fast FPU|Win32.Build.0 = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release - Fast FPU|x64.ActiveCfg = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release - Fast FPU|x64.Build.0 = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release|Win32.ActiveCfg = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release|Win32.Build.0 = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release|x64.ActiveCfg = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Release|x64.Build.0 = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.SDL-Debug|Win32.ActiveCfg = Debug|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.SDL-Debug|Win32.Build.0 = Debug|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.SDL-Debug|x64.ActiveCfg = Debug|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.SDL-Debug|x64.Build.0 = Debug|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Debug|Win32.ActiveCfg = Debug|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Debug|Win32.Build.0 = Debug|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Debug|x64.ActiveCfg = Debug|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Debug|x64.Build.0 = Debug|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release - Fast FPU|Win32.ActiveCfg = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release - Fast FPU|Win32.Build.0 = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release - Fast FPU|x64.ActiveCfg = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release - Fast FPU|x64.Build.0 = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release|Win32.ActiveCfg = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release|Win32.Build.0 = Release|Win32 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release|x64.ActiveCfg = Release|x64 - {DEE0160F-8FBD-43EC-BB96-1B9C0ED1B51A}.Static lib - Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 4f42e74d..9aab740f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,35 +1,7 @@ set(IRREXAMPLES - 01.HelloWorld - 02.Quake3Map - 03.CustomSceneNode - 04.Movement - 05.UserInterface - 06.2DGraphics - 07.Collision - 08.SpecialFX - 09.Meshviewer - 10.Shaders - 11.PerPixelLighting - 12.TerrainRendering - 13.RenderToTexture - 16.Quake3MapShader - 18.SplitScreen - 19.MouseAndJoystick - 20.ManagedLights - 21.Quake3Explorer - 22.MaterialViewer - 23.SMeshHandling - 24.CursorControl - 26.OcclusionQuery - 27.PostProcessing - 28.CubeMapping - 30.Profiling + # removed ) - -if(WIN32) - list(APPEND IRREXAMPLES 14.Win32Window) -endif() if(UNIX) list(APPEND IRREXAMPLES AutomatedTest) endif() diff --git a/examples/Demo/CDemo.cpp b/examples/Demo/CDemo.cpp deleted file mode 100644 index b50b6d35..00000000 --- a/examples/Demo/CDemo.cpp +++ /dev/null @@ -1,833 +0,0 @@ -// This is a Demo of the Irrlicht Engine (c) 2005-2009 by N.Gebhardt. -// This file is not documented. - -#include "CDemo.h" -#include "exampleHelper.h" - -CDemo::CDemo(bool f, bool m, bool s, bool a, bool v, bool fsaa, video::E_DRIVER_TYPE d) -: fullscreen(f), music(m), shadows(s), additive(a), vsync(v), aa(fsaa), - driverType(d), device(0), -#ifdef USE_IRRKLANG - irrKlang(0), ballSound(0), impactSound(0), -#endif -#ifdef USE_SDL_MIXER - stream(0), ballSound(0), impactSound(0), -#endif - currentScene(-2), backColor(0), statusText(0), inOutFader(0), - quakeLevelMesh(0), quakeLevelNode(0), skyboxNode(0), model1(0), model2(0), - campFire(0), metaSelector(0), mapSelector(0), sceneStartTime(0), - timeForThisScene(0) -{ -} - - -CDemo::~CDemo() -{ - if (mapSelector) - mapSelector->drop(); - - if (metaSelector) - metaSelector->drop(); - -#ifdef USE_IRRKLANG - if (irrKlang) - irrKlang->drop(); -#endif -} - - -void CDemo::run() -{ - core::dimension2d resolution (800, 600); - - if ( driverType == video::EDT_BURNINGSVIDEO || driverType == video::EDT_SOFTWARE ) - { - resolution.Width = 640; - resolution.Height = 480; - } - - irr::SIrrlichtCreationParameters params; - params.DriverType=driverType; - params.WindowSize=resolution; - params.Bits=32; - params.Fullscreen=fullscreen; - params.Stencilbuffer=shadows; - params.Vsync=vsync; - params.AntiAlias=aa?8:0; - params.EventReceiver=this; - - device = createDeviceEx(params); - if (!device) - return; - - const io::path mediaPath = getExampleMediaPath(); - - if (device->getFileSystem()->existFile("irrlicht.dat")) - device->getFileSystem()->addFileArchive("irrlicht.dat"); - else - device->getFileSystem()->addFileArchive(mediaPath + "irrlicht.dat"); - if (device->getFileSystem()->existFile("map-20kdm2.pk3")) - device->getFileSystem()->addFileArchive("map-20kdm2.pk3"); - else - device->getFileSystem()->addFileArchive(mediaPath + "map-20kdm2.pk3"); - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* smgr = device->getSceneManager(); - gui::IGUIEnvironment* guienv = device->getGUIEnvironment(); - - device->setWindowCaption(L"Irrlicht Engine Demo"); - - // set ambient light - smgr->setAmbientLight ( video::SColorf ( 0x00c0c0c0 ) ); - - wchar_t tmp[255]; - - // draw everything - - s32 now = 0; - s32 lastfps = 0; - sceneStartTime = device->getTimer()->getTime(); - while(device->run() && driver) - { - if (device->isWindowActive()) - { - #ifdef USE_IRRKLANG - // update 3D position for sound engine - scene::ICameraSceneNode* cam = smgr->getActiveCamera(); - if (cam && irrKlang) - irrKlang->setListenerPosition(cam->getAbsolutePosition(), cam->getTarget()); - #endif - - // load next scene if necessary - now = device->getTimer()->getTime(); - if (now - sceneStartTime > timeForThisScene && timeForThisScene!=-1) - switchToNextScene(); - - createParticleImpacts(); - - u16 clearFlag = video::ECBF_DEPTH; - - if (timeForThisScene != -1) - clearFlag |= video::ECBF_COLOR; - - driver->beginScene(clearFlag, backColor); - - smgr->drawAll(); - guienv->drawAll(); - driver->endScene(); - - // write statistics - const s32 nowfps = driver->getFPS(); - - swprintf_irr(tmp, 255, L"%ls fps:%3d triangles:%0.3f mio/s", - driver->getName(), driver->getFPS(), - driver->getPrimitiveCountDrawn(1) * (1.f / 1000000.f)); - - statusText->setText(tmp); - if ( nowfps != lastfps ) - { - device->setWindowCaption(tmp); - lastfps = nowfps; - } - } - } - - device->drop(); -} - - -bool CDemo::OnEvent(const SEvent& event) -{ - if (!device) - return false; - - if (event.EventType == EET_KEY_INPUT_EVENT && - event.KeyInput.Key == KEY_ESCAPE && - event.KeyInput.PressedDown == false) - { - // user wants to quit. - if (currentScene < 3) - timeForThisScene = 0; - else - device->closeDevice(); - } - else - if (((event.EventType == EET_KEY_INPUT_EVENT && - event.KeyInput.Key == KEY_SPACE && - event.KeyInput.PressedDown == false) || - (event.EventType == EET_MOUSE_INPUT_EVENT && - event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)) && - currentScene == 3) - { - // shoot - shoot(); - } - else - if (event.EventType == EET_KEY_INPUT_EVENT && - event.KeyInput.Key == KEY_F9 && - event.KeyInput.PressedDown == false) - { - video::IImage* image = device->getVideoDriver()->createScreenShot(); - if (image) - { - device->getVideoDriver()->writeImageToFile(image, "screenshot.bmp"); - device->getVideoDriver()->writeImageToFile(image, "screenshot.png"); - device->getVideoDriver()->writeImageToFile(image, "screenshot.tga"); - device->getVideoDriver()->writeImageToFile(image, "screenshot.ppm"); - device->getVideoDriver()->writeImageToFile(image, "screenshot.jpg"); - device->getVideoDriver()->writeImageToFile(image, "screenshot.pcx"); - image->drop(); - } - } - else - if (device->getSceneManager()->getActiveCamera()) - { - device->getSceneManager()->getActiveCamera()->OnEvent(event); - return true; - } - - return false; -} - - -void CDemo::switchToNextScene() -{ - currentScene++; - if (currentScene > 3) - currentScene = 1; - - scene::ISceneManager* sm = device->getSceneManager(); - scene::ISceneNodeAnimator* sa = 0; - scene::ICameraSceneNode* camera = 0; - - camera = sm->getActiveCamera(); - if (camera) - { - sm->setActiveCamera(0); - camera->remove(); - camera = 0; - } - - switch(currentScene) - { - case -1: // loading screen - timeForThisScene = 0; - createLoadingScreen(); - break; - - case 0: // load scene - timeForThisScene = 0; - loadSceneData(); - break; - - case 1: // panorama camera - { - currentScene += 1; - //camera = sm->addCameraSceneNode(0, core::vector3df(0,0,0), core::vector3df(-586,708,52)); - //camera->setTarget(core::vector3df(0,400,0)); - - core::array points; - - points.push_back(core::vector3df(-931.473755f, 138.300003f, 987.279114f)); // -49873 - points.push_back(core::vector3df(-847.902222f, 136.757553f, 915.792725f)); // -50559 - points.push_back(core::vector3df(-748.680420f, 152.254501f, 826.418945f)); // -51964 - points.push_back(core::vector3df(-708.428406f, 213.569580f, 784.466675f)); // -53251 - points.push_back(core::vector3df(-686.217651f, 288.141174f, 762.965576f)); // -54015 - points.push_back(core::vector3df(-679.685059f, 365.095612f, 756.551453f)); // -54733 - points.push_back(core::vector3df(-671.317871f, 447.360107f, 749.394592f)); // -55588 - points.push_back(core::vector3df(-669.468445f, 583.335632f, 747.711853f)); // -56178 - points.push_back(core::vector3df(-667.611267f, 727.313232f, 746.018250f)); // -56757 - points.push_back(core::vector3df(-665.853210f, 862.791931f, 744.436096f)); // -57859 - points.push_back(core::vector3df(-642.649597f, 1026.047607f, 724.259827f)); // -59705 - points.push_back(core::vector3df(-517.793884f, 838.396790f, 490.326050f)); // -60983 - points.push_back(core::vector3df(-474.387299f, 715.691467f, 344.639984f)); // -61629 - points.push_back(core::vector3df(-444.600250f, 601.155701f, 180.938095f)); // -62319 - points.push_back(core::vector3df(-414.808899f, 479.691406f, 4.866660f)); // -63048 - points.push_back(core::vector3df(-410.418945f, 429.642242f, -134.332687f)); // -63757 - points.push_back(core::vector3df(-399.837585f, 411.498383f, -349.350983f)); // -64418 - points.push_back(core::vector3df(-390.756653f, 403.970093f, -524.454407f)); // -65005 - points.push_back(core::vector3df(-334.864227f, 350.065491f, -732.397400f)); // -65701 - points.push_back(core::vector3df(-195.253387f, 349.577209f, -812.475891f)); // -66335 - points.push_back(core::vector3df(16.255573f, 363.743134f, -833.800415f)); // -67170 - points.push_back(core::vector3df(234.940964f, 352.957825f, -820.150696f)); // -67939 - points.push_back(core::vector3df(436.797668f, 349.236450f, -816.914185f)); // -68596 - points.push_back(core::vector3df(575.236206f, 356.244812f, -719.788513f)); // -69166 - points.push_back(core::vector3df(594.131042f, 387.173828f, -609.675598f)); // -69744 - points.push_back(core::vector3df(617.615234f, 412.002899f, -326.174072f)); // -70640 - points.push_back(core::vector3df(606.456848f, 403.221954f, -104.179291f)); // -71390 - points.push_back(core::vector3df(610.958252f, 407.037750f, 117.209778f)); // -72085 - points.push_back(core::vector3df(597.956909f, 395.167877f, 345.942200f)); // -72817 - points.push_back(core::vector3df(587.383118f, 391.444519f, 566.098633f)); // -73477 - points.push_back(core::vector3df(559.572449f, 371.991333f, 777.689453f)); // -74124 - points.push_back(core::vector3df(423.753204f, 329.990051f, 925.859741f)); // -74941 - points.push_back(core::vector3df(247.520050f, 252.818954f, 935.311829f)); // -75651 - points.push_back(core::vector3df(114.756012f, 199.799759f, 805.014160f)); - points.push_back(core::vector3df(96.783348f, 181.639481f, 648.188110f)); - points.push_back(core::vector3df(97.865623f, 138.905975f, 484.812561f)); - points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); - points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); - points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); - - timeForThisScene = (points.size()-3)* 1000; - - camera = sm->addCameraSceneNode(0, points[0], core::vector3df(0 ,400,0)); - //camera->setTarget(core::vector3df(0,400,0)); - - sa = sm->createFollowSplineAnimator(device->getTimer()->getTime(), - points); - camera->addAnimator(sa); - sa->drop(); - - model1->setVisible(false); - model2->setVisible(false); - campFire->setVisible(false); - inOutFader->fadeIn(7000); - } - break; - - case 2: // down fly anim camera - camera = sm->addCameraSceneNode(0, core::vector3df(100,40,-80), core::vector3df(844,670,-885)); - sa = sm->createFlyStraightAnimator(core::vector3df(94, 1002, 127), - core::vector3df(108, 15, -60), 10000, true); - camera->addAnimator(sa); - timeForThisScene = 9900; - model1->setVisible(true); - model2->setVisible(false); - campFire->setVisible(false); - sa->drop(); - break; - - case 3: // interactive, go around - { - model1->setVisible(true); - model2->setVisible(true); - campFire->setVisible(true); - timeForThisScene = -1; - - core::array keyMap(11); - - keyMap.push_back( SKeyMap(EKA_MOVE_FORWARD, KEY_UP) ); - keyMap.push_back( SKeyMap(EKA_MOVE_FORWARD, KEY_KEY_W) ); - - keyMap.push_back( SKeyMap(EKA_MOVE_BACKWARD, KEY_DOWN) ); - keyMap.push_back( SKeyMap(EKA_MOVE_BACKWARD, KEY_KEY_S) ); - - keyMap.push_back( SKeyMap(EKA_STRAFE_LEFT, KEY_LEFT) ); - keyMap.push_back( SKeyMap(EKA_STRAFE_LEFT, KEY_KEY_A) ); - - keyMap.push_back( SKeyMap(EKA_STRAFE_RIGHT, KEY_RIGHT) ); - keyMap.push_back( SKeyMap(EKA_STRAFE_RIGHT, KEY_KEY_D) ); - - keyMap.push_back( SKeyMap(EKA_JUMP_UP, KEY_KEY_J) ); - - keyMap.push_back( SKeyMap(EKA_ROTATE_LEFT, KEY_KEY_Q) ); - - keyMap.push_back( SKeyMap(EKA_ROTATE_RIGHT, KEY_KEY_E) ); - - camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap.pointer(), keyMap.size(), false, 300.f); - camera->setPosition(core::vector3df(108,140,-140)); - camera->setFarValue(5000.0f); - - scene::ISceneNodeAnimatorCollisionResponse* collider = - sm->createCollisionResponseAnimator( - metaSelector, camera, core::vector3df(25,50,25), - core::vector3df(0, quakeLevelMesh ? -1000.f : 0.0f,0), - core::vector3df(0,45,0), 0.005f); - - camera->addAnimator(collider); - collider->drop(); - } - break; - } - - sceneStartTime = device->getTimer()->getTime(); -} - - -void CDemo::loadSceneData() -{ - // load quake level - - video::IVideoDriver* driver = device->getVideoDriver(); - scene::ISceneManager* sm = device->getSceneManager(); - - // Quake3 Shader controls Z-Writing - sm->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); - - quakeLevelMesh = (scene::IQ3LevelMesh*) sm->getMesh("maps/20kdm2.bsp"); - - if (quakeLevelMesh) - { - u32 i; - - //move all quake level meshes (non-realtime) - core::matrix4 m; - m.setTranslation(core::vector3df(-1300,-70,-1249)); - - for ( i = 0; i != scene::quake3::E_Q3_MESH_SIZE; ++i ) - sm->getMeshManipulator()->transform(quakeLevelMesh->getMesh(i), m); - - quakeLevelNode = sm->addOctreeSceneNode( - quakeLevelMesh->getMesh( scene::quake3::E_Q3_MESH_GEOMETRY)); - if (quakeLevelNode) - { - //quakeLevelNode->setPosition(core::vector3df(-1300,-70,-1249)); - quakeLevelNode->setVisible(true); - - // create map triangle selector - mapSelector = sm->createOctreeTriangleSelector(quakeLevelMesh->getMesh(0), - quakeLevelNode, 128); - - // if not using shader and no gamma it's better to use more lighting, because - // quake3 level are usually dark - quakeLevelNode->setMaterialType ( video::EMT_LIGHTMAP_M4 ); - - // set additive blending if wanted - if (additive) - quakeLevelNode->setMaterialType(video::EMT_LIGHTMAP_ADD); - } - - // the additional mesh can be quite huge and is unoptimized - scene::IMesh * additional_mesh = quakeLevelMesh->getMesh ( scene::quake3::E_Q3_MESH_ITEMS ); - - for ( i = 0; i!= additional_mesh->getMeshBufferCount (); ++i ) - { - scene::IMeshBuffer *meshBuffer = additional_mesh->getMeshBuffer ( i ); - const video::SMaterial &material = meshBuffer->getMaterial(); - - //! The ShaderIndex is stored in the material parameter - s32 shaderIndex = (s32) material.MaterialTypeParam2; - - // the meshbuffer can be rendered without additional support, or it has no shader - const scene::quake3::IShader *shader = quakeLevelMesh->getShader ( shaderIndex ); - if ( 0 == shader ) - { - continue; - } - // Now add the MeshBuffer(s) with the current Shader to the Manager - sm->addQuake3SceneNode ( meshBuffer, shader ); - } - } - - const io::path mediaPath = getExampleMediaPath(); - - // load sydney model and create 2 instances - - scene::IAnimatedMesh* mesh = 0; - mesh = sm->getMesh(mediaPath + "sydney.md2"); - if (mesh) - { - model1 = sm->addAnimatedMeshSceneNode(mesh); - if (model1) - { - model1->setMaterialTexture(0, driver->getTexture(mediaPath + "spheremap.jpg")); - model1->setPosition(core::vector3df(100,40,-80)); - model1->setScale(core::vector3df(2,2,2)); - model1->setMD2Animation(scene::EMAT_STAND); - model1->setMaterialFlag(video::EMF_LIGHTING, true); - model1->getMaterial(0).Shininess = 40.f; - model1->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); - model1->setMaterialType(video::EMT_SPHERE_MAP); - model1->setAutomaticCulling(scene::EAC_OFF); // avoid shadows not updating - scene::IShadowVolumeSceneNode * shadVol = model1->addShadowVolumeSceneNode(); - if(shadVol) shadVol->setOptimization(scene::ESV_NONE); // Sydney has broken shadows otherwise - } - - model2 = sm->addAnimatedMeshSceneNode(mesh); - if (model2) - { - model2->setPosition(core::vector3df(180,15,-60)); - model2->setScale(core::vector3df(2,2,2)); - model2->setMD2Animation(scene::EMAT_RUN); - model2->setMaterialTexture(0, device->getVideoDriver()->getTexture(mediaPath + "sydney.bmp")); - model2->setMaterialFlag(video::EMF_LIGHTING, true); - model2->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); - model2->setAutomaticCulling(scene::EAC_OFF); // avoid shadows not updating - scene::IShadowVolumeSceneNode * shadVol = model2->addShadowVolumeSceneNode(); - if (shadVol) shadVol->setOptimization(scene::ESV_NONE); // Sydney has broken shadows otherwise - } - } - - scene::ISceneNodeAnimator* anim = 0; - - // create sky box - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - skyboxNode = sm->addSkyBoxSceneNode( - driver->getTexture(mediaPath + "irrlicht2_up.jpg"), - driver->getTexture(mediaPath + "irrlicht2_dn.jpg"), - driver->getTexture(mediaPath + "irrlicht2_lf.jpg"), - driver->getTexture(mediaPath + "irrlicht2_rt.jpg"), - driver->getTexture(mediaPath + "irrlicht2_ft.jpg"), - driver->getTexture(mediaPath + "irrlicht2_bk.jpg")); - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true); - - // create walk-between-portals animation - - core::vector3df waypoint[2]; - waypoint[0].set(-150,40,100); - waypoint[1].set(350,40,100); - - if (model2) - { - anim = device->getSceneManager()->createFlyStraightAnimator( - waypoint[0], waypoint[1], 2000, true); - model2->addAnimator(anim); - anim->drop(); - } - - // create animation for portals; - - core::array textures; - for (s32 g=1; g<8; ++g) - { - core::stringc tmp(mediaPath + "portal"); - tmp += g; - tmp += ".bmp"; - video::ITexture* t = driver->getTexture( tmp ); - textures.push_back(t); - } - - anim = sm->createTextureAnimator(textures, 100); - - // create portals - - scene::IBillboardSceneNode* bill = 0; - - for (int r=0; r<2; ++r) - { - bill = sm->addBillboardSceneNode(0, core::dimension2d(100,100), - waypoint[r]+ core::vector3df(0,20,0)); - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "portal1.bmp")); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - bill->addAnimator(anim); - } - - anim->drop(); - - // create cirlce flying dynamic light with transparent billboard attached - - scene::ILightSceneNode* light = 0; - - light = sm->addLightSceneNode(0, - core::vector3df(0,0,0), video::SColorf(1.0f, 1.0f, 1.f, 1.0f), 500.f); - - anim = sm->createFlyCircleAnimator( - core::vector3df(100,150,80), 80.0f, 0.0005f); - - light->addAnimator(anim); - anim->drop(); - - bill = device->getSceneManager()->addBillboardSceneNode( - light, core::dimension2d(40,40)); - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particlewhite.bmp")); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - - // create meta triangle selector with all triangles selectors in it. - metaSelector = sm->createMetaTriangleSelector(); - metaSelector->addTriangleSelector(mapSelector); - - // create camp fire - - campFire = sm->addParticleSystemSceneNode(false); - campFire->setPosition(core::vector3df(100,120,600)); - campFire->setScale(core::vector3df(2,2,2)); - - scene::IParticleEmitter* em = campFire->createBoxEmitter( - core::aabbox3d(-7,0,-7,7,1,7), - core::vector3df(0.0f,0.06f,0.0f), - 80,100, video::SColor(1,255,255,255),video::SColor(1,255,255,255), 800,2000); - - em->setMinStartSize(core::dimension2d(20.0f, 10.0f)); - em->setMaxStartSize(core::dimension2d(20.0f, 10.0f)); - campFire->setEmitter(em); - em->drop(); - - scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector(); - campFire->addAffector(paf); - paf->drop(); - - campFire->setMaterialFlag(video::EMF_LIGHTING, false); - campFire->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - campFire->setMaterialTexture(0, driver->getTexture(mediaPath + "fireball.bmp")); - campFire->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - - // load music - - #ifdef USE_IRRKLANG - if (music) - startIrrKlang(); - #endif - #ifdef USE_SDL_MIXER - if (music) - startSound(); - #endif -} - - -void CDemo::createLoadingScreen() -{ - core::dimension2d size = device->getVideoDriver()->getScreenSize(); - - device->getCursorControl()->setVisible(false); - - // setup loading screen - - backColor.set(255,90,90,156); - - // create in fader - - inOutFader = device->getGUIEnvironment()->addInOutFader(); - inOutFader->setColor(backColor, video::SColor ( 0, 230, 230, 230 )); - - const io::path mediaPath = getExampleMediaPath(); - - // irrlicht logo - device->getGUIEnvironment()->addImage(device->getVideoDriver()->getTexture(mediaPath + "irrlichtlogo3.png"), - core::position2d(5,5)); - - // loading text - - const int lwidth = size.Width - 20; - const int lheight = 16; - - core::rect pos(10, size.Height-lheight-10, 10+lwidth, size.Height-10); - - device->getGUIEnvironment()->addImage(pos); - statusText = device->getGUIEnvironment()->addStaticText(L"Loading...", pos, true); - statusText->setOverrideColor(video::SColor(255,205,200,200)); - - // load bigger font - - device->getGUIEnvironment()->getSkin()->setFont( - device->getGUIEnvironment()->getFont(mediaPath + "fonthaettenschweiler.bmp")); - - // set new font color - - device->getGUIEnvironment()->getSkin()->setColor(gui::EGDC_BUTTON_TEXT, - video::SColor(255,100,100,100)); -} - - -void CDemo::shoot() -{ - scene::ISceneManager* sm = device->getSceneManager(); - scene::ICameraSceneNode* camera = sm->getActiveCamera(); - - if (!camera || !mapSelector) - return; - - SParticleImpact imp; - imp.when = 0; - - // get line of camera - - core::vector3df start = camera->getPosition(); - core::vector3df end = (camera->getTarget() - start); - end.normalize(); - start += end*8.0f; - end = start + (end * camera->getFarValue()); - - core::triangle3df triangle; - - core::line3d line(start, end); - - // get intersection point with map - scene::ISceneNode* hitNode; - if (sm->getSceneCollisionManager()->getCollisionPoint( - line, mapSelector, end, triangle, hitNode)) - { - // collides with wall - core::vector3df out = triangle.getNormal(); - out.setLength(0.03f); - - imp.when = 1; - imp.outVector = out; - imp.pos = end; - } - else - { - // doesnt collide with wall - start = camera->getPosition(); - end = (camera->getTarget() - start); - end.normalize(); - start += end*8.0f; - end = start + (end * camera->getFarValue()); - } - - // create fire ball - scene::ISceneNode* node = 0; - node = sm->addBillboardSceneNode(0, - core::dimension2d(25,25), start); - - node->setMaterialFlag(video::EMF_LIGHTING, false); - node->setMaterialTexture(0, device->getVideoDriver()->getTexture(getExampleMediaPath() + "fireball.bmp")); - node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - - f32 length = (f32)(end - start).getLength(); - const f32 speed = 0.6f; - u32 time = (u32)(length / speed); - - scene::ISceneNodeAnimator* anim = 0; - - // set flight line - - anim = sm->createFlyStraightAnimator(start, end, time); - node->addAnimator(anim); - anim->drop(); - - anim = sm->createDeleteAnimator(time); - node->addAnimator(anim); - anim->drop(); - - if (imp.when) - { - // create impact note - imp.when = device->getTimer()->getTime() + (time - 100); - Impacts.push_back(imp); - } - - // play sound - #ifdef USE_IRRKLANG - if (ballSound) - irrKlang->play2D(ballSound); - #endif - #ifdef USE_SDL_MIXER - if (ballSound) - playSound(ballSound); - #endif -} - - -void CDemo::createParticleImpacts() -{ - u32 now = device->getTimer()->getTime(); - scene::ISceneManager* sm = device->getSceneManager(); - - for (s32 i=0; i<(s32)Impacts.size(); ++i) - if (now > Impacts[i].when) - { - // create smoke particle system - scene::IParticleSystemSceneNode* pas = 0; - - pas = sm->addParticleSystemSceneNode(false, 0, -1, Impacts[i].pos); - - pas->setParticleSize(core::dimension2d(10.0f, 10.0f)); - - scene::IParticleEmitter* em = pas->createBoxEmitter( - core::aabbox3d(-5,-5,-5,5,5,5), - Impacts[i].outVector, 20,40, video::SColor(50,255,255,255),video::SColor(50,255,255,255), - 1200,1600, 20); - - pas->setEmitter(em); - em->drop(); - - scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector(); - pas->addAffector(paf); - paf->drop(); - - pas->setMaterialFlag(video::EMF_LIGHTING, false); - pas->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - pas->setMaterialTexture(0, device->getVideoDriver()->getTexture(getExampleMediaPath() + "smoke.bmp")); - pas->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - - scene::ISceneNodeAnimator* anim = sm->createDeleteAnimator(2000); - pas->addAnimator(anim); - anim->drop(); - - // play impact sound - #ifdef USE_IRRKLANG - if (irrKlang) - { - irrklang::ISound* sound = - irrKlang->play3D(impactSound, Impacts[i].pos, false, false, true); - - if (sound) - { - // adjust max value a bit to make to sound of an impact louder - sound->setMinDistance(400); - sound->drop(); - } - } - #endif - - #ifdef USE_SDL_MIXER - if (impactSound) - playSound(impactSound); - #endif - - // delete entry - Impacts.erase(i); - i--; - } -} - - -#ifdef USE_IRRKLANG -void CDemo::startIrrKlang() -{ - irrKlang = irrklang::createIrrKlangDevice(); - - if (!irrKlang) - return; - - const io::path mediaPath = getExampleMediaPath(); - - // play music - - irrklang::ISound* snd = irrKlang->play2D((mediaPath + "IrrlichtTheme.ogg").c_str(), true, false, true); - if ( !snd ) - snd = irrKlang->play2D("IrrlichtTheme.ogg", true, false, true); - - if (snd) - { - snd->setVolume(0.5f); // 50% volume - snd->drop(); - } - - // preload both sound effects - - ballSound = irrKlang->getSoundSource(mediaPath + "ball.wav"); - impactSound = irrKlang->getSoundSource(mediaPath + "impact.wav"); -} -#endif - - -#ifdef USE_SDL_MIXER -void CDemo::startSound() -{ - stream = NULL; - ballSound = NULL; - impactSound = NULL; - - SDL_Init(SDL_INIT_AUDIO); - - if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 4096)) - return; - - const io::path mediaPath = getExampleMediaPath(); - - stream = Mix_LoadMUS((mediaPath + "IrrlichtTheme.ogg").c_str()); - if (stream) - Mix_PlayMusic(stream, -1); - - ballSound = Mix_LoadWAV((mediaPath + "ball.wav").c_str()); - impactSound = Mix_LoadWAV((mediaPath + "impact.wav").c_str()); -} - -void CDemo::playSound(Mix_Chunk *sample) -{ - if (sample) - Mix_PlayChannel(-1, sample, 0); -} - -void CDemo::pollSound(void) -{ - SDL_Event event; - - while (SDL_PollEvent(&event)) - ; -} -#endif diff --git a/examples/Demo/CDemo.h b/examples/Demo/CDemo.h deleted file mode 100644 index 0b2ca39c..00000000 --- a/examples/Demo/CDemo.h +++ /dev/null @@ -1,110 +0,0 @@ -// This is a Demo of the Irrlicht Engine (c) 2006 by N.Gebhardt. -// This file is not documented. - -#ifndef __C_DEMO_H_INCLUDED__ -#define __C_DEMO_H_INCLUDED__ - -//#define USE_IRRKLANG -//#define USE_SDL_MIXER - -#include - -#ifdef _IRR_WINDOWS_ -#include -#endif - -using namespace irr; - -// audio support - -#ifdef USE_IRRKLANG - #include // problem here? go to http://www.ambiera.com/irrklang and download - // the irrKlang library or undefine USE_IRRKLANG at the beginning - // of this file. - #ifdef _MSC_VER - #pragma comment (lib, "irrKlang.lib") - #endif -#endif -#ifdef USE_SDL_MIXER - # include - # include -#endif - -const int CAMERA_COUNT = 7; - -class CDemo : public IEventReceiver -{ -public: - - CDemo(bool fullscreen, bool music, bool shadows, bool additive, bool vsync, bool aa, video::E_DRIVER_TYPE driver); - - ~CDemo(); - - void run(); - - virtual bool OnEvent(const SEvent& event); - -private: - - void createLoadingScreen(); - void loadSceneData(); - void switchToNextScene(); - void shoot(); - void createParticleImpacts(); - - bool fullscreen; - bool music; - bool shadows; - bool additive; - bool vsync; - bool aa; - video::E_DRIVER_TYPE driverType; - IrrlichtDevice *device; - -#ifdef USE_IRRKLANG - void startIrrKlang(); - irrklang::ISoundEngine* irrKlang; - irrklang::ISoundSource* ballSound; - irrklang::ISoundSource* impactSound; -#endif - -#ifdef USE_SDL_MIXER - void startSound(); - void playSound(Mix_Chunk *); - void pollSound(); - Mix_Music *stream; - Mix_Chunk *ballSound; - Mix_Chunk *impactSound; -#endif - - struct SParticleImpact - { - u32 when; - core::vector3df pos; - core::vector3df outVector; - }; - - int currentScene; - video::SColor backColor; - - gui::IGUIStaticText* statusText; - gui::IGUIInOutFader* inOutFader; - - scene::IQ3LevelMesh* quakeLevelMesh; - scene::ISceneNode* quakeLevelNode; - scene::ISceneNode* skyboxNode; - scene::IAnimatedMeshSceneNode* model1; - scene::IAnimatedMeshSceneNode* model2; - scene::IParticleSystemSceneNode* campFire; - - scene::IMetaTriangleSelector* metaSelector; - scene::ITriangleSelector* mapSelector; - - s32 sceneStartTime; - s32 timeForThisScene; - - core::array Impacts; -}; - -#endif - diff --git a/examples/Demo/CMainMenu.cpp b/examples/Demo/CMainMenu.cpp deleted file mode 100644 index f67d9f3c..00000000 --- a/examples/Demo/CMainMenu.cpp +++ /dev/null @@ -1,393 +0,0 @@ -// This is a Demo of the Irrlicht Engine (c) 2005-2009 by N.Gebhardt. -// This file is not documented. - -#include "CMainMenu.h" -#include "CDemo.h" -#include "exampleHelper.h" - - - -CMainMenu::CMainMenu() -: startButton(0), MenuDevice(0), selected(0), start(false), fullscreen(false), -#if defined(USE_IRRKLANG) || defined(USE_SDL_MIXER) - music(true), -#else - music(false), -#endif - shadows(true), additive(false), transparent(true), vsync(true), aa(true), -#ifndef _IRR_WINDOWS_ - driverType(video::EDT_OPENGL) -#else - driverType(video::EDT_DIRECT3D9) -#endif - //driverType(video::EDT_BURNINGSVIDEO) -{ -} - - -bool CMainMenu::run() -{ - video::E_DRIVER_TYPE driverType = video::EDT_OPENGL; - if (!IrrlichtDevice::isDriverSupported(video::EDT_OPENGL)) - driverType = video::EDT_BURNINGSVIDEO; - - MenuDevice = createDevice(driverType, - core::dimension2d(512, 384), 16, false, false, false, this); - - const io::path mediaPath = getExampleMediaPath(); - - if (MenuDevice->getFileSystem()->existFile("irrlicht.dat")) - MenuDevice->getFileSystem()->addFileArchive("irrlicht.dat"); - else - MenuDevice->getFileSystem()->addFileArchive(mediaPath + "irrlicht.dat"); - - video::IVideoDriver* driver = MenuDevice->getVideoDriver(); - scene::ISceneManager* smgr = MenuDevice->getSceneManager(); - gui::IGUIEnvironment* guienv = MenuDevice->getGUIEnvironment(); - - core::stringw str = "Irrlicht Engine Demo v"; - str += MenuDevice->getVersion(); - MenuDevice->setWindowCaption(str.c_str()); - - // set new Skin - gui::IGUISkin* newskin = guienv->createSkin(gui::EGST_BURNING_SKIN); - guienv->setSkin(newskin); - newskin->drop(); - - // load font - gui::IGUIFont* font = guienv->getFont(mediaPath + "fonthaettenschweiler.bmp"); - if (font) - guienv->getSkin()->setFont(font); - - // add images - - const s32 leftX = 260; - - // add tab control - gui::IGUITabControl* tabctrl = guienv->addTabControl(core::rect(leftX,10,512-10,384-10), - 0, true, true); - gui::IGUITab* optTab = tabctrl->addTab(L"Demo"); - gui::IGUITab* aboutTab = tabctrl->addTab(L"About"); - - // add list box - - gui::IGUIListBox* box = guienv->addListBox(core::rect(10,10,220,120), optTab, 1); - for (u32 i=1; iaddItem(core::stringw(video::DRIVER_TYPE_NAMES[i]).c_str()); - if ( driverType == video::E_DRIVER_TYPE(i) ) - selected = box->getItemCount()-1; - } - } - box->setSelected(selected); - - // add button - - startButton = guienv->addButton(core::rect(30,295,200,324), optTab, 2, L"Start Demo"); - - // add checkbox - - const s32 d = 50; - - guienv->addCheckBox(fullscreen, core::rect(20,85+d,130,110+d), - optTab, 3, L"Fullscreen"); - guienv->addCheckBox(music, core::rect(135,85+d,245,110+d), - optTab, 4, L"Music & Sfx"); - guienv->addCheckBox(shadows, core::rect(20,110+d,135,135+d), - optTab, 5, L"Realtime shadows"); - guienv->addCheckBox(additive, core::rect(20,135+d,230,160+d), - optTab, 6, L"Old HW compatible blending"); - guienv->addCheckBox(vsync, core::rect(20,160+d,230,185+d), - optTab, 7, L"Vertical synchronisation"); - guienv->addCheckBox(aa, core::rect(20,185+d,230,210+d), - optTab, 8, L"Antialiasing"); - - // add about text - - const wchar_t* text2 = L"This is the tech demo of the Irrlicht engine. To start, "\ - L"select a video driver which works best with your hardware and press 'Start Demo'.\n"\ - L"What you currently see is displayed using the Burning Software Renderer (Thomas Alten).\n"\ - L"The Irrlicht Engine was written by me, Nikolaus Gebhardt. The models, "\ - L"maps and textures were placed at my disposal by B.Collins, M.Cook and J.Marton. The music was created by "\ - L"M.Rohde and is played back by irrKlang.\n"\ - L"For more information, please visit the homepage of the Irrlicht engine:\nhttp://irrlicht.sourceforge.net"; - - guienv->addStaticText(text2, core::rect(10, 10, 230, 320), - true, true, aboutTab); - - // add md2 model - - scene::IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "faerie.md2"); - scene::IAnimatedMeshSceneNode* modelNode = smgr->addAnimatedMeshSceneNode(mesh); - if (modelNode) - { - modelNode->setPosition( core::vector3df(0.f, 0.f, -5.f) ); - modelNode->setMaterialTexture(0, driver->getTexture(mediaPath + "faerie2.bmp")); - modelNode->setMaterialFlag(video::EMF_LIGHTING, true); - modelNode->getMaterial(0).Shininess = 50.f; - modelNode->getMaterial(0).NormalizeNormals = true; - modelNode->setMD2Animation(scene::EMAT_STAND); - } - - // set ambient light (no sun light in the catacombs) - smgr->setAmbientLight( video::SColorf(0.2f, 0.2f, 0.2f) ); - - scene::ILightSceneNode *light; - scene::ISceneNodeAnimator* anim; - scene::ISceneNode* bill; - - enum eLightParticle - { - LIGHT_NONE, - LIGHT_GLOBAL, - LIGHT_RED, - LIGHT_BLUE - }; - core::vector3df lightDir[2] = { - core::vector3df(0.f, 0.1f, 0.4f), - core::vector3df(0.f, 0.1f, -0.4f), - }; - - struct SLightParticle - { - eLightParticle type; - u32 dir; - }; - const SLightParticle lightParticle[] = - { - //LIGHT_GLOBAL,0, - {LIGHT_RED,0}, - {LIGHT_BLUE,0}, - {LIGHT_RED,1}, - {LIGHT_BLUE,1}, - {LIGHT_NONE,0} - }; - - const SLightParticle *l = lightParticle; - while ( l->type != LIGHT_NONE ) - { - switch ( l->type ) - { - case LIGHT_GLOBAL: - // add illumination from the background - light = smgr->addLightSceneNode(0, core::vector3df(10.f,40.f,-5.f), - video::SColorf(0.2f, 0.2f, 0.2f), 90.f); - break; - case LIGHT_RED: - // add light nearly red - light = smgr->addLightSceneNode(0, core::vector3df(0,1,0), - video::SColorf(0.8f, 0.f, 0.f, 0.0f), 30.0f); - // attach red billboard to the light - bill = smgr->addBillboardSceneNode(light, core::dimension2d(10, 10)); - if ( bill ) - { - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particlered.bmp")); - } - // add fly circle animator to the light - anim = smgr->createFlyCircleAnimator(core::vector3df(0.f,0.f,-5.f),20.f, - 0.002f, lightDir [l->dir] ); - light->addAnimator(anim); - anim->drop(); - break; - case LIGHT_BLUE: - // add light nearly blue - light = smgr->addLightSceneNode(0, core::vector3df(0,1,0), - video::SColorf(0.f, 0.0f, 0.8f, 0.0f), 30.0f); - // attach blue billboard to the light - bill = smgr->addBillboardSceneNode(light, core::dimension2d(10, 10)); - if (bill) - { - bill->setMaterialFlag(video::EMF_LIGHTING, false); - bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); - bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); - bill->setMaterialTexture(0, driver->getTexture(mediaPath + "portal1.bmp")); - } - // add fly circle animator to the light - anim = smgr->createFlyCircleAnimator(core::vector3df(0.f,0.f,-5.f),20.f, - -0.002f, lightDir [l->dir], 0.5f); - light->addAnimator(anim); - anim->drop(); - break; - case LIGHT_NONE: - break; - } - l += 1; - } - - // create a fixed camera - smgr->addCameraSceneNode(0, core::vector3df(45,0,0), core::vector3df(0,0,10)); - - - // irrlicht logo and background - // add irrlicht logo - bool oldMipMapState = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - - guienv->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), - core::position2d(5,5)); - - video::ITexture* irrlichtBack = driver->getTexture(mediaPath + "demoback.jpg"); - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, oldMipMapState); - - // query original skin color - getOriginalSkinColor(); - - // set transparency - setTransparency(); - - // draw all - - while(MenuDevice->run()) - { - if (MenuDevice->isWindowActive()) - { - driver->beginScene(video::ECBF_DEPTH, video::SColor(0,0,0,0)); - - if (irrlichtBack) - driver->draw2DImage(irrlichtBack, - core::position2d(0,0)); - - smgr->drawAll(); - guienv->drawAll(); - driver->endScene(); - } - } - - MenuDevice->drop(); - - for (u32 i=1; igetVideoDriver()->createScreenShot(); - if (image) - { - MenuDevice->getVideoDriver()->writeImageToFile(image, "screenshot_main.jpg"); - image->drop(); - } - } - else - if (event.EventType == irr::EET_MOUSE_INPUT_EVENT && - event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP ) - { - core::rect r(event.MouseInput.X, event.MouseInput.Y, 0, 0); - gui::IGUIContextMenu* menu = MenuDevice->getGUIEnvironment()->addContextMenu(r, 0, 45); - menu->addItem(L"transparent menus", 666, transparent == false); - menu->addItem(L"solid menus", 666, transparent == true); - menu->addSeparator(); - menu->addItem(L"Cancel"); - } - else - if (event.EventType == EET_GUI_EVENT) - { - s32 id = event.GUIEvent.Caller->getID(); - switch(id) - { - case 45: // context menu - if (event.GUIEvent.EventType == gui::EGET_MENU_ITEM_SELECTED) - { - s32 s = ((gui::IGUIContextMenu*)event.GUIEvent.Caller)->getSelectedItem(); - if (s == 0 || s == 1) - { - transparent = !transparent; - setTransparency(); - } - } - break; - case 1: - if (event.GUIEvent.EventType == gui::EGET_LISTBOX_CHANGED || - event.GUIEvent.EventType == gui::EGET_LISTBOX_SELECTED_AGAIN) - { - selected = ((gui::IGUIListBox*)event.GUIEvent.Caller)->getSelected(); - //startButton->setEnabled(selected != 4); - startButton->setEnabled(true); - } - break; - case 2: - if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED ) - { - MenuDevice->closeDevice(); - start = true; - } - case 3: - if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - fullscreen = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked(); - break; - case 4: - if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - music = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked(); - break; - case 5: - if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - shadows = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked(); - break; - case 6: - if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - additive = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked(); - break; - case 7: - if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - vsync = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked(); - break; - case 8: - if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED ) - aa = ((gui::IGUICheckBox*)event.GUIEvent.Caller)->isChecked(); - break; - } - } - - return false; -} - - -void CMainMenu::getOriginalSkinColor() -{ - irr::gui::IGUISkin * skin = MenuDevice->getGUIEnvironment()->getSkin(); - for (s32 i=0; igetColor( (gui::EGUI_DEFAULT_COLOR)i ); - } - -} - - -void CMainMenu::setTransparency() -{ - irr::gui::IGUISkin * skin = MenuDevice->getGUIEnvironment()->getSkin(); - - for (u32 i=0; isetColor((gui::EGUI_DEFAULT_COLOR)i, col); - } -} - diff --git a/examples/Demo/CMainMenu.h b/examples/Demo/CMainMenu.h deleted file mode 100644 index 6a3dd358..00000000 --- a/examples/Demo/CMainMenu.h +++ /dev/null @@ -1,56 +0,0 @@ -// This is a Demo of the Irrlicht Engine (c) 2005 by N.Gebhardt. -// This file is not documentated. - -#ifndef __C_MAIN_MENU_H_INCLUDED__ -#define __C_MAIN_MENU_H_INCLUDED__ - -#include - -using namespace irr; - -class CMainMenu : public IEventReceiver -{ -public: - - CMainMenu(); - - bool run(); - - bool getFullscreen() const { return fullscreen; } - bool getMusic() const { return music; } - bool getShadows() const { return shadows; } - bool getAdditive() const { return additive; } - bool getVSync() const { return vsync; } - bool getAntiAliasing() const { return aa; } - video::E_DRIVER_TYPE getDriverType() const { return driverType; } - - - virtual bool OnEvent(const SEvent& event); - -private: - - void setTransparency(); - - gui::IGUIButton* startButton; - IrrlichtDevice *MenuDevice; - s32 selected; - bool start; - bool fullscreen; - bool music; - bool shadows; - bool additive; - bool transparent; - bool vsync; - bool aa; - video::E_DRIVER_TYPE driverType; - - scene::IAnimatedMesh* quakeLevel; - scene::ISceneNode* lightMapNode; - scene::ISceneNode* dynamicNode; - - video::SColor SkinColor [ gui::EGDC_COUNT ]; - void getOriginalSkinColor(); -}; - -#endif - diff --git a/examples/Demo/Demo.vcproj b/examples/Demo/Demo.vcproj deleted file mode 100644 index fe55b37f..00000000 --- a/examples/Demo/Demo.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/Demo/Demo.xcodeproj/project.pbxproj b/examples/Demo/Demo.xcodeproj/project.pbxproj deleted file mode 100644 index b27eb4c6..00000000 --- a/examples/Demo/Demo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,336 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E34CC741B7F8EEF00F212E8 /* main.cpp */; }; - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B01B7F99F500B267D2 /* Cocoa.framework */; }; - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B41B7F9A0700B267D2 /* IOKit.framework */; }; - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */; }; - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */ = {isa = PBXBuildFile; fileRef = 5E8570BE1B7F9D3A00B267D2 /* media */; }; - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */; }; - 5EBFAE801BB493CC0095BC45 /* CDemo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EBFAE7C1BB493CC0095BC45 /* CDemo.cpp */; }; - 5EBFAE811BB493CC0095BC45 /* CMainMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5EBFAE7E1BB493CC0095BC45 /* CMainMenu.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5E34CC511B7F8E6E00F212E8 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E34CC741B7F8EEF00F212E8 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIrrlicht.a; path = ../../lib/OSX/libIrrlicht.a; sourceTree = ""; }; - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 5E8570BE1B7F9D3A00B267D2 /* media */ = {isa = PBXFileReference; lastKnownFileType = folder; name = media; path = ../../media; sourceTree = ""; }; - 5EBFAE7C1BB493CC0095BC45 /* CDemo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDemo.cpp; sourceTree = ""; }; - 5EBFAE7D1BB493CC0095BC45 /* CDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDemo.h; sourceTree = ""; }; - 5EBFAE7E1BB493CC0095BC45 /* CMainMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CMainMenu.cpp; sourceTree = ""; }; - 5EBFAE7F1BB493CC0095BC45 /* CMainMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMainMenu.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570B61B7F9A3200B267D2 /* Cocoa.framework in Frameworks */, - 5E8570B71B7F9A3200B267D2 /* IOKit.framework in Frameworks */, - 5E8570B81B7F9A3200B267D2 /* OpenGL.framework in Frameworks */, - 5E8571181B7FBE8D00B267D2 /* libIrrlicht.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5E34C6D81B7F4A0C00F212E8 = { - isa = PBXGroup; - children = ( - 5EBFAE7C1BB493CC0095BC45 /* CDemo.cpp */, - 5EBFAE7D1BB493CC0095BC45 /* CDemo.h */, - 5EBFAE7E1BB493CC0095BC45 /* CMainMenu.cpp */, - 5EBFAE7F1BB493CC0095BC45 /* CMainMenu.h */, - 5E34CC741B7F8EEF00F212E8 /* main.cpp */, - 5E34CC761B7F905600F212E8 /* Libraries */, - 5E34CC521B7F8E6E00F212E8 /* Products */, - 5E34CC771B7F906D00F212E8 /* Resources */, - ); - sourceTree = ""; - }; - 5E34CC521B7F8E6E00F212E8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E34CC511B7F8E6E00F212E8 /* Demo.app */, - ); - name = Products; - sourceTree = ""; - }; - 5E34CC761B7F905600F212E8 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E8570B01B7F99F500B267D2 /* Cocoa.framework */, - 5E8570B41B7F9A0700B267D2 /* IOKit.framework */, - 5E8570B21B7F99FE00B267D2 /* OpenGL.framework */, - 5E34CC781B7F90A000F212E8 /* libIrrlicht.a */, - ); - name = Libraries; - sourceTree = ""; - }; - 5E34CC771B7F906D00F212E8 /* Resources */ = { - isa = PBXGroup; - children = ( - 5E8570BE1B7F9D3A00B267D2 /* media */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 5E34CC501B7F8E6E00F212E8 /* Demo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "Demo" */; - buildPhases = ( - 5E34CC4D1B7F8E6E00F212E8 /* Sources */, - 5E34CC4E1B7F8E6E00F212E8 /* Frameworks */, - 5E34CC4F1B7F8E6E00F212E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Demo; - productName = 01.HelloWorld; - productReference = 5E34CC511B7F8E6E00F212E8 /* Demo.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5E34C6D91B7F4A0C00F212E8 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - TargetAttributes = { - 5E34CC501B7F8E6E00F212E8 = { - CreatedOnToolsVersion = 6.1; - }; - }; - }; - buildConfigurationList = 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Demo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 5E34C6D81B7F4A0C00F212E8; - productRefGroup = 5E34CC521B7F8E6E00F212E8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5E34CC501B7F8E6E00F212E8 /* Demo */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5E34CC4F1B7F8E6E00F212E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E8570BF1B7F9D3A00B267D2 /* media in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5E34CC4D1B7F8E6E00F212E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5EBFAE811BB493CC0095BC45 /* CMainMenu.cpp in Sources */, - 5EBFAE801BB493CC0095BC45 /* CDemo.cpp in Sources */, - 5E34CC751B7F8EEF00F212E8 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5E34C6DD1B7F4A0C00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - 5E34C6DE1B7F4A0C00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.9; - }; - name = Release; - }; - 5E34CC6C1B7F8E6E00F212E8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 5E34CC6D1B7F8E6E00F212E8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; - DSTROOT = "$(SRCROOT)/../../bin/OSX"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../include", - ); - INFOPLIST_FILE = "$(SRCROOT)/../../media/info_osx.plist"; - INSTALL_PATH = /; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/../../lib/OSX"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5E34C6DC1B7F4A0C00F212E8 /* Build configuration list for PBXProject "Demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34C6DD1B7F4A0C00F212E8 /* Debug */, - 5E34C6DE1B7F4A0C00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E34CC701B7F8E6E00F212E8 /* Build configuration list for PBXNativeTarget "Demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5E34CC6C1B7F8E6E00F212E8 /* Debug */, - 5E34CC6D1B7F8E6E00F212E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5E34C6D91B7F4A0C00F212E8 /* Project object */; -} diff --git a/examples/Demo/Demo.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme b/examples/Demo/Demo.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme deleted file mode 100644 index e0fffcbd..00000000 --- a/examples/Demo/Demo.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/Demo/Demo_vc10.vcxproj b/examples/Demo/Demo_vc10.vcxproj deleted file mode 100644 index c6d213fe..00000000 --- a/examples/Demo/Demo_vc10.vcxproj +++ /dev/null @@ -1,283 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {6F076455-D955-45D4-9C68-4AD4E45F2D47} - Demo - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win64-VisualStudio\Demo.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - $(OutDir)$(TargetName)$(TargetExt) - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/Demo/Demo_vc11.vcxproj b/examples/Demo/Demo_vc11.vcxproj deleted file mode 100644 index f1db13d6..00000000 --- a/examples/Demo/Demo_vc11.vcxproj +++ /dev/null @@ -1,283 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {6F076455-D955-45D4-9C68-4AD4E45F2D47} - Demo - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\Demo.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\Demo.exe - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/Demo/Demo_vc12.vcxproj b/examples/Demo/Demo_vc12.vcxproj deleted file mode 100644 index 320adde3..00000000 --- a/examples/Demo/Demo_vc12.vcxproj +++ /dev/null @@ -1,283 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {6F076455-D955-45D4-9C68-4AD4E45F2D47} - Demo - - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - Application - MultiByte - Windows7.1SDK - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\Demo.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - $(OutDir)$(TargetName)$(TargetExt) - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/Demo/Demo_vc14.vcxproj b/examples/Demo/Demo_vc14.vcxproj deleted file mode 100644 index cb85feb3..00000000 --- a/examples/Demo/Demo_vc14.vcxproj +++ /dev/null @@ -1,283 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {6F076455-D955-45D4-9C68-4AD4E45F2D47} - Demo - - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - Application - MultiByte - v140 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - - - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\bin\Win32-VisualStudio\Demo.exe - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - .\Release/Demo.tlb - - - - - MaxSpeed - Default - false - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - true - - - Level3 - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - $(OutDir)$(TargetName)$(TargetExt) - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - .\Debug/Demo.tlb - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c07 - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Windows - - - - - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - Disabled - Disabled - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - EnableFastChecks - EnableFastChecks - MaxSpeed - MaxSpeed - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/Demo/Makefile b/examples/Demo/Makefile deleted file mode 100644 index 706ce7c1..00000000 --- a/examples/Demo/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := Demo -# List of source files, separated by spaces -Sources := CDemo.cpp CMainMenu.cpp main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -CPPFLAGS += -I$(IrrlichtHome)/include -I/usr/X11R6/include -ifndef NDEBUG -CXXFLAGS += -g -Wall -else -CXXFLAGS += -O3 -endif - -# if you enable sound add the proper library for linking -#LDFLAGS += -lIrrKlang -#LDFLAGS += -laudiere -#LDFLAGS += -lSDL_mixer -lSDL - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lEGL -lGLESv1_CM -lGLESv2 -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lEGL -lGLESv1_CM -lGLESv2 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif diff --git a/examples/Demo/demo.cbp b/examples/Demo/demo.cbp deleted file mode 100644 index 4c620406..00000000 --- a/examples/Demo/demo.cbp +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - diff --git a/examples/Demo/icon.ico b/examples/Demo/icon.ico deleted file mode 100644 index 49f8eabb414adaa1687bc1135a40c43e39ba5971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmc(gKWHOI6o;R|uto^|u_RXxI8GDSQ@IOXSCI{ufNOWtZRf*Sq;TarIAEAmDw2>C z*}|Ysg{v##sqH4NTpWlMyDKfokYe)9=wh7XxOBOZW_IWIX5R1HH!E9Yh0oTOg!b#2 z$Od;`(zobe(N_e~x7Fn(j4O=3hjuQ)SI*Cu7e;R7=H^Cj{=AXmk6&bUbye2Z)}&sq zOS|2cjg1Z2+}xDy?QPlF*^#58BRM=gl)b$@+1=fh^Y5IzdgbH?xf7RJd2^S`-P^bF z{cpcxr0AM%=yo|(XbMfCDX+QZ5{<6WHM&OE=zg0)H|U0mK{x1J#G+eti*6Atx?}E` zI~$x8qrzX2NU=$YlVH!FU{Ek97!(Wv2?hm&fRtB3I+v3K!-uWpkPoi zC>WGOgG0fgJco0k0w`Sl$IvYu-9Iuc8gq@2CaH!cl!2h;M#G|E31xvp!=d5OaA-I} zso>BsXc#mMzH}N64TFZk;^i1a3GrEen1}NE>Oh6JVO1zK-UcRvslmX&Wbifw4M_~% z2Jdhj!5bZagTKMwACbY|P#Xh-fx%D*e{57GJUt3mMt_Xdz~X0Nvv64a!qIvTYGC28 zo`VMq$IT`Si-pAkVKEG^04$b`mPHo9!ortM9?rzVVtqXVi+>yZDWJjNU~n)v7#s`^ zhVVMUU}11DI2bGpq@lAO1_y(K!NEXkIywvv1_y%!z~OI6=Gf?1q{*R~YdBoU?bm4e zTz;10<6}8JJ(Y`#3%RkYtd~libXSvY7^ouA7_z|N0oD()@6Nt zTvg+usCBbN`vY;Gmo^Ip{Xo3g8M`VUm$gY=#4qBw`22a&$fB%~jo#-A&5z3|Bu^(dD9;gE;roag^tIH2JUkHP_#7-S|ao#OeD@ z*Z3ds{MN*yMLHU>hQVLb(fW4(px6gX(CxhY8ob>mb4fcn4I-Y0C6yvnFe>U`O;8)Z`oB~uiabJk6_w_RV zoZ~T*=&C_>$-hVJ0oIU%e;aoi*`5k-*uf2DRM}%)Q yO{b&jbm|{HTzdQce!u6VA?|DPucklyVtZK~A8))U_VTv*T-*QShCc_NwEYe2vp9 -#ifdef _IRR_WINDOWS_ -#include -#endif - -#include - -#include "CMainMenu.h" -#include "CDemo.h" - -using namespace irr; - -#ifdef _MSC_VER - -#pragma comment(lib, "Irrlicht.lib") -INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) -#else -int main(int argc, char* argv[]) -#endif -{ - CMainMenu menu; - - if (menu.run()) - { - CDemo demo(menu.getFullscreen(), - menu.getMusic(), - menu.getShadows(), - menu.getAdditive(), - menu.getVSync(), - menu.getAntiAliasing(), - menu.getDriverType()); - demo.run(); - } - - return 0; -} - diff --git a/examples/Demo/resource.h b/examples/Demo/resource.h deleted file mode 100644 index eb3b976e..00000000 --- a/examples/Demo/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by resscript.rc -// -#define IDI_ICON1 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/examples/Demo/resscript.rc b/examples/Demo/resscript.rc deleted file mode 100644 index be12eb7f..00000000 --- a/examples/Demo/resscript.rc +++ /dev/null @@ -1,72 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Deutsch (Österreich) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEA) -#ifdef _WIN32 -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICON1 ICON DISCARDABLE "icon.ico" -#endif // Deutsch (Österreich) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/examples/buildAllExamples.sh b/examples/buildAllExamples.sh deleted file mode 100755 index e9de098a..00000000 --- a/examples/buildAllExamples.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/bash -[ -z $1 ] || TARGET=$1 -[ -z $TARGET ] && TARGET=all -for i in [0123]* Demo; do - echo "Building $i"; - pushd $i && make clean $TARGET; - popd; -done diff --git a/examples/whereAreTheBinaries.txt b/examples/whereAreTheBinaries.txt deleted file mode 100644 index d9f7d6ad..00000000 --- a/examples/whereAreTheBinaries.txt +++ /dev/null @@ -1,7 +0,0 @@ -If you are searching for executeables of the examples and the demo, -you'll find some for Windows in the directory -/bin/win32-VisualStudio. - -For Linux, just go into the directory of the example you want and -execute a simple 'make' after you made the engine from source/Irrlicht. - diff --git a/include/ESceneNodeAnimatorTypes.h b/include/ESceneNodeAnimatorTypes.h deleted file mode 100644 index f771d128..00000000 --- a/include/ESceneNodeAnimatorTypes.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __E_SCENE_NODE_ANIMATOR_TYPES_H_INCLUDED__ -#define __E_SCENE_NODE_ANIMATOR_TYPES_H_INCLUDED__ - -namespace irr -{ -namespace scene -{ - - //! An enumeration for all types of built-in scene node animators - enum ESCENE_NODE_ANIMATOR_TYPE - { - //! Fly circle scene node animator - ESNAT_FLY_CIRCLE = 0, - - //! Fly straight scene node animator - ESNAT_FLY_STRAIGHT, - - //! Follow spline scene node animator - ESNAT_FOLLOW_SPLINE, - - //! Rotation scene node animator - ESNAT_ROTATION, - - //! Texture scene node animator - ESNAT_TEXTURE, - - //! Deletion scene node animator - ESNAT_DELETION, - - //! Collision response scene node animator - ESNAT_COLLISION_RESPONSE, - - //! FPS camera animator - ESNAT_CAMERA_FPS, - - //! Maya camera animator - ESNAT_CAMERA_MAYA, - - //! Amount of built-in scene node animators - ESNAT_COUNT, - - //! Unknown scene node animator - ESNAT_UNKNOWN, - - //! This enum is never used, it only forces the compiler to compile this enumeration to 32 bit. - ESNAT_FORCE_32_BIT = 0x7fffffff - }; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/ESceneNodeTypes.h b/include/ESceneNodeTypes.h index 0eeab92a..2573ca08 100644 --- a/include/ESceneNodeTypes.h +++ b/include/ESceneNodeTypes.h @@ -21,42 +21,9 @@ namespace scene //! of type CSceneManager (note that ISceneManager is not(!) an ISceneNode) ESNT_SCENE_MANAGER = MAKE_IRR_ID('s','m','n','g'), - //! simple cube scene node - ESNT_CUBE = MAKE_IRR_ID('c','u','b','e'), - - //! Sphere scene node - ESNT_SPHERE = MAKE_IRR_ID('s','p','h','r'), - - //! Text Scene Node - ESNT_TEXT = MAKE_IRR_ID('t','e','x','t'), - - //! Billboard text scene node - ESNT_BILLBOARD_TEXT = MAKE_IRR_ID('b','t','x','t'), - - //! Water Surface Scene Node - ESNT_WATER_SURFACE = MAKE_IRR_ID('w','a','t','r'), - - //! Terrain Scene Node - ESNT_TERRAIN = MAKE_IRR_ID('t','e','r','r'), - - //! Sky Box Scene Node - ESNT_SKY_BOX = MAKE_IRR_ID('s','k','y','_'), - - //! Sky Dome Scene Node - ESNT_SKY_DOME = MAKE_IRR_ID('s','k','y','d'), - - //! Shadow Volume Scene Node - ESNT_SHADOW_VOLUME = MAKE_IRR_ID('s','h','d','w'), - - //! Octree Scene Node - ESNT_OCTREE = MAKE_IRR_ID('o','c','t','r'), - //! Mesh Scene Node ESNT_MESH = MAKE_IRR_ID('m','e','s','h'), - //! Light Scene Node - ESNT_LIGHT = MAKE_IRR_ID('l','g','h','t'), - //! Empty Scene Node ESNT_EMPTY = MAKE_IRR_ID('e','m','t','y'), @@ -72,26 +39,6 @@ namespace scene //! Animated Mesh Scene Node ESNT_ANIMATED_MESH = MAKE_IRR_ID('a','m','s','h'), - //! Particle System Scene Node - ESNT_PARTICLE_SYSTEM = MAKE_IRR_ID('p','t','c','l'), - - //! Quake3 Shader Scene Node - ESNT_Q3SHADER_SCENE_NODE = MAKE_IRR_ID('q','3','s','h'), - - //! Quake3 Model Scene Node ( has tag to link to ) - ESNT_MD3_SCENE_NODE = MAKE_IRR_ID('m','d','3','_'), - - //! Volume Light Scene Node - ESNT_VOLUME_LIGHT = MAKE_IRR_ID('v','o','l','l'), - - //! Maya Camera Scene Node - /** Legacy, for loading version <= 1.4.x .irr files */ - ESNT_CAMERA_MAYA = MAKE_IRR_ID('c','a','m','M'), - - //! First Person Shooter Camera - /** Legacy, for loading version <= 1.4.x .irr files */ - ESNT_CAMERA_FPS = MAKE_IRR_ID('c','a','m','F'), - //! Unknown scene node ESNT_UNKNOWN = MAKE_IRR_ID('u','n','k','n'), diff --git a/include/IAnimatedMeshMD2.h b/include/IAnimatedMeshMD2.h deleted file mode 100644 index 6830f37e..00000000 --- a/include/IAnimatedMeshMD2.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_ANIMATED_MESH_MD2_H_INCLUDED__ -#define __I_ANIMATED_MESH_MD2_H_INCLUDED__ - -#include "IAnimatedMesh.h" - -namespace irr -{ -namespace scene -{ - - //! Types of standard md2 animations - enum EMD2_ANIMATION_TYPE - { - EMAT_STAND = 0, - EMAT_RUN, - EMAT_ATTACK, - EMAT_PAIN_A, - EMAT_PAIN_B, - EMAT_PAIN_C, - EMAT_JUMP, - EMAT_FLIP, - EMAT_SALUTE, - EMAT_FALLBACK, - EMAT_WAVE, - EMAT_POINT, - EMAT_CROUCH_STAND, - EMAT_CROUCH_WALK, - EMAT_CROUCH_ATTACK, - EMAT_CROUCH_PAIN, - EMAT_CROUCH_DEATH, - EMAT_DEATH_FALLBACK, - EMAT_DEATH_FALLFORWARD, - EMAT_DEATH_FALLBACKSLOW, - EMAT_BOOM, - - //! Not an animation, but amount of animation types. - EMAT_COUNT - }; - - //! Interface for using some special functions of MD2 meshes - class IAnimatedMeshMD2 : public IAnimatedMesh - { - public: - - //! Get frame loop data for a default MD2 animation type. - /** \param l The EMD2_ANIMATION_TYPE to get the frames for. - \param outBegin The returned beginning frame for animation type specified. - \param outEnd The returned ending frame for the animation type specified. - \param outFPS The number of frames per second, this animation should be played at. - \return beginframe, endframe and frames per second for a default MD2 animation type. */ - virtual void getFrameLoop(EMD2_ANIMATION_TYPE l, s32& outBegin, - s32& outEnd, s32& outFPS) const = 0; - - //! Get frame loop data for a special MD2 animation type, identified by name. - /** \param name Name of the animation. - \param outBegin The returned beginning frame for animation type specified. - \param outEnd The returned ending frame for the animation type specified. - \param outFPS The number of frames per second, this animation should be played at. - \return beginframe, endframe and frames per second for a special MD2 animation type. */ - virtual bool getFrameLoop(const c8* name, - s32& outBegin, s32& outEnd, s32& outFPS) const = 0; - - //! Get amount of md2 animations in this file. - virtual s32 getAnimationCount() const = 0; - - //! Get name of md2 animation. - /** \param nr: Zero based index of animation. */ - virtual const c8* getAnimationName(s32 nr) const = 0; - }; - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/IAnimatedMeshMD3.h b/include/IAnimatedMeshMD3.h deleted file mode 100644 index cdd416e5..00000000 --- a/include/IAnimatedMeshMD3.h +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright (C) 2007-2012 Nikolaus Gebhardt / Thomas Alten -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_ANIMATED_MESH_MD3_H_INCLUDED__ -#define __I_ANIMATED_MESH_MD3_H_INCLUDED__ - -#include "IAnimatedMesh.h" -#include "IQ3Shader.h" -#include "quaternion.h" - -namespace irr -{ -namespace scene -{ - - enum eMD3Models - { - EMD3_HEAD = 0, - EMD3_UPPER, - EMD3_LOWER, - EMD3_WEAPON, - EMD3_NUMMODELS - }; - - //! Animation list - enum EMD3_ANIMATION_TYPE - { - // Animations for both lower and upper parts of the player - EMD3_BOTH_DEATH_1 = 0, - EMD3_BOTH_DEAD_1, - EMD3_BOTH_DEATH_2, - EMD3_BOTH_DEAD_2, - EMD3_BOTH_DEATH_3, - EMD3_BOTH_DEAD_3, - - // Animations for the upper part - EMD3_TORSO_GESTURE, - EMD3_TORSO_ATTACK_1, - EMD3_TORSO_ATTACK_2, - EMD3_TORSO_DROP, - EMD3_TORSO_RAISE, - EMD3_TORSO_STAND_1, - EMD3_TORSO_STAND_2, - - // Animations for the lower part - EMD3_LEGS_WALK_CROUCH, - EMD3_LEGS_WALK, - EMD3_LEGS_RUN, - EMD3_LEGS_BACK, - EMD3_LEGS_SWIM, - EMD3_LEGS_JUMP_1, - EMD3_LEGS_LAND_1, - EMD3_LEGS_JUMP_2, - EMD3_LEGS_LAND_2, - EMD3_LEGS_IDLE, - EMD3_LEGS_IDLE_CROUCH, - EMD3_LEGS_TURN, - - //! Not an animation, but amount of animation types. - EMD3_ANIMATION_COUNT - }; - - struct SMD3AnimationInfo - { - //! First frame - s32 first; - //! Last frame - s32 num; - //! Looping frames - s32 looping; - //! Frames per second - s32 fps; - }; - - -// byte-align structures -#include "irrpack.h" - - //! this holds the header info of the MD3 file - struct SMD3Header - { - c8 headerID[4]; //id of file, always "IDP3" - s32 Version; //this is a version number, always 15 - s8 fileName[68];//sometimes left Blank... 65 chars, 32bit aligned == 68 chars - s32 numFrames; //number of KeyFrames - s32 numTags; //number of 'tags' per frame - s32 numMeshes; //number of meshes/skins - s32 numMaxSkins;//maximum number of unique skins used in md3 file. artefact md2 - s32 frameStart; //starting position of frame-structur - s32 tagStart; //starting position of tag-structures - s32 tagEnd; //ending position of tag-structures/starting position of mesh-structures - s32 fileSize; - } PACK_STRUCT; - - //! this holds the header info of an MD3 mesh section - struct SMD3MeshHeader - { - c8 meshID[4]; //id, must be IDP3 - c8 meshName[68]; //name of mesh 65 chars, 32 bit aligned == 68 chars - - s32 numFrames; //number of meshframes in mesh - s32 numShader; //number of skins in mesh - s32 numVertices; //number of vertices - s32 numTriangles; //number of Triangles - - s32 offset_triangles; //starting position of Triangle data, relative to start of Mesh_Header - s32 offset_shaders; //size of header - s32 offset_st; //starting position of texvector data, relative to start of Mesh_Header - s32 vertexStart; //starting position of vertex data,relative to start of Mesh_Header - s32 offset_end; - } PACK_STRUCT; - - - //! Compressed Vertex Data - struct SMD3Vertex - { - s16 position[3]; - u8 normal[2]; - } PACK_STRUCT; - - //! Texture Coordinate - struct SMD3TexCoord - { - f32 u; - f32 v; - } PACK_STRUCT; - - //! Triangle Index - struct SMD3Face - { - s32 Index[3]; - } PACK_STRUCT; - - -// Default alignment -#include "irrunpack.h" - - //! Holding Frame Data for a Mesh - struct SMD3MeshBuffer : public IReferenceCounted - { - SMD3MeshHeader MeshHeader; - - core::stringc Shader; - core::array < s32 > Indices; - core::array < SMD3Vertex > Vertices; - core::array < SMD3TexCoord > Tex; - }; - - //! hold a tag info for connecting meshes - /** Basically its an alternate way to describe a transformation. */ - struct SMD3QuaternionTag - { - virtual ~SMD3QuaternionTag() - { - position.X = 0.f; - } - - // construct for searching - SMD3QuaternionTag( const core::stringc& name ) - : Name ( name ) {} - - // construct from a position and euler angles in degrees - SMD3QuaternionTag ( const core::vector3df &pos, const core::vector3df &angle ) - : position(pos), rotation(angle * core::DEGTORAD) {} - - // set to matrix - void setto ( core::matrix4 &m ) - { - rotation.getMatrix ( m, position ); - } - - bool operator == ( const SMD3QuaternionTag &other ) const - { - return Name == other.Name; - } - - core::stringc Name; - core::vector3df position; - core::quaternion rotation; - }; - - //! holds a associative list of named quaternions - struct SMD3QuaternionTagList - { - SMD3QuaternionTagList() - { - Container.setAllocStrategy(core::ALLOC_STRATEGY_SAFE); - } - - virtual ~SMD3QuaternionTagList() {} - - SMD3QuaternionTag* get(const core::stringc& name) - { - SMD3QuaternionTag search ( name ); - s32 index = Container.linear_search ( search ); - if ( index >= 0 ) - return &Container[index]; - return 0; - } - - u32 size () const - { - return Container.size(); - } - - void set_used(u32 new_size) - { - s32 diff = (s32) new_size - (s32) Container.allocated_size(); - if ( diff > 0 ) - { - SMD3QuaternionTag e(""); - for ( s32 i = 0; i < diff; ++i ) - Container.push_back(e); - } - } - - const SMD3QuaternionTag& operator[](u32 index) const - { - return Container[index]; - } - - SMD3QuaternionTag& operator[](u32 index) - { - return Container[index]; - } - - void push_back(const SMD3QuaternionTag& other) - { - Container.push_back(other); - } - - private: - core::array < SMD3QuaternionTag > Container; - }; - - - //! Holding Frames Buffers and Tag Infos - struct SMD3Mesh: public IReferenceCounted - { - SMD3Mesh () - { - MD3Header.numFrames = 0; - } - - virtual ~SMD3Mesh() - { - for (u32 i=0; idrop(); - } - - core::stringc Name; - core::array Buffer; - SMD3QuaternionTagList TagList; - SMD3Header MD3Header; - }; - - - //! Interface for using some special functions of MD3 meshes - class IAnimatedMeshMD3 : public IAnimatedMesh - { - public: - - //! tune how many frames you want to render in between. - virtual void setInterpolationShift(u32 shift, u32 loopMode) =0; - - //! get the tag list of the mesh. - virtual SMD3QuaternionTagList* getTagList(s32 frame, s32 detailLevel, s32 startFrameLoop, s32 endFrameLoop) =0; - - //! get the original md3 mesh. - virtual SMD3Mesh* getOriginalMesh() =0; - }; - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/IAnimatedMeshSceneNode.h b/include/IAnimatedMeshSceneNode.h index 5a399039..ef16dd80 100644 --- a/include/IAnimatedMeshSceneNode.h +++ b/include/IAnimatedMeshSceneNode.h @@ -7,15 +7,12 @@ #include "ISceneNode.h" #include "IBoneSceneNode.h" -#include "IAnimatedMeshMD2.h" -#include "IAnimatedMeshMD3.h" +#include "IAnimatedMesh.h" namespace irr { namespace scene { - class IShadowVolumeSceneNode; - enum E_JOINT_UPDATE_ON_RENDER { //! do nothing @@ -88,31 +85,6 @@ namespace scene /** \return Frames per second played. */ virtual f32 getAnimationSpeed() const =0; - /** The shadow can be rendered using the ZPass or the zfail - method. ZPass is a little bit faster because the shadow volume - creation is easier, but with this method there occur ugly - looking artifacts when the camera is inside the shadow volume. - These error do not occur with the ZFail method, but it can - have trouble with clipping to the far-plane (it usually works - well in OpenGL and fails with other drivers). - \param shadowMesh: Optional custom mesh for shadow volume. - \param id: Id of the shadow scene node. This id can be used to - identify the node later. - \param zfailmethod: If set to true, the shadow will use the - zfail method, if not, zpass is used. - \param infinity: Value used by the shadow volume algorithm to - scale the shadow volume. For zfail shadow volumes on some drivers - only suppport finite shadows, so camera zfar must be larger than - shadow back cap,which is depending on the infinity parameter). - Infinity value also scales by the scaling factors of the model. - If shadows don't show up with zfail then try reducing infinity. - If shadows are cut-off then try increasing infinity. - \return Pointer to the created shadow scene node. This pointer - should not be dropped. See IReferenceCounted::drop() for more - information. */ - virtual IShadowVolumeSceneNode* addShadowVolumeSceneNode(const IMesh* shadowMesh=0, - s32 id=-1, bool zfailmethod=true, f32 infinity=1000.0f) = 0; - //! Get a pointer to a joint in the mesh (if the mesh is a bone based mesh). /** With this method it is possible to attach scene nodes to joints for example possible to attach a weapon to the left hand @@ -137,31 +109,6 @@ namespace scene /** \return Amount of joints in the mesh. */ virtual u32 getJointCount() const = 0; - //! Starts a default MD2 animation. - /** With this method it is easily possible to start a Run, - Attack, Die or whatever animation, if the mesh contained in - this scene node is an md2 mesh. Otherwise, nothing happens. - \param anim: An MD2 animation type, which should be played, for - example EMAT_STAND for the standing animation. - \return True if successful, and false if not, for example if - the mesh in the scene node is not a md2 mesh. */ - virtual bool setMD2Animation(EMD2_ANIMATION_TYPE anim) = 0; - - //! Starts a special MD2 animation. - /** With this method it is easily possible to start a Run, - Attack, Die or whatever animation, if the mesh contained in - this scene node is an md2 mesh. Otherwise, nothing happens. - This method uses a character string to identify the animation. - If the animation is a standard md2 animation, you might want to - start this animation with the EMD2_ANIMATION_TYPE enumeration - instead. - \param animationName: Name of the animation which should be - played. - \return Returns true if successful, and false if not, for - example if the mesh in the scene node is not an md2 mesh, or no - animation with this name could be found. */ - virtual bool setMD2Animation(const c8* animationName) = 0; - //! Returns the currently displayed frame number. virtual f32 getFrameNr() const = 0; //! Returns the current start frame number. @@ -198,9 +145,6 @@ namespace scene //! Returns the current mesh virtual IAnimatedMesh* getMesh(void) = 0; - //! Get the absolute transformation for a special MD3 Tag if the mesh is a md3 mesh, or the absolutetransformation if it's a normal scenenode - virtual const SMD3QuaternionTag* getMD3TagTransformation( const core::stringc & tagname) = 0; - //! Set how the joints should be updated on render virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode)=0; diff --git a/include/IBillboardTextSceneNode.h b/include/IBillboardTextSceneNode.h deleted file mode 100644 index 0526b63f..00000000 --- a/include/IBillboardTextSceneNode.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_BILLBOARD_TEXT_SCENE_NODE_H_INCLUDED__ -#define __I_BILLBOARD_TEXT_SCENE_NODE_H_INCLUDED__ - -#include "IBillboardSceneNode.h" - -namespace irr -{ - -namespace gui -{ - class IGUIFont; -} - -namespace scene -{ - -//! A billboard text scene node. -/** Acts like a billboard which displays the currently set text. - Due to the exclusion of RTTI in Irrlicht we have to avoid multiple - inheritance. Hence, changes to the ITextSceneNode interface have - to be copied here manually. -*/ -class IBillboardTextSceneNode : public IBillboardSceneNode -{ -public: - - //! Constructor - IBillboardTextSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position = core::vector3df(0,0,0)) - : IBillboardSceneNode(parent, mgr, id, position) {} - - //! Sets the size of the billboard. - virtual void setSize(const core::dimension2d& size) = 0; - - //! Returns the size of the billboard. - virtual const core::dimension2d& getSize() const = 0; - - //! Set the color of all vertices of the billboard - /** \param overallColor: the color to set */ - virtual void setColor(const video::SColor & overallColor) = 0; - - //! Set the color of the top and bottom vertices of the billboard - /** \param topColor: the color to set the top vertices - \param bottomColor: the color to set the bottom vertices */ - virtual void setColor(const video::SColor & topColor, const video::SColor & bottomColor) = 0; - - //! Gets the color of the top and bottom vertices of the billboard - /** \param topColor: stores the color of the top vertices - \param bottomColor: stores the color of the bottom vertices */ - virtual void getColor(video::SColor & topColor, video::SColor & bottomColor) const = 0; - - //! sets the text string - virtual void setText(const wchar_t* text) = 0; - - //! get the text string - virtual const wchar_t* getText() const = 0; - - //! sets the color of the text - //! You can use setColor instead which does the same - virtual void setTextColor(video::SColor color) - { - setColor(color); - } - - //! Get the font used to draw the text - virtual gui::IGUIFont* getFont() const = 0; -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IGeometryCreator.h b/include/IGeometryCreator.h deleted file mode 100644 index 6083f5b4..00000000 --- a/include/IGeometryCreator.h +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_GEOMETRY_CREATOR_H_INCLUDED__ -#define __I_GEOMETRY_CREATOR_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "IMesh.h" -#include "IImage.h" - -namespace irr -{ -namespace video -{ - class IVideoDriver; - class SMaterial; -} - -namespace scene -{ - - enum ECUBE_MESH_TYPE - { - //! Single buffer with 12 different vertices, normals are average of adjacent planes - //! Order for outgoing (front-face) normals of planes would be: NEG_Z, POS_X, POS_Z, NEG_X, POS_Y, NEG_Y - ECMT_1BUF_12VTX_NA, - - //! One buffer per side, each with 4 vertices, normals are perpendicular to sides - //! Note: You probably will have to scale down your texture uv's to avoid white lines at borders - // as this mesh sets them to 0,1 values. We can't do that when creating the mesh as it - // depends on texture resolution which we don't know at that point. - ECMT_6BUF_4VTX_NP - }; - -//! Helper class for creating geometry on the fly. -/** You can get an instance of this class through ISceneManager::getGeometryCreator() */ -class IGeometryCreator : public IReferenceCounted -{ -public: - - //! Creates a simple cube mesh. - /** - \param size Dimensions of the cube. - \param type One of ECUBE_MESH_TYPE. So you can chose between cubes with single material or independent materials per side. - \return Generated mesh. - */ - virtual IMesh* createCubeMesh(const core::vector3df& size=core::vector3df(5.f,5.f,5.f), ECUBE_MESH_TYPE type = ECMT_1BUF_12VTX_NA) const =0; - - //! Create a pseudo-random mesh representing a hilly terrain. - /** - \param tileSize The size of each tile. - \param tileCount The number of tiles in each dimension. - \param material The material to apply to the mesh. - \param hillHeight The maximum height of the hills. - \param countHills The number of hills along each dimension. - \param textureRepeatCount The number of times to repeat the material texture along each dimension. - \return Generated mesh. - */ - virtual IMesh* createHillPlaneMesh( - const core::dimension2d& tileSize, - const core::dimension2d& tileCount, - video::SMaterial* material, f32 hillHeight, - const core::dimension2d& countHills, - const core::dimension2d& textureRepeatCount) const =0; - - //! Create a simple rectangular textured plane mesh. - /** - \param tileSize The size of each tile. - \param tileCount The number of tiles in each dimension. - \param material The material to apply to the mesh. - \param textureRepeatCount The number of times to repeat the material texture along each dimension. - \return Generated mesh. - */ - IMesh* createPlaneMesh( - const core::dimension2d& tileSize, - const core::dimension2d& tileCount=core::dimension2du(1,1), - video::SMaterial* material=0, - const core::dimension2df& textureRepeatCount=core::dimension2df(1.f,1.f)) const - { - return createHillPlaneMesh(tileSize, tileCount, material, 0.f, core::dimension2df(), textureRepeatCount); - } - - //! Create a geoplane. - /** - \param radius Radius of the plane - \param rows How many rows to place - \param columns How many columns to place - \return Generated mesh. - */ - virtual IMesh* createGeoplaneMesh(f32 radius = 5.f, - u32 rows = 16, u32 columns = 16) const =0; - - //! Create a terrain mesh from an image representing a heightfield. - /** - \param texture The texture to apply to the terrain. - \param heightmap An image that will be interpreted as a heightmap. The - brightness (average color) of each pixel is interpreted as a height, - with a 255 brightness pixel producing the maximum height. - \param stretchSize The size that each pixel will produce, i.e. a - 512x512 heightmap - and a stretchSize of (10.f, 20.f) will produce a mesh of size - 5120.f x 10240.f - \param maxHeight The maximum height of the terrain. - \param driver The current video driver. - \param defaultVertexBlockSize (to be documented) - \param debugBorders (to be documented) - \return Generated mesh. - */ - virtual IMesh* createTerrainMesh(video::IImage* texture, - video::IImage* heightmap, - const core::dimension2d& stretchSize, - f32 maxHeight, video::IVideoDriver* driver, - const core::dimension2d& defaultVertexBlockSize, - bool debugBorders=false) const =0; - - //! Create an arrow mesh, composed of a cylinder and a cone. - /** - \param tesselationCylinder Number of quads composing the cylinder. - \param tesselationCone Number of triangles composing the cone's roof. - \param height Total height of the arrow - \param cylinderHeight Total height of the cylinder, should be lesser - than total height - \param widthCylinder Diameter of the cylinder - \param widthCone Diameter of the cone's base, should be not smaller - than the cylinder's diameter - \param colorCylinder color of the cylinder - \param colorCone color of the cone - \return Generated mesh. - */ - virtual IMesh* createArrowMesh(const u32 tesselationCylinder = 4, - const u32 tesselationCone = 8, const f32 height = 1.f, - const f32 cylinderHeight = 0.6f, const f32 widthCylinder = 0.05f, - const f32 widthCone = 0.3f, const video::SColor colorCylinder = 0xFFFFFFFF, - const video::SColor colorCone = 0xFFFFFFFF) const =0; - - - //! Create a sphere mesh. - /** - \param radius Radius of the sphere - \param polyCountX Number of quads used for the horizontal tiling - \param polyCountY Number of quads used for the vertical tiling - \return Generated mesh. - */ - virtual IMesh* createSphereMesh(f32 radius = 5.f, - u32 polyCountX = 16, u32 polyCountY = 16) const =0; - - //! Create a cylinder mesh. - /** - \param radius Radius of the cylinder. - \param length Length of the cylinder. - \param tesselation Number of quads around the circumference of the cylinder. - \param color The color of the cylinder. - \param closeTop If true, close the ends of the cylinder, otherwise leave them open. - \param oblique X-offset (shear) of top compared to bottom. - \param normalType When 0 side normals are radial from origin. Note that origin is at the bottom. - When 1 side normals are flat along top/bottom polygons. - NOTE: To get normals which are perpendicular to the side of an oblique - cylinder, don't use the oblique parameter. Instead set normalType to 1 - and create a cylinder with oblique set to 0. Then use - IMeshManipulator::transform with a shear matrix on the returned mesh. - You get a shear matrix for an identical effect of this oblique parameter when you - set the 4th element of an identity matrix to (oblique/length). - \return Generated mesh. - */ - virtual IMesh* createCylinderMesh(f32 radius, f32 length, - u32 tesselation, - const video::SColor& color=video::SColor(0xffffffff), - bool closeTop=true, f32 oblique=0.f, u32 normalType=0) const =0; - - //! Create a cone mesh. - /** - \param radius Radius of the cone. - \param length Length of the cone. - \param tesselation Number of quads around the circumference of the cone. - \param colorTop The color of the top of the cone. - \param colorBottom The color of the bottom of the cone. - \param oblique (to be documented) - \return Generated mesh. - */ - virtual IMesh* createConeMesh(f32 radius, f32 length, u32 tesselation, - const video::SColor& colorTop=video::SColor(0xffffffff), - const video::SColor& colorBottom=video::SColor(0xffffffff), - f32 oblique=0.f) const =0; - - //! Create a volume light mesh. - /** - \param subdivideU Horizontal patch count. - \param subdivideV Vertical patch count. - \param footColor Color at the bottom of the light. - \param tailColor Color at the mid of the light. - \param lpDistance Virtual distance of the light point for normals. - \param lightDim Dimensions of the light. - \return Generated mesh. - */ - virtual IMesh* createVolumeLightMesh( - const u32 subdivideU=32, const u32 subdivideV=32, - const video::SColor footColor = 0xffffffff, - const video::SColor tailColor = 0xffffffff, - const f32 lpDistance = 8.f, - const core::vector3df& lightDim = core::vector3df(1.f,1.2f,1.f)) const =0; -}; - - -} // end namespace scene -} // end namespace irr - -#endif // __I_GEOMETRY_CREATOR_H_INCLUDED__ - diff --git a/include/ILightManager.h b/include/ILightManager.h deleted file mode 100644 index ff667983..00000000 --- a/include/ILightManager.h +++ /dev/null @@ -1,62 +0,0 @@ -// Written by Colin MacDonald - all rights assigned to Nikolaus Gebhardt -// Copyright (C) 2008-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_LIGHT_MANAGER_H_INCLUDED__ -#define __I_LIGHT_MANAGER_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "irrArray.h" - -namespace irr -{ -namespace scene -{ - class ILightSceneNode; - - //! ILightManager provides an interface for user applications to manipulate the list of lights in the scene. - /** The light list can be trimmed or re-ordered before device/ hardware - lights are created, and/or individual lights can be switched on and off - before or after each scene node is rendered. It is assumed that the - ILightManager implementation will store any data that it wishes to - retain, i.e. the ISceneManager to which it is assigned, the lightList, - the current render pass, and the current scene node. */ - class ILightManager : public IReferenceCounted - { - public: - //! Called after the scene's light list has been built, but before rendering has begun. - /** As actual device/hardware lights are not created until the - ESNRP_LIGHT render pass, this provides an opportunity for the - light manager to trim or re-order the light list, before any - device/hardware lights have actually been created. - \param lightList: the Scene Manager's light list, which - the light manager may modify. This reference will remain valid - until OnPostRender(). - */ - virtual void OnPreRender(core::array & lightList) = 0; - - //! Called after the last scene node is rendered. - /** After this call returns, the lightList passed to OnPreRender() becomes invalid. */ - virtual void OnPostRender(void) = 0; - - //! Called before a render pass begins - /** \param renderPass: the render pass that's about to begin */ - virtual void OnRenderPassPreRender(E_SCENE_NODE_RENDER_PASS renderPass) = 0; - - //! Called after the render pass specified in OnRenderPassPreRender() ends - /** \param[in] renderPass: the render pass that has finished */ - virtual void OnRenderPassPostRender(E_SCENE_NODE_RENDER_PASS renderPass) = 0; - - //! Called before the given scene node is rendered - /** \param[in] node: the scene node that's about to be rendered */ - virtual void OnNodePreRender(ISceneNode* node) = 0; - - //! Called after the the node specified in OnNodePreRender() has been rendered - /** \param[in] node: the scene node that has just been rendered */ - virtual void OnNodePostRender(ISceneNode* node) = 0; - }; -} // end namespace scene -} // end namespace irr - -#endif diff --git a/include/ILightSceneNode.h b/include/ILightSceneNode.h deleted file mode 100644 index 62533a0d..00000000 --- a/include/ILightSceneNode.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_LIGHT_SCENE_NODE_H_INCLUDED__ -#define __I_LIGHT_SCENE_NODE_H_INCLUDED__ - -#include "ISceneNode.h" -#include "SLight.h" - -namespace irr -{ -namespace scene -{ - -//! Scene node which is a dynamic light. -/** You can switch the light on and off by making it visible or not. It can be -animated by ordinary scene node animators. If the light type is directional or -spot, the direction of the light source is defined by the rotation of the scene -node (assuming (0,0,1) as the local direction of the light). -*/ -class ILightSceneNode : public ISceneNode -{ -public: - - //! constructor - ILightSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position = core::vector3df(0,0,0)) - : ISceneNode(parent, mgr, id, position) {} - - //! Sets the light data associated with this ILightSceneNode - /** \param light The new light data. */ - virtual void setLightData(const video::SLight& light) = 0; - - //! Gets the light data associated with this ILightSceneNode - /** \return The light data. */ - virtual const video::SLight& getLightData() const = 0; - - //! Gets the light data associated with this ILightSceneNode - /** \return The light data. */ - virtual video::SLight& getLightData() = 0; - - //! Sets if the node should be visible or not. - /** All children of this node won't be visible either, when set - to true. - \param isVisible If the node shall be visible. */ - virtual void setVisible(bool isVisible) = 0; - - //! Sets the light's radius of influence. - /** Outside this radius the light won't lighten geometry and cast no - shadows. Setting the radius will also influence the attenuation, setting - it to (0,1/radius,0). If you want to override this behavior, set the - attenuation after the radius. - NOTE: On OpenGL only the attenuation is set, there's no hard range. - \param radius The new radius. */ - virtual void setRadius(f32 radius) = 0; - - //! Gets the light's radius of influence. - /** \return The current radius. */ - virtual f32 getRadius() const = 0; - - //! Sets the light type. - /** \param type The new type. */ - virtual void setLightType(video::E_LIGHT_TYPE type) = 0; - - //! Gets the light type. - /** \return The current light type. */ - virtual video::E_LIGHT_TYPE getLightType() const = 0; - - //! Sets whether this light casts shadows. - /** Enabling this flag won't automatically cast shadows, the meshes - will still need shadow scene nodes attached. But one can enable or - disable distinct lights for shadow casting for performance reasons. - \param shadow True if this light shall cast shadows. */ - virtual void enableCastShadow(bool shadow=true) = 0; - - //! Check whether this light casts shadows. - /** \return True if light would cast shadows, else false. */ - virtual bool getCastShadow() const = 0; -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IMeshLoader.h b/include/IMeshLoader.h index f81f3307..91b07b94 100644 --- a/include/IMeshLoader.h +++ b/include/IMeshLoader.h @@ -7,7 +7,6 @@ #include "IReferenceCounted.h" #include "path.h" -#include "IMeshTextureLoader.h" namespace irr { @@ -29,14 +28,10 @@ class IMeshLoader : public virtual IReferenceCounted public: //! Constructor - IMeshLoader() : TextureLoader(0) {} + IMeshLoader() {} //! Destructor - virtual ~IMeshLoader() - { - if ( TextureLoader ) - TextureLoader->drop(); - } + virtual ~IMeshLoader() {} //! Returns true if the file might be loaded by this class. /** This decision should be based on the file extension (e.g. ".cob") @@ -51,35 +46,6 @@ public: If you no longer need the mesh, you should call IAnimatedMesh::drop(). See IReferenceCounted::drop() for more information. */ virtual IAnimatedMesh* createMesh(io::IReadFile* file) = 0; - - //! Set a new texture loader which this meshloader can use when searching for textures. - /** NOTE: Not all meshloaders do support this interface. Meshloaders which - support it will return a non-null value in getMeshTextureLoader from the start. Setting a - texture-loader to a meshloader which doesn't support it won't help. - \param textureLoader The textureloader to use. When set to NULL the mesh will not load any textures. - */ - virtual void setMeshTextureLoader(IMeshTextureLoader* textureLoader) - { - if ( textureLoader != TextureLoader ) - { - if ( textureLoader ) - textureLoader->grab(); - if ( TextureLoader ) - TextureLoader->drop(); - TextureLoader = textureLoader; - } - } - - //! Get the texture loader used when this meshloader searches for textures. - /** NOTE: not all meshloaders support this interface so this can return NULL. - */ - virtual IMeshTextureLoader* getMeshTextureLoader() const - { - return TextureLoader; - } - -protected: - IMeshTextureLoader* TextureLoader; }; diff --git a/include/IMeshSceneNode.h b/include/IMeshSceneNode.h index 03c5c522..d4f6fff3 100644 --- a/include/IMeshSceneNode.h +++ b/include/IMeshSceneNode.h @@ -12,7 +12,6 @@ namespace irr namespace scene { -class IShadowVolumeSceneNode; class IMesh; @@ -38,31 +37,6 @@ public: /** \return Pointer to mesh which is displayed by this node. */ virtual IMesh* getMesh(void) = 0; - /** The shadow can be rendered using the ZPass or the zfail - method. ZPass is a little bit faster because the shadow volume - creation is easier, but with this method there occur ugly - looking artifacts when the camera is inside the shadow volume. - These error do not occur with the ZFail method, but it can - have trouble with clipping to the far-plane (it usually works - well in OpenGL and fails with other drivers). - \param shadowMesh: Optional custom mesh for shadow volume. - \param id: Id of the shadow scene node. This id can be used to - identify the node later. - \param zfailmethod: If set to true, the shadow will use the - zfail method, if not, zpass is used. - \param infinity: Value used by the shadow volume algorithm to - scale the shadow volume. For zfail shadow volumes on some drivers - only suppport finite shadows, so camera zfar must be larger than - shadow back cap,which is depending on the infinity parameter). - Infinity value also scales by the scaling factors of the model. - If shadows don't show up with zfail then try reducing infinity. - If shadows are cut-off then try increasing infinity. - \return Pointer to the created shadow scene node. This pointer - should not be dropped. See IReferenceCounted::drop() for more - information. */ - virtual IShadowVolumeSceneNode* addShadowVolumeSceneNode(const IMesh* shadowMesh=0, - s32 id=-1, bool zfailmethod=true, f32 infinity=1000.0f) = 0; - //! Sets if the scene node should not copy the materials of the mesh but use them in a read only style. /** In this way it is possible to change the materials of a mesh causing all mesh scene nodes referencing this mesh to change, too. diff --git a/include/IMeshTextureLoader.h b/include/IMeshTextureLoader.h deleted file mode 100644 index 92df7b0d..00000000 --- a/include/IMeshTextureLoader.h +++ /dev/null @@ -1,65 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef IRR_I_MESH_TEXTURE_LOADER_H_INCLUDED__ -#define IRR_I_MESH_TEXTURE_LOADER_H_INCLUDED__ - -#include "path.h" -#include "IReferenceCounted.h" - -namespace irr -{ - -namespace video -{ - class ITexture; -} -namespace io -{ - class IReadFile; -} - -namespace scene -{ - -//! Finding and loading textures inside meshloaders. -/** A texture loader can search for a texture in several paths. -For example relative to a given texture-path, relative to the current -working directory or relative to a mesh- and/or material-file. -*/ -class IMeshTextureLoader : public virtual IReferenceCounted -{ -public: - - //! Destructor - virtual ~IMeshTextureLoader() {} - - //! Set a custom texture path. - /** This is the first path the texture-loader should search. */ - virtual void setTexturePath(const irr::io::path& path) = 0; - - //! Get the current custom texture path. - virtual const irr::io::path& getTexturePath() const = 0; - - //! Get the texture by searching for it in all paths that makes sense for the given textureName. - /** Usually you do not have to use this method, it is used internally by IMeshLoader's. - \param textureName Texturename as used in the mesh-format - \return Pointer to the texture. Returns 0 if loading failed.*/ - virtual irr::video::ITexture* getTexture(const irr::io::path& textureName) = 0; - - //! Meshloaders will search paths relative to the meshFile. - /** Usually you do not have to use this method, it is used internally by IMeshLoader's. - Any values you set here will likely be overwritten internally. */ - virtual void setMeshFile(const irr::io::IReadFile* meshFile) = 0; - - //! Meshloaders will try to look relative to the path of the materialFile - /** Usually you do not have to use this method, it is used internally by IMeshLoader's. - Any values you set here will likely be overwritten internally. */ - virtual void setMaterialFile(const irr::io::IReadFile* materialFile) = 0; -}; - - -} // end namespace scene -} // end namespace irr - -#endif diff --git a/include/IMetaTriangleSelector.h b/include/IMetaTriangleSelector.h deleted file mode 100644 index 2cbb385c..00000000 --- a/include/IMetaTriangleSelector.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_META_TRIANGLE_SELECTOR_H_INCLUDED__ -#define __I_META_TRIANGLE_SELECTOR_H_INCLUDED__ - -#include "ITriangleSelector.h" - -namespace irr -{ -namespace scene -{ - -//! Interface for making multiple triangle selectors work as one big selector. -/** This is nothing more than a collection of one or more triangle selectors -providing together the interface of one triangle selector. In this way, -collision tests can be done with different triangle soups in one pass. -*/ -class IMetaTriangleSelector : public ITriangleSelector -{ -public: - - //! Adds a triangle selector to the collection of triangle selectors. - /** \param toAdd: Pointer to an triangle selector to add to the list. */ - virtual void addTriangleSelector(ITriangleSelector* toAdd) = 0; - - //! Removes a specific triangle selector from the collection. - /** \param toRemove: Pointer to an triangle selector which is in the - list but will be removed. - \return True if successful, false if not. */ - virtual bool removeTriangleSelector(ITriangleSelector* toRemove) = 0; - - //! Removes all triangle selectors from the collection. - virtual void removeAllTriangleSelectors() = 0; -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IOctreeSceneNode.h b/include/IOctreeSceneNode.h deleted file mode 100644 index 352a274a..00000000 --- a/include/IOctreeSceneNode.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_OCTREE_SCENE_NODE_H_INCLUDED__ -#define __I_OCTREE_SCENE_NODE_H_INCLUDED__ - -#include "IMeshSceneNode.h" - -namespace irr -{ -namespace scene -{ - -//! Settings if/how octree scene nodes are using hardware mesh-buffers -/** VBO = Vertex buffer object = meshbuffers bound on the graphic-card instead of uploaded each frame. - It can not be generally said which mode is optimal for drawing as this depends - on the scene. So you have to try and experiment for your meshes which one works best. -*/ -enum EOCTREENODE_VBO -{ - //! No VBO's used. Vertices+indices send to graphic-card on each render. - EOV_NO_VBO, - - //! VBO's used. Draw the complete meshbuffers if any polygon in it is visible. - //! This allows VBO's for the meshbuffers to be completely static, but basically means - //! the octree is not used as an octree (not it still does do all the octree calculations) - //! Might work in very specific cases, but if this is gives you the best fastest results - //! you should probably compare as well to simply using a static mesh with no octree at all. - //! In most cases the other 2 options should work better with an octree. - EOV_USE_VBO, - - //! VBO's used. The index-buffer information is updated each frame - //! with only the visible parts of a tree-node. - //! So the vertex-buffer is static and the index-buffer is dynamic. - //! This is the default - EOV_USE_VBO_WITH_VISIBITLY -}; - -//! Kind of checks polygons of the octree scene nodes use against camera -enum EOCTREE_POLYGON_CHECKS -{ - //! Check against box of the camera frustum - //! This is the default - EOPC_BOX, - - //! against the camera frustum - EOPC_FRUSTUM - -}; - -//! A scene node displaying a static mesh -class IOctreeSceneNode : public irr::scene::IMeshSceneNode -{ -public: - - //! Constructor - /** Use setMesh() to set the mesh to display. - */ - IOctreeSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1,1,1)) - : IMeshSceneNode(parent, mgr, id, position, rotation, scale) {} - - //! Get if/how vertex buffer object are used for the meshbuffers - // NOTE: Will currently _always_ return EOV_NO_VBO. - // Octree's with VBO's don't work yet correctly. - virtual EOCTREENODE_VBO getUseVBO() const = 0; - - //! Set the kind of tests polygons do for visibility against the camera - virtual void setPolygonChecks(EOCTREE_POLYGON_CHECKS checks) = 0; - - //! Get the kind of tests polygons do for visibility against the camera - virtual EOCTREE_POLYGON_CHECKS getPolygonChecks() const = 0; -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleAffector.h b/include/IParticleAffector.h deleted file mode 100644 index e2b83e8f..00000000 --- a/include/IParticleAffector.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_AFFECTOR_H_INCLUDED__ -#define __I_PARTICLE_AFFECTOR_H_INCLUDED__ - -#include "IAttributeExchangingObject.h" -#include "SParticle.h" - -namespace irr -{ -namespace scene -{ - -//! Types of built in particle affectors -enum E_PARTICLE_AFFECTOR_TYPE -{ - EPAT_NONE = 0, - EPAT_ATTRACT, - EPAT_FADE_OUT, - EPAT_GRAVITY, - EPAT_ROTATE, - EPAT_SCALE, - EPAT_COUNT -}; - -//! Names for built in particle affectors -const c8* const ParticleAffectorTypeNames[] = -{ - "None", - "Attract", - "FadeOut", - "Gravity", - "Rotate", - "Scale", - 0 -}; - -//! A particle affector modifies particles. -class IParticleAffector : public virtual io::IAttributeExchangingObject -{ -public: - - //! constructor - IParticleAffector() : Enabled(true) {} - - //! Affects an array of particles. - /** \param now Current time. (Same as ITimer::getTime() would return) - \param particlearray Array of particles. - \param count Amount of particles in array. */ - virtual void affect(u32 now, SParticle* particlearray, u32 count) = 0; - - //! Sets whether or not the affector is currently enabled. - virtual void setEnabled(bool enabled) { Enabled = enabled; } - - //! Gets whether or not the affector is currently enabled. - virtual bool getEnabled() const { return Enabled; } - - //! Get emitter type - virtual E_PARTICLE_AFFECTOR_TYPE getType() const = 0; - -protected: - bool Enabled; -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleAnimatedMeshSceneNodeEmitter.h b/include/IParticleAnimatedMeshSceneNodeEmitter.h deleted file mode 100644 index 0e0646f2..00000000 --- a/include/IParticleAnimatedMeshSceneNodeEmitter.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_ANIMATED_MESH_SCENE_NODE_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_ANIMATED_MESH_SCENE_NODE_EMITTER_H_INCLUDED__ - -#include "IParticleEmitter.h" -#include "IAnimatedMeshSceneNode.h" - -namespace irr -{ -namespace scene -{ - -//! A particle emitter which emits particles from mesh vertices. -class IParticleAnimatedMeshSceneNodeEmitter : public IParticleEmitter -{ -public: - - //! Set Mesh to emit particles from - virtual void setAnimatedMeshSceneNode( IAnimatedMeshSceneNode* node ) = 0; - - //! Set whether to use vertex normal for direction, or direction specified - virtual void setUseNormalDirection( bool useNormalDirection = true ) = 0; - - //! Set the amount that the normal is divided by for getting a particles direction - virtual void setNormalDirectionModifier( f32 normalDirectionModifier ) = 0; - - //! Sets whether to emit min<->max particles for every vertex or to pick min<->max vertices - virtual void setEveryMeshVertex( bool everyMeshVertex = true ) = 0; - - //! Get mesh we're emitting particles from - virtual const IAnimatedMeshSceneNode* getAnimatedMeshSceneNode() const = 0; - - //! Get whether to use vertex normal for direction, or direction specified - virtual bool isUsingNormalDirection() const = 0; - - //! Get the amount that the normal is divided by for getting a particles direction - virtual f32 getNormalDirectionModifier() const = 0; - - //! Gets whether to emit min<->max particles for every vertex or to pick min<->max vertices - virtual bool getEveryMeshVertex() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const _IRR_OVERRIDE_ { return EPET_ANIMATED_MESH; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif // __I_PARTICLE_ANIMATED_MESH_SCENE_NODE_EMITTER_H_INCLUDED__ - diff --git a/include/IParticleAttractionAffector.h b/include/IParticleAttractionAffector.h deleted file mode 100644 index e858f8ac..00000000 --- a/include/IParticleAttractionAffector.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_ATTRACTION_AFFECTOR_H_INCLUDED__ -#define __I_PARTICLE_ATTRACTION_AFFECTOR_H_INCLUDED__ - -#include "IParticleAffector.h" - -namespace irr -{ -namespace scene -{ - -//! A particle affector which attracts or detracts particles. -class IParticleAttractionAffector : public IParticleAffector -{ -public: - - //! Set the point that particles will attract to - virtual void setPoint( const core::vector3df& point ) = 0; - - //! Set the speed, in game units per second that the particles will attract to the specified point - virtual void setSpeed( f32 speed ) =0; - - //! Set whether or not the particles are attracting or detracting - virtual void setAttract( bool attract ) = 0; - - //! Set whether or not this will affect particles in the X direction - virtual void setAffectX( bool affect ) = 0; - - //! Set whether or not this will affect particles in the Y direction - virtual void setAffectY( bool affect ) = 0; - - //! Set whether or not this will affect particles in the Z direction - virtual void setAffectZ( bool affect ) = 0; - - //! Get the point that particles are attracted to - virtual const core::vector3df& getPoint() const = 0; - - //! Get the speed that points attract to the specified point - virtual f32 getSpeed() const =0; - - //! Get whether or not the particles are attracting or detracting - virtual bool getAttract() const = 0; - - //! Get whether or not the particles X position are affected - virtual bool getAffectX() const = 0; - - //! Get whether or not the particles Y position are affected - virtual bool getAffectY() const = 0; - - //! Get whether or not the particles Z position are affected - virtual bool getAffectZ() const = 0; - - //! Get emitter type - virtual E_PARTICLE_AFFECTOR_TYPE getType() const _IRR_OVERRIDE_ { return EPAT_ATTRACT; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif // __I_PARTICLE_ATTRACTION_AFFECTOR_H_INCLUDED__ - diff --git a/include/IParticleBoxEmitter.h b/include/IParticleBoxEmitter.h deleted file mode 100644 index 10790bf8..00000000 --- a/include/IParticleBoxEmitter.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_BOX_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_BOX_EMITTER_H_INCLUDED__ - -#include "IParticleEmitter.h" -#include "aabbox3d.h" - -namespace irr -{ -namespace scene -{ - -//! A particle emitter which emits particles from a box shaped space -class IParticleBoxEmitter : public IParticleEmitter -{ -public: - - //! Set the box shape - virtual void setBox( const core::aabbox3df& box ) = 0; - - //! Get the box shape set - virtual const core::aabbox3df& getBox() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const _IRR_OVERRIDE_ { return EPET_BOX; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleCylinderEmitter.h b/include/IParticleCylinderEmitter.h deleted file mode 100644 index ca42defe..00000000 --- a/include/IParticleCylinderEmitter.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_CYLINDER_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_CYLINDER_EMITTER_H_INCLUDED__ - -#include "IParticleEmitter.h" - -namespace irr -{ -namespace scene -{ - -//! A particle emitter which emits from a cylindrically shaped space. -class IParticleCylinderEmitter : public IParticleEmitter -{ -public: - - //! Set the center of the radius for the cylinder, at one end of the cylinder - virtual void setCenter( const core::vector3df& center ) = 0; - - //! Set the normal of the cylinder - virtual void setNormal( const core::vector3df& normal ) = 0; - - //! Set the radius of the cylinder - virtual void setRadius( f32 radius ) = 0; - - //! Set the length of the cylinder - virtual void setLength( f32 length ) = 0; - - //! Set whether or not to draw points inside the cylinder - virtual void setOutlineOnly( bool outlineOnly = true ) = 0; - - //! Get the center of the cylinder - virtual const core::vector3df& getCenter() const = 0; - - //! Get the normal of the cylinder - virtual const core::vector3df& getNormal() const = 0; - - //! Get the radius of the cylinder - virtual f32 getRadius() const = 0; - - //! Get the center of the cylinder - virtual f32 getLength() const = 0; - - //! Get whether or not to draw points inside the cylinder - virtual bool getOutlineOnly() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const _IRR_OVERRIDE_ { return EPET_CYLINDER; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleEmitter.h b/include/IParticleEmitter.h deleted file mode 100644 index 4e54e85d..00000000 --- a/include/IParticleEmitter.h +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_EMITTER_H_INCLUDED__ - -#include "IAttributeExchangingObject.h" -#include "SParticle.h" - -namespace irr -{ -namespace scene -{ - -//! Types of built in particle emitters -enum E_PARTICLE_EMITTER_TYPE -{ - EPET_POINT = 0, - EPET_ANIMATED_MESH, - EPET_BOX, - EPET_CYLINDER, - EPET_MESH, - EPET_RING, - EPET_SPHERE, - EPET_COUNT -}; - -//! Names for built in particle emitters -const c8* const ParticleEmitterTypeNames[] = -{ - "Point", - "AnimatedMesh", - "Box", - "Cylinder", - "Mesh", - "Ring", - "Sphere", - 0 -}; - -//! A particle emitter for using with particle systems. -/** A Particle emitter emits new particles into a particle system. -*/ -class IParticleEmitter : public virtual io::IAttributeExchangingObject -{ -public: - - //! Prepares an array with new particles to emit into the system - /** \param now Current time. - \param timeSinceLastCall Time elapsed since last call, in milliseconds. - \param outArray Pointer which will point to the array with the new - particles to add into the system. - \return Amount of new particles in the array. Can be 0. */ - virtual s32 emitt(u32 now, u32 timeSinceLastCall, SParticle*& outArray) = 0; - - //! Set direction the emitter emits particles - virtual void setDirection( const core::vector3df& newDirection ) = 0; - - //! Set minimum number of particles the emitter emits per second - virtual void setMinParticlesPerSecond( u32 minPPS ) = 0; - - //! Set maximum number of particles the emitter emits per second - virtual void setMaxParticlesPerSecond( u32 maxPPS ) = 0; - - //! Set minimum starting color for particles - virtual void setMinStartColor( const video::SColor& color ) = 0; - - //! Set maximum starting color for particles - virtual void setMaxStartColor( const video::SColor& color ) = 0; - - //! Set the maximum starting size for particles - virtual void setMaxStartSize( const core::dimension2df& size ) = 0; - - //! Set the minimum starting size for particles - virtual void setMinStartSize( const core::dimension2df& size ) = 0; - - //! Set the minimum particle life-time in milliseconds - virtual void setMinLifeTime( u32 lifeTimeMin ) = 0; - - //! Set the maximum particle life-time in milliseconds - virtual void setMaxLifeTime( u32 lifeTimeMax ) = 0; - - //! Set maximal random derivation from the direction - virtual void setMaxAngleDegrees( s32 maxAngleDegrees ) = 0; - - //! Get direction the emitter emits particles - virtual const core::vector3df& getDirection() const = 0; - - //! Get the minimum number of particles the emitter emits per second - virtual u32 getMinParticlesPerSecond() const = 0; - - //! Get the maximum number of particles the emitter emits per second - virtual u32 getMaxParticlesPerSecond() const = 0; - - //! Get the minimum starting color for particles - virtual const video::SColor& getMinStartColor() const = 0; - - //! Get the maximum starting color for particles - virtual const video::SColor& getMaxStartColor() const = 0; - - //! Get the maximum starting size for particles - virtual const core::dimension2df& getMaxStartSize() const = 0; - - //! Get the minimum starting size for particles - virtual const core::dimension2df& getMinStartSize() const = 0; - - //! Get the minimum particle life-time in milliseconds - virtual u32 getMinLifeTime() const = 0; - - //! Get the maximum particle life-time in milliseconds - virtual u32 getMaxLifeTime() const = 0; - - //! Get maximal random derivation from the direction - virtual s32 getMaxAngleDegrees() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const { return EPET_POINT; } -}; - -typedef IParticleEmitter IParticlePointEmitter; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleFadeOutAffector.h b/include/IParticleFadeOutAffector.h deleted file mode 100644 index 67000c0b..00000000 --- a/include/IParticleFadeOutAffector.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_FADE_OUT_AFFECTOR_H_INCLUDED__ -#define __I_PARTICLE_FADE_OUT_AFFECTOR_H_INCLUDED__ - -#include "IParticleAffector.h" - -namespace irr -{ -namespace scene -{ - -//! A particle affector which fades out the particles. -class IParticleFadeOutAffector : public IParticleAffector -{ -public: - - //! Sets the targetColor, i.e. the color the particles will interpolate to over time. - virtual void setTargetColor( const video::SColor& targetColor ) = 0; - - //! Sets the time in milliseconds it takes for each particle to fade out (minimal 1 ms) - virtual void setFadeOutTime( u32 fadeOutTime ) = 0; - - //! Gets the targetColor, i.e. the color the particles will interpolate to over time. - virtual const video::SColor& getTargetColor() const = 0; - - //! Gets the time in milliseconds it takes for each particle to fade out. - virtual u32 getFadeOutTime() const = 0; - - //! Get emitter type - virtual E_PARTICLE_AFFECTOR_TYPE getType() const _IRR_OVERRIDE_ { return EPAT_FADE_OUT; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif // __I_PARTICLE_FADE_OUT_AFFECTOR_H_INCLUDED__ - diff --git a/include/IParticleGravityAffector.h b/include/IParticleGravityAffector.h deleted file mode 100644 index be2c244b..00000000 --- a/include/IParticleGravityAffector.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_GRAVITY_AFFECTOR_H_INCLUDED__ -#define __I_PARTICLE_GRAVITY_AFFECTOR_H_INCLUDED__ - -#include "IParticleAffector.h" - -namespace irr -{ -namespace scene -{ - -//! A particle affector which applies gravity to particles. -class IParticleGravityAffector : public IParticleAffector -{ -public: - - //! Set the time in milliseconds when the gravity force is totally lost - /** At that point the particle does not move any more. */ - virtual void setTimeForceLost( f32 timeForceLost ) = 0; - - //! Set the direction and force of gravity in all 3 dimensions. - virtual void setGravity( const core::vector3df& gravity ) = 0; - - //! Get the time in milliseconds when the gravity force is totally lost - virtual f32 getTimeForceLost() const = 0; - - //! Get the direction and force of gravity. - virtual const core::vector3df& getGravity() const = 0; - - //! Get emitter type - virtual E_PARTICLE_AFFECTOR_TYPE getType() const _IRR_OVERRIDE_ { return EPAT_GRAVITY; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif // __I_PARTICLE_GRAVITY_AFFECTOR_H_INCLUDED__ - diff --git a/include/IParticleMeshEmitter.h b/include/IParticleMeshEmitter.h deleted file mode 100644 index 7f078064..00000000 --- a/include/IParticleMeshEmitter.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_MESH_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_MESH_EMITTER_H_INCLUDED__ - -#include "IParticleEmitter.h" -#include "IMesh.h" - -namespace irr -{ -namespace scene -{ - -//! A particle emitter which emits from vertices of a mesh -class IParticleMeshEmitter : public IParticleEmitter -{ -public: - - //! Set Mesh to emit particles from - virtual void setMesh( IMesh* mesh ) = 0; - - //! Set whether to use vertex normal for direction, or direction specified - virtual void setUseNormalDirection( bool useNormalDirection = true ) = 0; - - //! Set the amount that the normal is divided by for getting a particles direction - virtual void setNormalDirectionModifier( f32 normalDirectionModifier ) = 0; - - //! Sets whether to emit min<->max particles for every vertex or to pick min<->max vertices - virtual void setEveryMeshVertex( bool everyMeshVertex = true ) = 0; - - //! Get Mesh we're emitting particles from - virtual const IMesh* getMesh() const = 0; - - //! Get whether to use vertex normal for direction, or direction specified - virtual bool isUsingNormalDirection() const = 0; - - //! Get the amount that the normal is divided by for getting a particles direction - virtual f32 getNormalDirectionModifier() const = 0; - - //! Gets whether to emit min<->max particles for every vertex or to pick min<->max vertices - virtual bool getEveryMeshVertex() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const _IRR_OVERRIDE_ { return EPET_MESH; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleRingEmitter.h b/include/IParticleRingEmitter.h deleted file mode 100644 index 7828b898..00000000 --- a/include/IParticleRingEmitter.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_RING_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_RING_EMITTER_H_INCLUDED__ - -#include "IParticleEmitter.h" - -namespace irr -{ -namespace scene -{ - -//! A particle emitter which emits particles along a ring shaped area. -class IParticleRingEmitter : public IParticleEmitter -{ -public: - - //! Set the center of the ring - virtual void setCenter( const core::vector3df& center ) = 0; - - //! Set the radius of the ring - virtual void setRadius( f32 radius ) = 0; - - //! Set the thickness of the ring - virtual void setRingThickness( f32 ringThickness ) = 0; - - //! Get the center of the ring - virtual const core::vector3df& getCenter() const = 0; - - //! Get the radius of the ring - virtual f32 getRadius() const = 0; - - //! Get the thickness of the ring - virtual f32 getRingThickness() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const _IRR_OVERRIDE_ { return EPET_RING; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleRotationAffector.h b/include/IParticleRotationAffector.h deleted file mode 100644 index 374a2682..00000000 --- a/include/IParticleRotationAffector.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_ROTATION_AFFECTOR_H_INCLUDED__ -#define __I_PARTICLE_ROTATION_AFFECTOR_H_INCLUDED__ - -#include "IParticleAffector.h" - -namespace irr -{ -namespace scene -{ - -//! A particle affector which rotates the particle system. -class IParticleRotationAffector : public IParticleAffector -{ -public: - - //! Set the point that particles will rotate around - virtual void setPivotPoint( const core::vector3df& point ) = 0; - - //! Set the speed in degrees per second in all 3 dimensions - virtual void setSpeed( const core::vector3df& speed ) = 0; - - //! Get the point that particles are attracted to - virtual const core::vector3df& getPivotPoint() const = 0; - - //! Get the speed in degrees per second in all 3 dimensions - virtual const core::vector3df& getSpeed() const = 0; - - //! Get emitter type - virtual E_PARTICLE_AFFECTOR_TYPE getType() const _IRR_OVERRIDE_ { return EPAT_ROTATE; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif // __I_PARTICLE_ROTATION_AFFECTOR_H_INCLUDED__ - diff --git a/include/IParticleSphereEmitter.h b/include/IParticleSphereEmitter.h deleted file mode 100644 index 1bfe98c3..00000000 --- a/include/IParticleSphereEmitter.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_SPHERE_EMITTER_H_INCLUDED__ -#define __I_PARTICLE_SPHERE_EMITTER_H_INCLUDED__ - -#include "IParticleEmitter.h" - -namespace irr -{ -namespace scene -{ - -//! A particle emitter which emits from a spherical space. -class IParticleSphereEmitter : public IParticleEmitter -{ -public: - - //! Set the center of the sphere for particle emissions - virtual void setCenter( const core::vector3df& center ) = 0; - - //! Set the radius of the sphere for particle emissions - virtual void setRadius( f32 radius ) = 0; - - //! Get the center of the sphere for particle emissions - virtual const core::vector3df& getCenter() const = 0; - - //! Get the radius of the sphere for particle emissions - virtual f32 getRadius() const = 0; - - //! Get emitter type - virtual E_PARTICLE_EMITTER_TYPE getType() const _IRR_OVERRIDE_ { return EPET_SPHERE; } -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/IParticleSystemSceneNode.h b/include/IParticleSystemSceneNode.h deleted file mode 100644 index b124cbc5..00000000 --- a/include/IParticleSystemSceneNode.h +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_PARTICLE_SYSTEM_SCENE_NODE_H_INCLUDED__ -#define __I_PARTICLE_SYSTEM_SCENE_NODE_H_INCLUDED__ - -#include "ISceneNode.h" -#include "IParticleAnimatedMeshSceneNodeEmitter.h" -#include "IParticleBoxEmitter.h" -#include "IParticleCylinderEmitter.h" -#include "IParticleMeshEmitter.h" -#include "IParticleRingEmitter.h" -#include "IParticleSphereEmitter.h" -#include "IParticleAttractionAffector.h" -#include "IParticleFadeOutAffector.h" -#include "IParticleGravityAffector.h" -#include "IParticleRotationAffector.h" -#include "dimension2d.h" - -namespace irr -{ -namespace scene -{ - -//! A particle system scene node for creating snow, fire, explosions, smoke... -/** A scene node controlling a particle System. The behavior of the particles -can be controlled by setting the right particle emitters and affectors. -You can for example easily create a campfire by doing this: - -\code - scene::IParticleSystemSceneNode* p = scenemgr->addParticleSystemSceneNode(); - p->setParticleSize(core::dimension2d(20.0f, 10.0f)); - scene::IParticleEmitter* em = p->createBoxEmitter( - core::aabbox3d(-5,0,-5,5,1,5), - core::vector3df(0.0f,0.03f,0.0f), - 40,80, video::SColor(0,255,255,255),video::SColor(0,255,255,255), 1100,2000); - p->setEmitter(em); - em->drop(); - scene::IParticleAffector* paf = p->createFadeOutParticleAffector(); - p->addAffector(paf); - paf->drop(); -\endcode -*/ - -//! Bitflags to control particle behavior -enum EParticleBehavior -{ - //! Continue emitting new particles even when the node is invisible - EPB_INVISIBLE_EMITTING = 1, - - //! Continue affecting particles even when the node is invisible - EPB_INVISIBLE_AFFECTING = 2, - - //! Continue updating particle positions or deleting them even when the node is invisible - EPB_INVISIBLE_ANIMATING = 4, - - //! Clear all particles when node gets invisible - EPB_CLEAR_ON_INVISIBLE = 8, - - //! Particle movement direction on emitting ignores the node rotation - //! This is mainly to allow backward compatible behavior to Irrlicht 1.8 - EPB_EMITTER_VECTOR_IGNORE_ROTATION = 16, - - //! On emitting global particles interpolate the positions randomly between the last and current node transformations. - //! This can be set to avoid gaps caused by fast node movement or low framerates, but will be somewhat - //! slower to calculate. - EPB_EMITTER_FRAME_INTERPOLATION = 32 -}; - -class IParticleSystemSceneNode : public ISceneNode -{ -public: - - //! Constructor - IParticleSystemSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) - : ISceneNode(parent, mgr, id, position, rotation, scale) - , ParticleBehavior(0) - { - } - - //! Sets the size of all particles. - virtual void setParticleSize( - const core::dimension2d &size = core::dimension2d(5.0f, 5.0f)) = 0; - - //! Sets if the particles should be global. - /** If they are, the particles are affected by the movement of the - particle system scene node too, otherwise they completely ignore it. - Default is true. */ - virtual void setParticlesAreGlobal(bool global=true) = 0; - - - //! Bitflags to change the particle behavior - /** - \param flags A combination of ::EParticleBehavior bit-flags. Default is 0. */ - virtual void setParticleBehavior(irr::u32 flags) - { - ParticleBehavior = flags; - } - - - //! Gets how particles behave in different situations - /** - \return A combination of ::EParticleBehavior flags */ - virtual irr::u32 getParticleBehavior() const - { - return ParticleBehavior; - } - - //! Remove all currently visible particles - virtual void clearParticles() = 0; - - //! Do manually update the particles. - /** This should only be called when you want to render the node outside - the scenegraph, as the node will care about this otherwise - automatically. */ - virtual void doParticleSystem(u32 time) = 0; - - //! Gets the particle emitter, which creates the particles. - /** \return The particle emitter. Can be 0 if none is set. */ - virtual IParticleEmitter* getEmitter() =0; - - //! Sets the particle emitter, which creates the particles. - /** A particle emitter can be created using one of the createEmitter - methods. For example to create and use a simple PointEmitter, call - IParticleEmitter* p = createPointEmitter(); setEmitter(p); p->drop(); - \param emitter: Sets the particle emitter. You can set this to 0 for - removing the current emitter and stopping the particle system emitting - new particles. */ - virtual void setEmitter(IParticleEmitter* emitter) = 0; - - //! Adds new particle effector to the particle system. - /** A particle affector modifies the particles. For example, the FadeOut - affector lets all particles fade out after some time. It is created and - used in this way: - \code - IParticleAffector* p = createFadeOutParticleAffector(); - addAffector(p); - p->drop(); - \endcode - Please note that an affector is not necessary for the particle system to - work. - \param affector: New affector. */ - virtual void addAffector(IParticleAffector* affector) = 0; - - //! Get a list of all particle affectors. - /** \return The list of particle affectors attached to this node. */ - virtual const core::list& getAffectors() const = 0; - - //! Removes all particle affectors in the particle system. - virtual void removeAllAffectors() = 0; - - //! Creates a particle emitter for an animated mesh scene node - /** \param node: Pointer to the animated mesh scene node to emit - particles from - \param useNormalDirection: If true, the direction of each particle - created will be the normal of the vertex that it's emitting from. The - normal is divided by the normalDirectionModifier parameter, which - defaults to 100.0f. - \param direction: Direction and speed of particle emission. - \param normalDirectionModifier: If the emitter is using the normal - direction then the normal of the vertex that is being emitted from is - divided by this number. - \param mbNumber: This allows you to specify a specific meshBuffer for - the IMesh* to emit particles from. The default value is -1, which - means a random meshBuffer picked from all of the meshes meshBuffers - will be selected to pick a random vertex from. If the value is 0 or - greater, it will only pick random vertices from the meshBuffer - specified by this value. - \param everyMeshVertex: If true, the emitter will emit between min/max - particles every second, for every vertex in the mesh, if false, it will - emit between min/max particles from random vertices in the mesh. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleAnimatedMeshSceneNodeEmitter* createAnimatedMeshSceneNodeEmitter( - scene::IAnimatedMeshSceneNode* node, bool useNormalDirection = true, - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - f32 normalDirectionModifier = 100.0f, s32 mbNumber = -1, - bool everyMeshVertex = false, - u32 minParticlesPerSecond = 5, u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000, - s32 maxAngleDegrees = 0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a box particle emitter. - /** \param box: The box for the emitter. - \param direction: Direction and speed of particle emission. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleBoxEmitter* createBoxEmitter( - const core::aabbox3df& box = core::aabbox3df(-10,28,-10,10,30,10), - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - u32 minParticlesPerSecond = 5, - u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, - s32 maxAngleDegrees=0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a particle emitter for emitting from a cylinder - /** \param center: The center of the circle at the base of the cylinder - \param radius: The thickness of the cylinder - \param normal: Direction of the length of the cylinder - \param length: The length of the the cylinder - \param outlineOnly: Whether or not to put points inside the cylinder or - on the outline only - \param direction: Direction and speed of particle emission. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleCylinderEmitter* createCylinderEmitter( - const core::vector3df& center, f32 radius, - const core::vector3df& normal, f32 length, - bool outlineOnly = false, - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - u32 minParticlesPerSecond = 5, u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000, - s32 maxAngleDegrees = 0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a mesh particle emitter. - /** \param mesh: Pointer to mesh to emit particles from - \param useNormalDirection: If true, the direction of each particle - created will be the normal of the vertex that it's emitting from. The - normal is divided by the normalDirectionModifier parameter, which - defaults to 100.0f. - \param direction: Direction and speed of particle emission. - \param normalDirectionModifier: If the emitter is using the normal - direction then the normal of the vertex that is being emitted from is - divided by this number. - \param mbNumber: This allows you to specify a specific meshBuffer for - the IMesh* to emit particles from. The default value is -1, which - means a random meshBuffer picked from all of the meshes meshBuffers - will be selected to pick a random vertex from. If the value is 0 or - greater, it will only pick random vertices from the meshBuffer - specified by this value. - \param everyMeshVertex: If true, the emitter will emit between min/max - particles every second, for every vertex in the mesh, if false, it will - emit between min/max particles from random vertices in the mesh. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleMeshEmitter* createMeshEmitter( - scene::IMesh* mesh, bool useNormalDirection = true, - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - f32 normalDirectionModifier = 100.0f, s32 mbNumber = -1, - bool everyMeshVertex = false, - u32 minParticlesPerSecond = 5, u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000, - s32 maxAngleDegrees = 0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a point particle emitter. - /** \param direction: Direction and speed of particle emission. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticlePointEmitter* createPointEmitter( - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - u32 minParticlesPerSecond = 5, - u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, - s32 maxAngleDegrees=0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a ring particle emitter. - /** \param center: Center of ring - \param radius: Distance of points from center, points will be rotated - around the Y axis at a random 360 degrees and will then be shifted by - the provided ringThickness values in each axis. - \param ringThickness : thickness of the ring or how wide the ring is - \param direction: Direction and speed of particle emission. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleRingEmitter* createRingEmitter( - const core::vector3df& center, f32 radius, f32 ringThickness, - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - u32 minParticlesPerSecond = 5, - u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, - s32 maxAngleDegrees=0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a sphere particle emitter. - /** \param center: Center of sphere - \param radius: Radius of sphere - \param direction: Direction and speed of particle emission. - \param minParticlesPerSecond: Minimal amount of particles emitted per - second. - \param maxParticlesPerSecond: Maximal amount of particles emitted per - second. - \param minStartColor: Minimal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param maxStartColor: Maximal initial start color of a particle. The - real color of every particle is calculated as random interpolation - between minStartColor and maxStartColor. - \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. - \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. - \param maxAngleDegrees: Maximal angle in degrees, the emitting - direction of the particle will differ from the original direction. - \param minStartSize: Minimal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \param maxStartSize: Maximal initial start size of a particle. The - real size of every particle is calculated as random interpolation - between minStartSize and maxStartSize. - \return Pointer to the created particle emitter. To set this emitter - as new emitter of this particle system, just call setEmitter(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleSphereEmitter* createSphereEmitter( - const core::vector3df& center, f32 radius, - const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), - u32 minParticlesPerSecond = 5, - u32 maxParticlesPerSecond = 10, - const video::SColor& minStartColor = video::SColor(255,0,0,0), - const video::SColor& maxStartColor = video::SColor(255,255,255,255), - u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, - s32 maxAngleDegrees=0, - const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), - const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; - - //! Creates a point attraction affector. - /** This affector modifies the positions of the particles and attracts - them to a specified point at a specified speed per second. - \param point: Point to attract particles to. - \param speed: Speed in units per second, to attract to the specified - point. - \param attract: Whether the particles attract or detract from this - point. - \param affectX: Whether or not this will affect the X position of the - particle. - \param affectY: Whether or not this will affect the Y position of the - particle. - \param affectZ: Whether or not this will affect the Z position of the - particle. - \return Pointer to the created particle affector. To add this affector - as new affector of this particle system, just call addAffector(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleAttractionAffector* createAttractionAffector( - const core::vector3df& point, f32 speed = 1.0f, bool attract = true, - bool affectX = true, bool affectY = true, bool affectZ = true) = 0; - - //! Creates a scale particle affector. - /** This affector scales the particle to the a multiple of its size defined - by the scaleTo variable. - \param scaleTo: multiple of the size which the particle will be scaled to until deletion - \return Pointer to the created particle affector. - To add this affector as new affector of this particle system, - just call addAffector(). Note that you'll have to drop() the - returned pointer, after you don't need it any more, see - IReferenceCounted::drop() for more information. */ - virtual IParticleAffector* createScaleParticleAffector(const core::dimension2df& scaleTo = core::dimension2df(1.0f, 1.0f)) = 0; - - //! Creates a fade out particle affector. - /** This affector modifies the color of every particle and and reaches - the final color when the particle dies. This affector looks really - good, if the EMT_TRANSPARENT_ADD_COLOR material is used and the - targetColor is video::SColor(0,0,0,0): Particles are fading out into - void with this setting. - \param targetColor: Color whereto the color of the particle is changed. - \param timeNeededToFadeOut: How much time in milliseconds should the - affector need to change the color to the targetColor. - \return Pointer to the created particle affector. To add this affector - as new affector of this particle system, just call addAffector(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleFadeOutAffector* createFadeOutParticleAffector( - const video::SColor& targetColor = video::SColor(0,0,0,0), - u32 timeNeededToFadeOut = 1000) = 0; - - //! Creates a gravity affector. - /** This affector modifies the direction of the particle. It assumes - that the particle is fired out of the emitter with huge force, but is - loosing this after some time and is caught by the gravity then. This - affector is ideal for creating things like fountains. - \param gravity: Direction and force of gravity. - \param timeForceLost: Time in milliseconds when the force of the - emitter is totally lost and the particle does not move any more. This - is the time where gravity fully affects the particle. - \return Pointer to the created particle affector. To add this affector - as new affector of this particle system, just call addAffector(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleGravityAffector* createGravityAffector( - const core::vector3df& gravity = core::vector3df(0.0f,-0.03f,0.0f), - u32 timeForceLost = 1000) = 0; - - //! Creates a rotation affector. - /** This affector modifies the positions of the particles and attracts - them to a specified point at a specified speed per second. - \param speed: Rotation in degrees per second - \param pivotPoint: Point to rotate the particles around - \return Pointer to the created particle affector. To add this affector - as new affector of this particle system, just call addAffector(). Note - that you'll have to drop() the returned pointer, after you don't need - it any more, see IReferenceCounted::drop() for more information. */ - virtual IParticleRotationAffector* createRotationAffector( - const core::vector3df& speed = core::vector3df(5.0f,5.0f,5.0f), - const core::vector3df& pivotPoint = core::vector3df(0.0f,0.0f,0.0f) ) = 0; - - //! Writes attributes of the scene node. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const _IRR_OVERRIDE_ - { - out->addInt("ParticleBehavior", ParticleBehavior); - } - - //! Reads attributes of the scene node. - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) _IRR_OVERRIDE_ - { - ParticleBehavior = in->getAttributeAsInt("ParticleBehavior", ParticleBehavior); - } - -protected: - s32 ParticleBehavior; -}; - -} // end namespace scene -} // end namespace irr - -#endif diff --git a/include/IQ3LevelMesh.h b/include/IQ3LevelMesh.h deleted file mode 100644 index 62feffc6..00000000 --- a/include/IQ3LevelMesh.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_Q3_LEVEL_MESH_H_INCLUDED__ -#define __I_Q3_LEVEL_MESH_H_INCLUDED__ - -#include "IAnimatedMesh.h" -#include "IQ3Shader.h" - -namespace irr -{ -namespace scene -{ - //! Interface for a Mesh which can be loaded directly from a Quake3 .bsp-file. - /** The Mesh tries to load all textures of the map.*/ - class IQ3LevelMesh : public IAnimatedMesh - { - public: - - //! loads the shader definition from file - /** \param filename Name of the shaderfile, defaults to /scripts if fileNameIsValid is false. - \param fileNameIsValid Specifies whether the filename is valid in the current situation. */ - virtual const quake3::IShader* getShader( const c8* filename, bool fileNameIsValid=true ) = 0; - - //! returns a already loaded Shader - virtual const quake3::IShader* getShader(u32 index) const = 0; - - //! get's an interface to the entities - virtual quake3::tQ3EntityList& getEntityList() = 0; - - //! returns the requested brush entity - /** \param num The number from the model key of the entity. - - Use this interface if you parse the entities yourself.*/ - virtual IMesh* getBrushEntityMesh(s32 num) const = 0; - - //! returns the requested brush entity - virtual IMesh* getBrushEntityMesh(quake3::IEntity &ent) const = 0; - }; - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/IQ3Shader.h b/include/IQ3Shader.h deleted file mode 100644 index bcdb4d5b..00000000 --- a/include/IQ3Shader.h +++ /dev/null @@ -1,875 +0,0 @@ -// Copyright (C) 2006-2012 Nikolaus Gebhardt / Thomas Alten -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_Q3_LEVEL_SHADER_H_INCLUDED__ -#define __I_Q3_LEVEL_SHADER_H_INCLUDED__ - -#include "irrArray.h" -#include "fast_atof.h" -#include "IFileSystem.h" -#include "IVideoDriver.h" -#include "coreutil.h" - -namespace irr -{ -namespace scene -{ -namespace quake3 -{ - - static core::stringc irrEmptyStringc(""); - - //! Hold the different Mesh Types used for getMesh - enum eQ3MeshIndex - { - E_Q3_MESH_GEOMETRY = 0, - E_Q3_MESH_ITEMS, - E_Q3_MESH_BILLBOARD, - E_Q3_MESH_FOG, - E_Q3_MESH_UNRESOLVED, - E_Q3_MESH_SIZE - }; - - /*! used to customize Quake3 BSP Loader - */ - - struct Q3LevelLoadParameter - { - Q3LevelLoadParameter () - :defaultLightMapMaterial ( video::EMT_LIGHTMAP_M4 ), - defaultModulate ( video::EMFN_MODULATE_4X ), - defaultFilter ( video::EMF_BILINEAR_FILTER ), - patchTesselation ( 8 ), - verbose ( 0 ), - startTime ( 0 ), endTime ( 0 ), - mergeShaderBuffer ( 1 ), - cleanUnResolvedMeshes ( 1 ), - loadAllShaders ( 0 ), - loadSkyShader ( 0 ), - alpharef ( 1 ), - swapLump ( 0 ), - #ifdef __BIG_ENDIAN__ - swapHeader ( 1 ) - #else - swapHeader ( 0 ) - #endif - { - memcpy ( scriptDir, "scripts\x0", 8 ); - } - - video::E_MATERIAL_TYPE defaultLightMapMaterial; - video::E_MODULATE_FUNC defaultModulate; - video::E_MATERIAL_FLAG defaultFilter; - s32 patchTesselation; - s32 verbose; - u32 startTime; - u32 endTime; - s32 mergeShaderBuffer; - s32 cleanUnResolvedMeshes; - s32 loadAllShaders; - s32 loadSkyShader; - s32 alpharef; - s32 swapLump; - s32 swapHeader; - c8 scriptDir [ 64 ]; - }; - - // some useful typedefs - typedef core::array< core::stringc > tStringList; - typedef core::array< video::ITexture* > tTexArray; - - // string helper.. TODO: move to generic files - inline s16 isEqual ( const core::stringc &string, u32 &pos, const c8 * const list[], u16 listSize ) - { - const char * in = string.c_str () + pos; - - for ( u16 i = 0; i != listSize; ++i ) - { - if (string.size() < pos) - return -2; - u32 len = (u32) strlen ( list[i] ); - if (string.size() < pos+len) - continue; - if ( in [len] != 0 && in [len] != ' ' ) - continue; - if ( strncmp ( in, list[i], len ) ) - continue; - - pos += len + 1; - return (s16) i; - } - return -2; - } - - inline f32 getAsFloat ( const core::stringc &string, u32 &pos ) - { - const char * in = string.c_str () + pos; - - f32 value = 0.f; - pos += (u32) ( core::fast_atof_move ( in, value ) - in ) + 1; - return value; - } - - //! get a quake3 vector translated to irrlicht position (x,-z,y ) - inline core::vector3df getAsVector3df ( const core::stringc &string, u32 &pos ) - { - core::vector3df v; - - v.X = getAsFloat ( string, pos ); - v.Z = getAsFloat ( string, pos ); - v.Y = getAsFloat ( string, pos ); - - return v; - } - - - /* - extract substrings - */ - inline void getAsStringList ( tStringList &list, s32 max, const core::stringc &string, u32 &startPos ) - { - list.clear (); - - s32 finish = 0; - s32 endPos; - do - { - endPos = string.findNext ( ' ', startPos ); - if ( endPos == -1 ) - { - finish = 1; - endPos = string.size(); - } - - list.push_back ( string.subString ( startPos, endPos - startPos ) ); - startPos = endPos + 1; - - if ( list.size() >= (u32) max ) - finish = 1; - - } while ( !finish ); - - } - - //! A blend function for a q3 shader. - struct SBlendFunc - { - SBlendFunc ( video::E_MODULATE_FUNC mod ) - : type ( video::EMT_SOLID ), modulate ( mod ), - param0( 0.f ), - isTransparent ( 0 ) {} - - video::E_MATERIAL_TYPE type; - video::E_MODULATE_FUNC modulate; - - f32 param0; - u32 isTransparent; - }; - - // parses the content of Variable cull - inline bool getCullingFunction ( const core::stringc &cull ) - { - if ( cull.size() == 0 ) - return true; - - bool ret = true; - static const c8 * funclist[] = { "none", "disable", "twosided" }; - - u32 pos = 0; - switch ( isEqual ( cull, pos, funclist, 3 ) ) - { - case 0: - case 1: - case 2: - ret = false; - break; - } - return ret; - } - - // parses the content of Variable depthfunc - // return a z-test - inline u8 getDepthFunction ( const core::stringc &string ) - { - u8 ret = video::ECFN_LESSEQUAL; - - if ( string.size() == 0 ) - return ret; - - static const c8 * funclist[] = { "lequal","equal" }; - - u32 pos = 0; - switch ( isEqual ( string, pos, funclist, 2 ) ) - { - case 0: - ret = video::ECFN_LESSEQUAL; - break; - case 1: - ret = video::ECFN_EQUAL; - break; - } - return ret; - } - - - /*! - parses the content of Variable blendfunc,alphafunc - it also make a hint for rendering as transparent or solid node. - - we assume a typical quake scene would look like this.. - 1) Big Static Mesh ( solid ) - 2) static scene item ( may use transparency ) but rendered in the solid pass - 3) additional transparency item in the transparent pass - - it's not 100% accurate! it just empirical.. - */ - inline static void getBlendFunc ( const core::stringc &string, SBlendFunc &blendfunc ) - { - if ( string.size() == 0 ) - return; - - // maps to E_BLEND_FACTOR - static const c8 * funclist[] = - { - "gl_zero", - "gl_one", - "gl_dst_color", - "gl_one_minus_dst_color", - "gl_src_color", - "gl_one_minus_src_color", - "gl_src_alpha", - "gl_one_minus_src_alpha", - "gl_dst_alpha", - "gl_one_minus_dst_alpha", - "gl_src_alpha_sat", - - "add", - "filter", - "blend", - - "ge128", - "gt0", - }; - - - u32 pos = 0; - s32 srcFact = isEqual ( string, pos, funclist, 16 ); - - if ( srcFact < 0 ) - return; - - u32 resolved = 0; - s32 dstFact = isEqual ( string, pos, funclist, 16 ); - - switch ( srcFact ) - { - case video::EBF_ZERO: - switch ( dstFact ) - { - // gl_zero gl_src_color == gl_dst_color gl_zero - case video::EBF_SRC_COLOR: - blendfunc.type = video::EMT_ONETEXTURE_BLEND; - blendfunc.param0 = video::pack_textureBlendFunc ( video::EBF_DST_COLOR, video::EBF_ZERO, blendfunc.modulate ); - blendfunc.isTransparent = 1; - resolved = 1; - break; - } break; - - case video::EBF_ONE: - switch ( dstFact ) - { - // gl_one gl_zero - case video::EBF_ZERO: - blendfunc.type = video::EMT_SOLID; - blendfunc.isTransparent = 0; - resolved = 1; - break; - - // gl_one gl_one - case video::EBF_ONE: - blendfunc.type = video::EMT_TRANSPARENT_ADD_COLOR; - blendfunc.isTransparent = 1; - resolved = 1; - break; - } break; - - case video::EBF_SRC_ALPHA: - switch ( dstFact ) - { - // gl_src_alpha gl_one_minus_src_alpha - case video::EBF_ONE_MINUS_SRC_ALPHA: - blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - blendfunc.param0 = 1.f/255.f; - blendfunc.isTransparent = 1; - resolved = 1; - break; - } break; - - case 11: - // add - blendfunc.type = video::EMT_TRANSPARENT_ADD_COLOR; - blendfunc.isTransparent = 1; - resolved = 1; - break; - case 12: - // filter = gl_dst_color gl_zero or gl_zero gl_src_color - blendfunc.type = video::EMT_ONETEXTURE_BLEND; - blendfunc.param0 = video::pack_textureBlendFunc ( video::EBF_DST_COLOR, video::EBF_ZERO, blendfunc.modulate ); - blendfunc.isTransparent = 1; - resolved = 1; - break; - case 13: - // blend = gl_src_alpha gl_one_minus_src_alpha - blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - blendfunc.param0 = 1.f/255.f; - blendfunc.isTransparent = 1; - resolved = 1; - break; - case 14: - // alphafunc ge128 - blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - blendfunc.param0 = 0.5f; - blendfunc.isTransparent = 1; - resolved = 1; - break; - case 15: - // alphafunc gt0 - blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - blendfunc.param0 = 1.f / 255.f; - blendfunc.isTransparent = 1; - resolved = 1; - break; - - } - - // use the generic blender - if ( 0 == resolved ) - { - blendfunc.type = video::EMT_ONETEXTURE_BLEND; - blendfunc.param0 = video::pack_textureBlendFunc ( - (video::E_BLEND_FACTOR) srcFact, - (video::E_BLEND_FACTOR) dstFact, - blendfunc.modulate); - - blendfunc.isTransparent = 1; - } - } - - // random noise [-1;1] - struct Noiser - { - static f32 get () - { - static u32 RandomSeed = 0x69666966; - RandomSeed = (RandomSeed * 3631 + 1); - - f32 value = ( (f32) (RandomSeed & 0x7FFF ) * (1.0f / (f32)(0x7FFF >> 1) ) ) - 1.f; - return value; - } - }; - - enum eQ3ModifierFunction - { - TCMOD = 0, - DEFORMVERTEXES = 1, - RGBGEN = 2, - TCGEN = 3, - MAP = 4, - ALPHAGEN = 5, - - FUNCTION2 = 0x10, - SCROLL = FUNCTION2 + 1, - SCALE = FUNCTION2 + 2, - ROTATE = FUNCTION2 + 3, - STRETCH = FUNCTION2 + 4, - TURBULENCE = FUNCTION2 + 5, - WAVE = FUNCTION2 + 6, - - IDENTITY = FUNCTION2 + 7, - VERTEX = FUNCTION2 + 8, - TEXTURE = FUNCTION2 + 9, - LIGHTMAP = FUNCTION2 + 10, - ENVIRONMENT = FUNCTION2 + 11, - DOLLAR_LIGHTMAP = FUNCTION2 + 12, - BULGE = FUNCTION2 + 13, - AUTOSPRITE = FUNCTION2 + 14, - AUTOSPRITE2 = FUNCTION2 + 15, - TRANSFORM = FUNCTION2 + 16, - EXACTVERTEX = FUNCTION2 + 17, - CONSTANT = FUNCTION2 + 18, - LIGHTINGSPECULAR = FUNCTION2 + 19, - MOVE = FUNCTION2 + 20, - NORMAL = FUNCTION2 + 21, - IDENTITYLIGHTING = FUNCTION2 + 22, - - WAVE_MODIFIER_FUNCTION = 0x30, - SINUS = WAVE_MODIFIER_FUNCTION + 1, - COSINUS = WAVE_MODIFIER_FUNCTION + 2, - SQUARE = WAVE_MODIFIER_FUNCTION + 3, - TRIANGLE = WAVE_MODIFIER_FUNCTION + 4, - SAWTOOTH = WAVE_MODIFIER_FUNCTION + 5, - SAWTOOTH_INVERSE = WAVE_MODIFIER_FUNCTION + 6, - NOISE = WAVE_MODIFIER_FUNCTION + 7, - - UNKNOWN = -2 - }; - - struct SModifierFunction - { - SModifierFunction () - : masterfunc0 ( UNKNOWN ), masterfunc1( UNKNOWN ), func ( SINUS ), - tcgen( TEXTURE ), rgbgen ( IDENTITY ), alphagen ( UNKNOWN ), - base ( 0 ), amp ( 1 ), phase ( 0 ), frequency ( 1 ), - wave ( 1 ), - x ( 0 ), y ( 0 ), z( 0 ), count( 0 ) {} - - // "tcmod","deformvertexes","rgbgen", "tcgen" - eQ3ModifierFunction masterfunc0; - // depends - eQ3ModifierFunction masterfunc1; - // depends - eQ3ModifierFunction func; - - eQ3ModifierFunction tcgen; - eQ3ModifierFunction rgbgen; - eQ3ModifierFunction alphagen; - - union - { - f32 base; - f32 bulgewidth; - }; - - union - { - f32 amp; - f32 bulgeheight; - }; - - f32 phase; - - union - { - f32 frequency; - f32 bulgespeed; - }; - - union - { - f32 wave; - f32 div; - }; - - f32 x; - f32 y; - f32 z; - u32 count; - - f32 evaluate ( f32 dt ) const - { - // phase in 0 and 1.. - f32 x = core::fract( (dt + phase ) * frequency ); - f32 y = 0.f; - - switch ( func ) - { - case SINUS: - y = sinf ( x * core::PI * 2.f ); - break; - case COSINUS: - y = cosf ( x * core::PI * 2.f ); - break; - case SQUARE: - y = x < 0.5f ? 1.f : -1.f; - break; - case TRIANGLE: - y = x < 0.5f ? ( 4.f * x ) - 1.f : ( -4.f * x ) + 3.f; - break; - case SAWTOOTH: - y = x; - break; - case SAWTOOTH_INVERSE: - y = 1.f - x; - break; - case NOISE: - y = Noiser::get(); - break; - default: - break; - } - - return base + ( y * amp ); - } - - - }; - - inline core::vector3df getMD3Normal ( u32 i, u32 j ) - { - const f32 lng = i * 2.0f * core::PI / 255.0f; - const f32 lat = j * 2.0f * core::PI / 255.0f; - return core::vector3df(cosf ( lat ) * sinf ( lng ), - sinf ( lat ) * sinf ( lng ), - cosf ( lng )); - } - - // - inline void getModifierFunc ( SModifierFunction& fill, const core::stringc &string, u32 &pos ) - { - if ( string.size() == 0 ) - return; - - static const c8 * funclist[] = - { - "sin","cos","square", - "triangle", "sawtooth","inversesawtooth", "noise" - }; - - fill.func = (eQ3ModifierFunction) isEqual ( string,pos, funclist,7 ); - fill.func = fill.func == UNKNOWN ? SINUS : (eQ3ModifierFunction) ((u32) fill.func + WAVE_MODIFIER_FUNCTION + 1); - - fill.base = getAsFloat ( string, pos ); - fill.amp = getAsFloat ( string, pos ); - fill.phase = getAsFloat ( string, pos ); - fill.frequency = getAsFloat ( string, pos ); - } - - - // name = "a b c .." - struct SVariable - { - core::stringc name; - core::stringc content; - - SVariable ( const c8 * n, const c8 *c = 0 ) : name ( n ), content (c) {} - virtual ~SVariable () {} - - void clear () - { - name = ""; - content = ""; - } - - s32 isValid () const - { - return name.size(); - } - - bool operator == ( const SVariable &other ) const - { - return 0 == strcmp ( name.c_str(), other.name.c_str () ); - } - - bool operator < ( const SVariable &other ) const - { - return 0 > strcmp ( name.c_str(), other.name.c_str () ); - } - - }; - - - // string database. "a" = "Hello", "b" = "1234.6" - struct SVarGroup - { - SVarGroup () { Variable.setAllocStrategy ( core::ALLOC_STRATEGY_SAFE ); } - virtual ~SVarGroup () {} - - u32 isDefined ( const c8 * name, const c8 * content = 0 ) const - { - for ( u32 i = 0; i != Variable.size (); ++i ) - { - if ( 0 == strcmp ( Variable[i].name.c_str(), name ) && - ( 0 == content || strstr ( Variable[i].content.c_str(), content ) ) - ) - { - return i + 1; - } - } - return 0; - } - - // searches for Variable name and returns is content - // if Variable is not found a reference to an Empty String is returned - const core::stringc &get( const c8 * name ) const - { - SVariable search ( name ); - s32 index = Variable.linear_search ( search ); - if ( index < 0 ) - return irrEmptyStringc; - - return Variable [ index ].content; - } - - // set the Variable name - void set ( const c8 * name, const c8 * content = 0 ) - { - u32 index = isDefined ( name, 0 ); - if ( 0 == index ) - { - Variable.push_back ( SVariable ( name, content ) ); - } - else - { - Variable [ index ].content = content; - } - } - - - core::array < SVariable > Variable; - }; - - //! holding a group a variable - struct SVarGroupList: public IReferenceCounted - { - SVarGroupList () - { - VariableGroup.setAllocStrategy ( core::ALLOC_STRATEGY_SAFE ); - } - virtual ~SVarGroupList () {} - - core::array < SVarGroup > VariableGroup; - }; - - - //! A Parsed Shader Holding Variables ordered in Groups - struct IShader - { - IShader () - : ID ( 0 ), VarGroup ( 0 ) {} - virtual ~IShader () {} - - bool operator == (const IShader &other ) const - { - return 0 == strcmp ( name.c_str(), other.name.c_str () ); - //return name == other.name; - } - - bool operator < (const IShader &other ) const - { - return strcmp ( name.c_str(), other.name.c_str () ) < 0; - //return name < other.name; - } - - u32 getGroupSize () const - { - if ( 0 == VarGroup ) - return 0; - return VarGroup->VariableGroup.size (); - } - - const SVarGroup * getGroup ( u32 stage ) const - { - if ( 0 == VarGroup || stage >= VarGroup->VariableGroup.size () ) - return 0; - - return &VarGroup->VariableGroup [ stage ]; - } - - // id - s32 ID; - SVarGroupList *VarGroup; // reference - - // Shader: shader name ( also first variable in first Vargroup ) - // Entity: classname ( variable in Group(1) ) - core::stringc name; - }; - - typedef IShader IEntity; - - typedef core::array < IEntity > tQ3EntityList; - - /* - dump shader like original layout, regardless of internal data holding - no recursive folding.. - */ - inline void dumpVarGroup ( core::stringc &dest, const SVarGroup * group, s32 stack ) - { - core::stringc buf; - - if ( stack > 0 ) - { - buf = ""; - for (s32 i = 0; i < stack - 1; ++i ) - buf += '\t'; - - buf += "{\n"; - dest.append ( buf ); - } - - for ( u32 g = 0; g != group->Variable.size(); ++g ) - { - buf = ""; - for (s32 i = 0; i < stack; ++i ) - buf += '\t'; - - buf += group->Variable[g].name; - buf += " "; - buf += group->Variable[g].content; - buf += "\n"; - dest.append ( buf ); - } - - if ( stack > 1 ) - { - buf = ""; - for (s32 i = 0; i < stack - 1; ++i ) - buf += '\t'; - - buf += "}\n"; - dest.append ( buf ); - } - } - - /*! - dump a Shader or an Entity - */ - inline core::stringc & dumpShader ( core::stringc &dest, const IShader * shader, bool entity = false ) - { - if ( 0 == shader ) - return dest; - - const u32 size = shader->VarGroup->VariableGroup.size (); - for ( u32 i = 0; i != size; ++i ) - { - const SVarGroup * group = &shader->VarGroup->VariableGroup[ i ]; - dumpVarGroup ( dest, group, core::clamp( (int)i, 0, 2 ) ); - } - - if ( !entity ) - { - if ( size <= 1 ) - { - dest.append ( "{\n" ); - } - dest.append ( "}\n" ); - } - return dest; - } - - - /* - quake3 doesn't care much about tga & jpg - load one or multiple files stored in name started at startPos to the texture array textures - if texture is not loaded 0 will be added ( to find missing textures easier) - */ - inline void getTextures(tTexArray &textures, - const core::stringc &name, u32 &startPos, - const io::IFileSystem *fileSystem, - video::IVideoDriver* driver) - { - static const char * const extension[] = - { - ".jpg", - ".jpeg", - ".png", - ".dds", - ".tga", - ".bmp", - ".pcx" - }; - - tStringList stringList; - getAsStringList(stringList, -1, name, startPos); - - textures.clear(); - - io::path loadFile; - for ( u32 i = 0; i!= stringList.size (); ++i ) - { - video::ITexture* texture = 0; - for (u32 g = 0; g != 7; ++g) - { - core::cutFilenameExtension ( loadFile, stringList[i] ); - - if ( loadFile == "$whiteimage" ) - { - texture = driver->getTexture( "$whiteimage" ); - if ( 0 == texture ) - { - core::dimension2du s ( 2, 2 ); - u32 image[4] = { 0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF }; - video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image ); - texture = driver->addTexture( "$whiteimage", w ); - w->drop (); - } - - } - else - if ( loadFile == "$redimage" ) - { - texture = driver->getTexture( "$redimage" ); - if ( 0 == texture ) - { - core::dimension2du s ( 2, 2 ); - u32 image[4] = { 0xFFFF0000, 0xFFFF0000,0xFFFF0000,0xFFFF0000 }; - video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image ); - texture = driver->addTexture( "$redimage", w ); - w->drop (); - } - } - else - if ( loadFile == "$blueimage" ) - { - texture = driver->getTexture( "$blueimage" ); - if ( 0 == texture ) - { - core::dimension2du s ( 2, 2 ); - u32 image[4] = { 0xFF0000FF, 0xFF0000FF,0xFF0000FF,0xFF0000FF }; - video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image ); - texture = driver->addTexture( "$blueimage", w ); - w->drop (); - } - } - else - if ( loadFile == "$checkerimage" ) - { - texture = driver->getTexture( "$checkerimage" ); - if ( 0 == texture ) - { - core::dimension2du s ( 2, 2 ); - u32 image[4] = { 0xFFFFFFFF, 0xFF000000,0xFF000000,0xFFFFFFFF }; - video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image ); - texture = driver->addTexture( "$checkerimage", w ); - w->drop (); - } - } - else - if ( loadFile == "$lightmap" ) - { - texture = 0; - } - else - { - loadFile.append ( extension[g] ); - } - - texture = driver->findTexture( loadFile ); - if ( texture ) - break; - - if ( fileSystem->existFile ( loadFile ) ) - { - texture = driver->getTexture( loadFile ); - if ( texture ) - break; - texture = 0; - } - } - // take 0 Texture - textures.push_back(texture); - } - } - - - //! Manages various Quake3 Shader Styles - class IShaderManager : public IReferenceCounted - { - }; - -} // end namespace quake3 -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/ISceneCollisionManager.h b/include/ISceneCollisionManager.h deleted file mode 100644 index ccfe8639..00000000 --- a/include/ISceneCollisionManager.h +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SCENE_COLLISION_MANAGER_H_INCLUDED__ -#define __I_SCENE_COLLISION_MANAGER_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "vector3d.h" -#include "triangle3d.h" -#include "position2d.h" -#include "line3d.h" - -namespace irr -{ - -namespace scene -{ - class ISceneNode; - class ICameraSceneNode; - class ITriangleSelector; - class IMeshBuffer; - - struct SCollisionHit - { - //! Point of collision - core::vector3df Intersection; - - //! Triangle with which we collided - core::triangle3df Triangle; - - //! Triangle selector which contained the colliding triangle (useful when having MetaTriangleSelector) - ITriangleSelector* TriangleSelector; - - //! Node which contained the triangle (is 0 when selector doesn't have that information) - ISceneNode* Node; - - //! Meshbuffer which contained the triangle (is 0 when the selector doesn't have that information, only works when selectors are created per meshbuffer) - const IMeshBuffer* MeshBuffer; - - //! Index of selected material of the triangle in the SceneNode. Usually only valid when MeshBuffer is also set, otherwise always 0 - irr::u32 MaterialIndex; - - SCollisionHit() : TriangleSelector(0), Node(0), MeshBuffer(0), MaterialIndex(0) - {} - }; - - //! The Scene Collision Manager provides methods for performing collision tests and picking on scene nodes. - class ISceneCollisionManager : public virtual IReferenceCounted - { - public: - - //! Finds the nearest collision point of a line and lots of triangles, if there is one. - /** \param hitResult: Contains collision result when there was a collision detected. - \param ray: Line with which collisions are tested. - \param selector: TriangleSelector to be used for the collision check. - \return true if a collision was detected and false if not. */ - virtual bool getCollisionPoint(SCollisionHit& hitResult, const core::line3d& ray, - ITriangleSelector* selector) = 0; - - //! Finds the nearest collision point of a line and lots of triangles, if there is one. - /** \param ray: Line with which collisions are tested. - \param selector: TriangleSelector containing the triangles. It - can be created for example using - ISceneManager::createTriangleSelector() or - ISceneManager::createTriangleOctreeSelector(). - \param outCollisionPoint: If a collision is detected, this will - contain the position of the nearest collision to the line-start. - \param outTriangle: If a collision is detected, this will - contain the triangle with which the ray collided. - \param outNode: If a collision is detected, this will contain - the scene node associated with the triangle that was hit. - \return True if a collision was detected and false if not. */ - virtual bool getCollisionPoint(const core::line3d& ray, - ITriangleSelector* selector, core::vector3df& outCollisionPoint, - core::triangle3df& outTriangle, ISceneNode*& outNode) - { - SCollisionHit hitResult; - if ( getCollisionPoint(hitResult, ray, selector) ) - { - outCollisionPoint = hitResult.Intersection; - outTriangle = hitResult.Triangle; - outNode = hitResult.Node; - return true; - } - return false; - } - - //! Collides a moving ellipsoid with a 3d world with gravity and returns the resulting new position of the ellipsoid. - /** This can be used for moving a character in a 3d world: The - character will slide at walls and is able to walk up stairs. - The method used how to calculate the collision result position - is based on the paper "Improved Collision detection and - Response" by Kasper Fauerby. - \param selector: TriangleSelector containing the triangles of - the world. It can be created for example using - ISceneManager::createTriangleSelector() or - ISceneManager::createTriangleOctreeSelector(). - \param ellipsoidPosition: Position of the ellipsoid. - \param ellipsoidRadius: Radius of the ellipsoid. - \param ellipsoidDirectionAndSpeed: Direction and speed of the - movement of the ellipsoid. - \param triout: Optional parameter where the last triangle - causing a collision is stored, if there is a collision. - \param hitPosition: Return value for the position of the collision - \param outFalling: Is set to true if the ellipsoid is falling - down, caused by gravity. - \param outNode: the node with which the ellipsoid collided (if any) - \param slidingSpeed: DOCUMENTATION NEEDED. - \param gravityDirectionAndSpeed: Direction and force of gravity. - \return New position of the ellipsoid. */ - virtual core::vector3df getCollisionResultPosition( - ITriangleSelector* selector, - const core::vector3df &ellipsoidPosition, - const core::vector3df& ellipsoidRadius, - const core::vector3df& ellipsoidDirectionAndSpeed, - core::triangle3df& triout, - core::vector3df& hitPosition, - bool& outFalling, - ISceneNode*& outNode, - f32 slidingSpeed = 0.0005f, - const core::vector3df& gravityDirectionAndSpeed - = core::vector3df(0.0f, 0.0f, 0.0f)) = 0; - - //! Returns a 3d ray which would go through the 2d screen coordinates. - /** \param pos: Screen coordinates in pixels. - \param camera: Camera from which the ray starts. If null, the - active camera is used. - \return Ray starting from the position of the camera and ending - at a length of the far value of the camera at a position which - would be behind the 2d screen coordinates. */ - virtual core::line3d getRayFromScreenCoordinates( - const core::position2d& pos, const ICameraSceneNode* camera = 0) = 0; - - //! Calculates 2d screen position from a 3d position. - /** \param pos: 3D position in world space to be transformed - into 2d. - \param camera: Camera to be used. If null, the currently active - camera is used. - \param useViewPort: Calculate screen coordinates relative to - the current view port. Please note that unless the driver does - not take care of the view port, it is usually best to get the - result in absolute screen coordinates (flag=false). - \return 2d screen coordinates which a object in the 3d world - would have if it would be rendered to the screen. If the 3d - position is behind the camera, it is set to (-1000,-1000). In - most cases you can ignore this fact, because if you use this - method for drawing a decorator over a 3d object, it will be - clipped by the screen borders. */ - virtual core::position2d getScreenCoordinatesFrom3DPosition( - const core::vector3df& pos, const ICameraSceneNode* camera=0, bool useViewPort=false) = 0; - - //! Gets the scene node, which is currently visible under the given screen coordinates, viewed from the currently active camera. - /** The collision tests are done using a bounding box for each - scene node. You can limit the recursive search so just all children of the specified root are tested. - \param pos: Position in pixel screen coordinates, under which - the returned scene node will be. - \param idBitMask: Only scene nodes with an id with bits set - like in this mask will be tested. If the BitMask is 0, this - feature is disabled. - Please note that the default node id of -1 will match with - every bitmask != 0 - \param bNoDebugObjects: Doesn't take debug objects into account - when true. These are scene nodes with IsDebugObject() = true. - \param root If different from 0, the search is limited to the children of this node. - \return Visible scene node under screen coordinates with - matching bits in its id. If there is no scene node under this - position, 0 is returned. */ - virtual ISceneNode* getSceneNodeFromScreenCoordinatesBB(const core::position2d& pos, - s32 idBitMask=0, bool bNoDebugObjects=false, ISceneNode* root=0) =0; - - //! Returns the nearest scene node which collides with a 3d ray and whose id matches a bitmask. - /** The collision tests are done using a bounding box for each - scene node. The recursive search can be limited be specifying a scene node. - \param ray Line with which collisions are tested. - \param idBitMask Only scene nodes with an id which matches at - least one of the bits contained in this mask will be tested. - However, if this parameter is 0, then all nodes are checked. - \param bNoDebugObjects: Doesn't take debug objects into account when true. These - are scene nodes with IsDebugObject() = true. - \param root If different from 0, the search is limited to the children of this node. - \return Scene node nearest to ray.start, which collides with - the ray and matches the idBitMask, if the mask is not null. If - no scene node is found, 0 is returned. */ - virtual ISceneNode* getSceneNodeFromRayBB(const core::line3d& ray, - s32 idBitMask=0, bool bNoDebugObjects=false, ISceneNode* root=0) =0; - - //! Get the scene node, which the given camera is looking at and whose id matches the bitmask. - /** A ray is simply cast from the position of the camera to - the view target position, and all scene nodes are tested - against this ray. The collision tests are done using a bounding - box for each scene node. - \param camera: Camera from which the ray is cast. - \param idBitMask: Only scene nodes with an id which matches at least one of the - bits contained in this mask will be tested. However, if this parameter is 0, then - all nodes are checked. - feature is disabled. - Please note that the default node id of -1 will match with - every bitmask != 0 - \param bNoDebugObjects: Doesn't take debug objects into account - when true. These are scene nodes with IsDebugObject() = true. - \return Scene node nearest to the camera, which collides with - the ray and matches the idBitMask, if the mask is not null. If - no scene node is found, 0 is returned. */ - virtual ISceneNode* getSceneNodeFromCameraBB(const ICameraSceneNode* camera, - s32 idBitMask=0, bool bNoDebugObjects = false) = 0; - - - //! Perform a ray/box and ray/triangle collision check on a hierarchy of scene nodes. - /** This checks all scene nodes under the specified one, first by ray/bounding - box, and then by accurate ray/triangle collision, finding the nearest collision, - and the scene node containing it. It returns the node hit, and (via output - parameters) the position of the collision, and the triangle that was hit. - - All scene nodes in the hierarchy tree under the specified node are checked. Only - nodes that are visible, with an ID that matches at least one bit in the supplied - bitmask, and which have a triangle selector are considered as candidates for being hit. - You do not have to build a meta triangle selector; the individual triangle selectors - of each candidate scene node are used automatically. - - \param ray: Line with which collisions are tested. - \param outCollisionPoint: If a collision is detected, this will contain the - position of the nearest collision. - \param outTriangle: If a collision is detected, this will contain the triangle - with which the ray collided. - \param idBitMask: Only scene nodes with an id which matches at least one of the - bits contained in this mask will be tested. However, if this parameter is 0, then - all nodes are checked. - \param collisionRootNode: the scene node at which to begin checking. Only this - node and its children will be checked. If you want to check the entire scene, - pass 0, and the root scene node will be used (this is the default). - \param noDebugObjects: when true, debug objects are not considered viable targets. - Debug objects are scene nodes with IsDebugObject() = true. - \return Returns the scene node containing the hit triangle nearest to ray.start. - If no collision is detected, then 0 is returned. */ - virtual ISceneNode* getSceneNodeAndCollisionPointFromRay( - SCollisionHit& hitResult, - const core::line3df& ray, - s32 idBitMask = 0, - ISceneNode * collisionRootNode = 0, - bool noDebugObjects = false) = 0; - - //! Perform a ray/box and ray/triangle collision check on a hierarchy of scene nodes. - /** Works same as other getSceneNodeAndCollisionPointFromRay but returns less information. - (was written before the other getSceneNodeAndCollisionPointFromRay implementation). - \param ray: Line with which collisions are tested. - \param outCollisionPoint: If a collision is detected, this will contain the - position of the nearest collision. - \param outTriangle: If a collision is detected, this will contain the triangle - with which the ray collided. - \param idBitMask: Only scene nodes with an id which matches at least one of the - bits contained in this mask will be tested. However, if this parameter is 0, then - all nodes are checked. - \param collisionRootNode: the scene node at which to begin checking. Only this - node and its children will be checked. If you want to check the entire scene, - pass 0, and the root scene node will be used (this is the default). - \param noDebugObjects: when true, debug objects are not considered viable targets. - Debug objects are scene nodes with IsDebugObject() = true. - \return Returns the scene node containing the hit triangle nearest to ray.start. - If no collision is detected, then 0 is returned. */ - virtual ISceneNode* getSceneNodeAndCollisionPointFromRay( - const core::line3df& ray, - core::vector3df& outCollisionPoint, - core::triangle3df& outTriangle, - s32 idBitMask = 0, - ISceneNode * collisionRootNode = 0, - bool noDebugObjects = false) - { - SCollisionHit hitResult; - ISceneNode* node = getSceneNodeAndCollisionPointFromRay(hitResult, ray, idBitMask, collisionRootNode, noDebugObjects); - if ( node ) - { - outCollisionPoint = hitResult.Intersection; - outTriangle = hitResult.Triangle; - } - return node; - } - - }; - -} // end namespace scene -} // end namespace irr - -#endif diff --git a/include/ISceneManager.h b/include/ISceneManager.h index ac860a70..2f25e414 100644 --- a/include/ISceneManager.h +++ b/include/ISceneManager.h @@ -14,10 +14,8 @@ #include "SColor.h" #include "ETerrainElements.h" #include "ESceneNodeTypes.h" -#include "ESceneNodeAnimatorTypes.h" #include "EMeshWriterEnums.h" #include "SceneParameters.h" -#include "IGeometryCreator.h" #include "ISkinnedMesh.h" namespace irr @@ -103,11 +101,8 @@ namespace scene class IAnimatedMesh; class IAnimatedMeshSceneNode; class IBillboardSceneNode; - class IBillboardTextSceneNode; class ICameraSceneNode; class IDummyTransformationSceneNode; - class ILightManager; - class ILightSceneNode; class IMesh; class IMeshBuffer; class IMeshCache; @@ -115,35 +110,13 @@ namespace scene class IMeshManipulator; class IMeshSceneNode; class IMeshWriter; - class IMetaTriangleSelector; - class IOctreeSceneNode; - class IParticleSystemSceneNode; - class ISceneCollisionManager; class ISceneLoader; class ISceneNode; - class ISceneNodeAnimator; - class ISceneNodeAnimatorCollisionResponse; - class ISceneNodeAnimatorFactory; class ISceneNodeFactory; class ISceneUserDataSerializer; - class IShadowVolumeSceneNode; - class ITerrainSceneNode; - class ITextSceneNode; - class ITriangleSelector; - class IVolumeLightSceneNode; - - namespace quake3 - { - struct IShader; - } // end namespace quake3 //! The Scene Manager manages scene nodes, mesh resources, cameras and all the other stuff. - /** All Scene nodes can be created only here. There is a always growing - list of scene nodes for lots of purposes: Indoor rendering scene nodes - like the Octree (addOctreeSceneNode()) or the terrain renderer - (addTerrainSceneNode()), different Camera scene nodes - (addCameraSceneNode(), addCameraSceneNodeMaya()), scene nodes for Light - (addLightSceneNode()), Billboards (addBillboardSceneNode()) and so on. + /** All Scene nodes can be created only here. A scene node is a node in the hierarchical scene graph. Every scene node may have children, which are other scene nodes. Children move relative the their parents position. If the parent of a node is not visible, its @@ -384,65 +357,6 @@ namespace scene This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ virtual io::IFileSystem* getFileSystem() = 0; - //! adds Volume Lighting Scene Node. - /** Example Usage: - scene::IVolumeLightSceneNode * n = smgr->addVolumeLightSceneNode(0, -1, - 32, 32, //Subdivide U/V - video::SColor(0, 180, 180, 180), //foot color - video::SColor(0, 0, 0, 0) //tail color - ); - if (n) - { - n->setScale(core::vector3df(46.0f, 45.0f, 46.0f)); - n->getMaterial(0).setTexture(0, smgr->getVideoDriver()->getTexture("lightFalloff.png")); - } - \return Pointer to the volumeLight if successful, otherwise NULL. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IVolumeLightSceneNode* addVolumeLightSceneNode(ISceneNode* parent=0, s32 id=-1, - const u32 subdivU = 32, const u32 subdivV = 32, - const video::SColor foot = video::SColor(51, 0, 230, 180), - const video::SColor tail = video::SColor(0, 0, 0, 0), - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0; - - //! Adds a cube scene node - /** \param size: Size of the cube, uniformly in each dimension. - \param parent: Parent of the scene node. Can be 0 if no parent. - \param id: Id of the node. This id can be used to identify the scene node. - \param position: Position of the space relative to its parent - where the scene node will be placed. - \param rotation: Initial rotation of the scene node. - \param scale: Initial scale of the scene node. - \return Pointer to the created test scene node. This - pointer should not be dropped. See IReferenceCounted::drop() - for more information. */ - virtual IMeshSceneNode* addCubeSceneNode(f32 size=10.0f, ISceneNode* parent=0, s32 id=-1, - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0; - - //! Adds a sphere scene node of the given radius and detail - /** \param radius: Radius of the sphere. - \param polyCount: The number of vertices in horizontal and - vertical direction. The total polyCount of the sphere is - polyCount*polyCount. This parameter must be less than 256 to - stay within the 16-bit limit of the indices of a meshbuffer. - \param parent: Parent of the scene node. Can be 0 if no parent. - \param id: Id of the node. This id can be used to identify the scene node. - \param position: Position of the space relative to its parent - where the scene node will be placed. - \param rotation: Initial rotation of the scene node. - \param scale: Initial scale of the scene node. - \return Pointer to the created test scene node. This - pointer should not be dropped. See IReferenceCounted::drop() - for more information. */ - virtual IMeshSceneNode* addSphereSceneNode(f32 radius=5.0f, s32 polyCount=16, - ISceneNode* parent=0, s32 id=-1, - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0; - //! Adds a scene node for rendering an animated mesh model. /** \param mesh: Pointer to the loaded animated mesh to be displayed. \param parent: Parent of the scene node. Can be NULL if no parent. @@ -478,65 +392,10 @@ namespace scene const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f), bool alsoAddIfMeshPointerZero=false) = 0; - //! Adds a scene node for rendering a animated water surface mesh. - /** Looks really good when the Material type EMT_TRANSPARENT_REFLECTION - is used. - \param waveHeight: Height of the water waves. - \param waveSpeed: Speed of the water waves. - \param waveLength: Length of a water wave. - \param mesh: Pointer to the loaded static mesh to be displayed with water waves on it. - \param parent: Parent of the scene node. Can be NULL if no parent. - \param id: Id of the node. This id can be used to identify the scene node. - \param position: Position of the space relative to its parent where the - scene node will be placed. - \param rotation: Initial rotation of the scene node. - \param scale: Initial scale of the scene node. - \return Pointer to the created scene node. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNode* addWaterSurfaceSceneNode(IMesh* mesh, - f32 waveHeight=2.0f, f32 waveSpeed=300.0f, f32 waveLength=10.0f, - ISceneNode* parent=0, s32 id=-1, - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0; - - - //! Adds a scene node for rendering using a octree to the scene graph. - /** This a good method for rendering - scenes with lots of geometry. The octree is built on the fly from the mesh. - \param mesh: The mesh containing all geometry from which the octree will be build. - If this animated mesh has more than one frames in it, the first frame is taken. - \param parent: Parent node of the octree node. - \param id: id of the node. This id can be used to identify the node. - \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node. - If a node gets less polys than this value it will not be split into - smaller nodes. - \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed. - \return Pointer to the octree if successful, otherwise 0. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IOctreeSceneNode* addOctreeSceneNode(IAnimatedMesh* mesh, ISceneNode* parent=0, - s32 id=-1, s32 minimalPolysPerNode=512, bool alsoAddIfMeshPointerZero=false) = 0; - - //! Adds a scene node for rendering using a octree to the scene graph. - /** This a good method for rendering scenes with lots of - geometry. The octree is built on the fly from the mesh, much - faster then a bsp tree. - \param mesh: The mesh containing all geometry from which the octree will be build. - \param parent: Parent node of the octree node. - \param id: id of the node. This id can be used to identify the node. - \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node. - If a node gets less polys than this value it will not be split into - smaller nodes. - \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed. - \return Pointer to the octree if successful, otherwise 0. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IOctreeSceneNode* addOctreeSceneNode(IMesh* mesh, ISceneNode* parent=0, - s32 id=-1, s32 minimalPolysPerNode=256, bool alsoAddIfMeshPointerZero=false) = 0; - //! Adds a camera scene node to the scene graph and sets it as active camera. - /** This camera does not react on user input like for example the one created with - addCameraSceneNodeFPS(). If you want to move or animate it, use animators or the - ISceneNode::setPosition(), ICameraSceneNode::setTarget() etc methods. + /** This camera does not react on user input. + If you want to move or animate it, use ISceneNode::setPosition(), + ICameraSceneNode::setTarget() etc methods. By default, a camera's look at position (set with setTarget()) and its scene node rotation (set with setRotation()) are independent. If you want to be able to control the direction that the camera looks by using setRotation() then call @@ -555,116 +414,6 @@ namespace scene const core::vector3df& lookat = core::vector3df(0,0,100), s32 id=-1, bool makeActive=true) = 0; - //! Adds a maya style user controlled camera scene node to the scene graph. - /** This is a standard camera with an animator that provides mouse control similar - to camera in the 3D Software Maya by Alias Wavefront. - The camera does not react on setPosition anymore after applying this animator. Instead - use setTarget, to fix the target the camera the camera hovers around. And setDistance - to set the current distance from that target, i.e. the radius of the orbit the camera - hovers on. - \param parent: Parent scene node of the camera. Can be null. - \param rotateSpeed: Rotation speed of the camera. - \param zoomSpeed: Zoom speed of the camera. - \param translationSpeed: TranslationSpeed of the camera. - \param id: id of the camera. This id can be used to identify the camera. - \param distance Initial distance of the camera from the object - \param makeActive Flag whether this camera should become the active one. - Make sure you always have one active camera. - \return Returns a pointer to the interface of the camera if successful, otherwise 0. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ICameraSceneNode* addCameraSceneNodeMaya(ISceneNode* parent=0, - f32 rotateSpeed=-1500.f, f32 zoomSpeed=200.f, - f32 translationSpeed=1500.f, s32 id=-1, f32 distance=70.f, - bool makeActive=true) =0; - - //! Adds a camera scene node with an animator which provides mouse and keyboard control appropriate for first person shooters (FPS). - /** This FPS camera is intended to provide a demonstration of a - camera that behaves like a typical First Person Shooter. It is - useful for simple demos and prototyping but is not intended to - provide a full solution for a production quality game. It binds - the camera scene node rotation to the look-at target; @see - ICameraSceneNode::bindTargetAndRotation(). With this camera, - you look with the mouse, and move with cursor keys. If you want - to change the key layout, you can specify your own keymap. For - example to make the camera be controlled by the cursor keys AND - the keys W,A,S, and D, do something like this: - \code - SKeyMap keyMap[8]; - keyMap[0].Action = EKA_MOVE_FORWARD; - keyMap[0].KeyCode = KEY_UP; - keyMap[1].Action = EKA_MOVE_FORWARD; - keyMap[1].KeyCode = KEY_KEY_W; - - keyMap[2].Action = EKA_MOVE_BACKWARD; - keyMap[2].KeyCode = KEY_DOWN; - keyMap[3].Action = EKA_MOVE_BACKWARD; - keyMap[3].KeyCode = KEY_KEY_S; - - keyMap[4].Action = EKA_STRAFE_LEFT; - keyMap[4].KeyCode = KEY_LEFT; - keyMap[5].Action = EKA_STRAFE_LEFT; - keyMap[5].KeyCode = KEY_KEY_A; - - keyMap[6].Action = EKA_STRAFE_RIGHT; - keyMap[6].KeyCode = KEY_RIGHT; - keyMap[7].Action = EKA_STRAFE_RIGHT; - keyMap[7].KeyCode = KEY_KEY_D; - - camera = sceneManager->addCameraSceneNodeFPS(0, 100, 500, -1, keyMap, 8); - \endcode - \param parent: Parent scene node of the camera. Can be null. - \param rotateSpeed: Speed in degrees with which the camera is - rotated. This can be done only with the mouse. - \param moveSpeed: Speed in units per millisecond with which - the camera is moved. Movement is done with the cursor keys. - \param id: id of the camera. This id can be used to identify - the camera. - \param keyMapArray: Optional pointer to an array of a keymap, - specifying what keys should be used to move the camera. If this - is null, the default keymap is used. You can define actions - more then one time in the array, to bind multiple keys to the - same action. - \param keyMapSize: Amount of items in the keymap array. - \param noVerticalMovement: Setting this to true makes the - camera only move within a horizontal plane, and disables - vertical movement as known from most ego shooters. Default is - 'false', with which it is possible to fly around in space, if - no gravity is there. - \param jumpSpeed: Speed with which the camera is moved when - jumping. - \param invertMouse: Setting this to true makes the camera look - up when the mouse is moved down and down when the mouse is - moved up, the default is 'false' which means it will follow the - movement of the mouse cursor. - \param makeActive Flag whether this camera should become the active one. - Make sure you always have one active camera. - \return Pointer to the interface of the camera if successful, - otherwise 0. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual ICameraSceneNode* addCameraSceneNodeFPS(ISceneNode* parent = 0, - f32 rotateSpeed = 100.0f, f32 moveSpeed = 0.5f, s32 id=-1, - SKeyMap* keyMapArray=0, s32 keyMapSize=0, bool noVerticalMovement=false, - f32 jumpSpeed = 0.f, bool invertMouse=false, - bool makeActive=true) = 0; - - //! Adds a dynamic light scene node to the scene graph. - /** The light will cast dynamic light on all - other scene nodes in the scene, which have the material flag video::MTF_LIGHTING - turned on. (This is the default setting in most scene nodes). - \param parent: Parent scene node of the light. Can be null. If the parent moves, - the light will move too. - \param position: Position of the space relative to its parent where the light will be placed. - \param color: Diffuse color of the light. Ambient or Specular colors can be set manually with - the ILightSceneNode::getLightData() method. - \param radius: Radius of the light. - \param id: id of the node. This id can be used to identify the node. - \return Pointer to the interface of the light if successful, otherwise NULL. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ILightSceneNode* addLightSceneNode(ISceneNode* parent = 0, - const core::vector3df& position = core::vector3df(0,0,0), - video::SColorf color = video::SColorf(1.0f, 1.0f, 1.0f), - f32 radius=100.0f, s32 id=-1) = 0; - //! Adds a billboard scene node to the scene graph. /** A billboard is like a 3d sprite: A 2d element, which always looks to the camera. It is usually used for things @@ -689,180 +438,6 @@ namespace scene const core::vector3df& position = core::vector3df(0,0,0), s32 id=-1, video::SColor colorTop = 0xFFFFFFFF, video::SColor colorBottom = 0xFFFFFFFF) = 0; - //! Adds a skybox scene node to the scene graph. - /** A skybox is a big cube with 6 textures on it and - is drawn around the camera position. - \param top: Texture for the top plane of the box. - \param bottom: Texture for the bottom plane of the box. - \param left: Texture for the left plane of the box. - \param right: Texture for the right plane of the box. - \param front: Texture for the front plane of the box. - \param back: Texture for the back plane of the box. - \param parent: Parent scene node of the skybox. A skybox usually has no parent, - so this should be null. Note: If a parent is set to the skybox, the box will not - change how it is drawn. - \param id: An id of the node. This id can be used to identify the node. - \return Pointer to the sky box if successful, otherwise NULL. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNode* addSkyBoxSceneNode(video::ITexture* top, video::ITexture* bottom, - video::ITexture* left, video::ITexture* right, video::ITexture* front, - video::ITexture* back, ISceneNode* parent = 0, s32 id=-1) = 0; - - //! Adds a skydome scene node to the scene graph. - /** A skydome is a large (half-) sphere with a panoramic texture - on the inside and is drawn around the camera position. - \param texture: Texture for the dome. - \param horiRes: Number of vertices of a horizontal layer of the sphere. - \param vertRes: Number of vertices of a vertical layer of the sphere. - \param texturePercentage: How much of the height of the - texture is used. Should be between 0 and 1. - \param spherePercentage: How much of the sphere is drawn. - Value should be between 0 and 2, where 1 is an exact - half-sphere and 2 is a full sphere. - \param radius The Radius of the sphere - \param parent: Parent scene node of the dome. A dome usually has no parent, - so this should be null. Note: If a parent is set, the dome will not - change how it is drawn. - \param id: An id of the node. This id can be used to identify the node. - \return Pointer to the sky dome if successful, otherwise NULL. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNode* addSkyDomeSceneNode(video::ITexture* texture, - u32 horiRes=16, u32 vertRes=8, - f32 texturePercentage=0.9, f32 spherePercentage=2.0,f32 radius = 1000.f, - ISceneNode* parent=0, s32 id=-1) = 0; - - //! Adds a particle system scene node to the scene graph. - /** \param withDefaultEmitter: Creates a default working point emitter - which emits some particles. Set this to true to see a particle system - in action. If set to false, you'll have to set the emitter you want by - calling IParticleSystemSceneNode::setEmitter(). - \param parent: Parent of the scene node. Can be NULL if no parent. - \param id: Id of the node. This id can be used to identify the scene node. - \param position: Position of the space relative to its parent where the - scene node will be placed. - \param rotation: Initial rotation of the scene node. - \param scale: Initial scale of the scene node. - \return Pointer to the created scene node. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IParticleSystemSceneNode* addParticleSystemSceneNode( - bool withDefaultEmitter=true, ISceneNode* parent=0, s32 id=-1, - const core::vector3df& position = core::vector3df(0,0,0), - const core::vector3df& rotation = core::vector3df(0,0,0), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0; - - //! Adds a terrain scene node to the scene graph. - /** This node implements is a simple terrain renderer which uses - a technique known as geo mip mapping - for reducing the detail of triangle blocks which are far away. - The code for the TerrainSceneNode is based on the terrain - renderer by Soconne and the GeoMipMapSceneNode developed by - Spintz. They made their code available for Irrlicht and allowed - it to be distributed under this licence. I only modified some - parts. A lot of thanks go to them. - - This scene node is capable of loading terrains and updating - the indices at runtime to enable viewing very large terrains - very quickly. It uses a CLOD (Continuous Level of Detail) - algorithm which updates the indices for each patch based on - a LOD (Level of Detail) which is determined based on a patch's - distance from the camera. - - The patch size of the terrain must always be a size of 2^N+1, - i.e. 8+1(9), 16+1(17), etc. - The MaxLOD available is directly dependent on the patch size - of the terrain. LOD 0 contains all of the indices to draw all - the triangles at the max detail for a patch. As each LOD goes - up by 1 the step taken, in generating indices increases by - -2^LOD, so for LOD 1, the step taken is 2, for LOD 2, the step - taken is 4, LOD 3 - 8, etc. The step can be no larger than - the size of the patch, so having a LOD of 8, with a patch size - of 17, is asking the algorithm to generate indices every 2^8 ( - 256 ) vertices, which is not possible with a patch size of 17. - The maximum LOD for a patch size of 17 is 2^4 ( 16 ). So, - with a MaxLOD of 5, you'll have LOD 0 ( full detail ), LOD 1 ( - every 2 vertices ), LOD 2 ( every 4 vertices ), LOD 3 ( every - 8 vertices ) and LOD 4 ( every 16 vertices ). - \param heightMapFileName: The name of the file on disk, to read vertex data from. This should - be a gray scale bitmap. - \param parent: Parent of the scene node. Can be 0 if no parent. - \param id: Id of the node. This id can be used to identify the scene node. - \param position: The absolute position of this node. - \param rotation: The absolute rotation of this node. ( NOT YET IMPLEMENTED ) - \param scale: The scale factor for the terrain. If you're - using a heightmap of size 129x129 and would like your terrain - to be 12900x12900 in game units, then use a scale factor of ( - core::vector ( 100.0f, 100.0f, 100.0f ). If you use a Y - scaling factor of 0.0f, then your terrain will be flat. - \param vertexColor: The default color of all the vertices. If no texture is associated - with the scene node, then all vertices will be this color. Defaults to white. - \param maxLOD: The maximum LOD (level of detail) for the node. Only change if you - know what you are doing, this might lead to strange behavior. - \param patchSize: patch size of the terrain. Only change if you - know what you are doing, this might lead to strange behavior. - \param smoothFactor: The number of times the vertices are smoothed. - \param addAlsoIfHeightmapEmpty: Add terrain node even with empty heightmap. - \return Pointer to the created scene node. Can be null - if the terrain could not be created, for example because the - heightmap could not be loaded. The returned pointer should - not be dropped. See IReferenceCounted::drop() for more - information. */ - virtual ITerrainSceneNode* addTerrainSceneNode( - const io::path& heightMapFileName, - ISceneNode* parent=0, s32 id=-1, - const core::vector3df& position = core::vector3df(0.0f,0.0f,0.0f), - const core::vector3df& rotation = core::vector3df(0.0f,0.0f,0.0f), - const core::vector3df& scale = core::vector3df(1.0f,1.0f,1.0f), - video::SColor vertexColor = video::SColor(255,255,255,255), - s32 maxLOD=5, E_TERRAIN_PATCH_SIZE patchSize=ETPS_17, s32 smoothFactor=0, - bool addAlsoIfHeightmapEmpty = false) = 0; - - //! Adds a terrain scene node to the scene graph. - /** Just like the other addTerrainSceneNode() method, but takes an IReadFile - pointer as parameter for the heightmap. For more information take a look - at the other function. - \param heightMapFile: The file handle to read vertex data from. This should - be a gray scale bitmap. - \param parent: Parent of the scene node. Can be 0 if no parent. - \param id: Id of the node. This id can be used to identify the scene node. - \param position: The absolute position of this node. - \param rotation: The absolute rotation of this node. ( NOT YET IMPLEMENTED ) - \param scale: The scale factor for the terrain. If you're - using a heightmap of size 129x129 and would like your terrain - to be 12900x12900 in game units, then use a scale factor of ( - core::vector ( 100.0f, 100.0f, 100.0f ). If you use a Y - scaling factor of 0.0f, then your terrain will be flat. - \param vertexColor: The default color of all the vertices. If no texture is associated - with the scene node, then all vertices will be this color. Defaults to white. - \param maxLOD: The maximum LOD (level of detail) for the node. Only change if you - know what you are doing, this might lead to strange behavior. - \param patchSize: patch size of the terrain. Only change if you - know what you are doing, this might lead to strange behavior. - \param smoothFactor: The number of times the vertices are smoothed. - \param addAlsoIfHeightmapEmpty: Add terrain node even with empty heightmap. - \return Pointer to the created scene node. Can be null - if the terrain could not be created, for example because the - heightmap could not be loaded. The returned pointer should - not be dropped. See IReferenceCounted::drop() for more - information. */ - virtual ITerrainSceneNode* addTerrainSceneNode( - io::IReadFile* heightMapFile, - ISceneNode* parent=0, s32 id=-1, - const core::vector3df& position = core::vector3df(0.0f,0.0f,0.0f), - const core::vector3df& rotation = core::vector3df(0.0f,0.0f,0.0f), - const core::vector3df& scale = core::vector3df(1.0f,1.0f,1.0f), - video::SColor vertexColor = video::SColor(255,255,255,255), - s32 maxLOD=5, E_TERRAIN_PATCH_SIZE patchSize=ETPS_17, s32 smoothFactor=0, - bool addAlsoIfHeightmapEmpty = false) = 0; - - //! Adds a quake3 scene node to the scene graph. - /** A Quake3 Scene renders multiple meshes for a specific HighLanguage Shader (Quake3 Style ) - \return Pointer to the quake3 scene node if successful, otherwise NULL. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IMeshSceneNode* addQuake3SceneNode(const IMeshBuffer* meshBuffer, const quake3::IShader * shader, - ISceneNode* parent=0, s32 id=-1 - ) = 0; - - //! Adds an empty scene node to the scene graph. /** Can be used for doing advanced transformations or structuring the scene graph. @@ -880,136 +455,6 @@ namespace scene virtual IDummyTransformationSceneNode* addDummyTransformationSceneNode( ISceneNode* parent=0, s32 id=-1) = 0; - //! Adds a text scene node, which is able to display 2d text at a position in three dimensional space - virtual ITextSceneNode* addTextSceneNode(gui::IGUIFont* font, const wchar_t* text, - video::SColor color=video::SColor(100,255,255,255), - ISceneNode* parent = 0, const core::vector3df& position = core::vector3df(0,0,0), - s32 id=-1) = 0; - - //! Adds a text scene node, which uses billboards. The node, and the text on it, will scale with distance. - /** - \param font The font to use on the billboard. Pass 0 to use the GUI environment's default font. - \param text The text to display on the billboard. - \param parent The billboard's parent. Pass 0 to use the root scene node. - \param size The billboard's width and height. - \param position The billboards position relative to its parent. - \param id: An id of the node. This id can be used to identify the node. - \param colorTop: The color of the vertices at the top of the billboard (default: white). - \param colorBottom: The color of the vertices at the bottom of the billboard (default: white). - \return Pointer to the billboard if successful, otherwise NULL. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IBillboardTextSceneNode* addBillboardTextSceneNode( gui::IGUIFont* font, const wchar_t* text, - ISceneNode* parent = 0, - const core::dimension2d& size = core::dimension2d(10.0f, 10.0f), - const core::vector3df& position = core::vector3df(0,0,0), s32 id=-1, - video::SColor colorTop = 0xFFFFFFFF, video::SColor colorBottom = 0xFFFFFFFF) = 0; - - //! Adds a Hill Plane mesh to the mesh pool. - /** The mesh is generated on the fly - and looks like a plane with some hills on it. It is uses mostly for quick - tests of the engine only. You can specify how many hills there should be - on the plane and how high they should be. Also you must specify a name for - the mesh, because the mesh is added to the mesh pool, and can be retrieved - again using ISceneManager::getMesh() with the name as parameter. - \param name: The name of this mesh which must be specified in order - to be able to retrieve the mesh later with ISceneManager::getMesh(). - \param tileSize: Size of a tile of the mesh. (10.0f, 10.0f) would be a - good value to start, for example. - \param tileCount: Specifies how much tiles there will be. If you specify - for example that a tile has the size (10.0f, 10.0f) and the tileCount is - (10,10), than you get a field of 100 tiles which has the dimension 100.0f x 100.0f. - \param material: Material of the hill mesh. - \param hillHeight: Height of the hills. If you specify a negative value - you will get holes instead of hills. If the height is 0, no hills will be - created. - \param countHills: Amount of hills on the plane. There will be countHills.X - hills along the X axis and countHills.Y along the Y axis. So in total there - will be countHills.X * countHills.Y hills. - \param textureRepeatCount: Defines how often the texture will be repeated in - x and y direction. - return Null if the creation failed. The reason could be that you - specified some invalid parameters or that a mesh with that name already - exists. If successful, a pointer to the mesh is returned. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IAnimatedMesh* addHillPlaneMesh(const io::path& name, - const core::dimension2d& tileSize, const core::dimension2d& tileCount, - video::SMaterial* material = 0, f32 hillHeight = 0.0f, - const core::dimension2d& countHills = core::dimension2d(0.0f, 0.0f), - const core::dimension2d& textureRepeatCount = core::dimension2d(1.0f, 1.0f)) = 0; - - //! Adds a static terrain mesh to the mesh pool. - /** The mesh is generated on the fly - from a texture file and a height map file. Both files may be huge - (8000x8000 pixels would be no problem) because the generator splits the - files into smaller textures if necessary. - You must specify a name for the mesh, because the mesh is added to the mesh pool, - and can be retrieved again using ISceneManager::getMesh() with the name as parameter. - \param meshname: The name of this mesh which must be specified in order - to be able to retrieve the mesh later with ISceneManager::getMesh(). - \param texture: Texture for the terrain. Please note that this is not a - hardware texture as usual (ITexture), but an IImage software texture. - You can load this texture with IVideoDriver::createImageFromFile(). - \param heightmap: A grayscaled heightmap image. Like the texture, - it can be created with IVideoDriver::createImageFromFile(). The amount - of triangles created depends on the size of this texture, so use a small - heightmap to increase rendering speed. - \param stretchSize: Parameter defining how big a is pixel on the heightmap. - \param maxHeight: Defines how high a white pixel on the heightmap is. - \param defaultVertexBlockSize: Defines the initial dimension between vertices. - \return Null if the creation failed. The reason could be that you - specified some invalid parameters, that a mesh with that name already - exists, or that a texture could not be found. If successful, a pointer to the mesh is returned. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IAnimatedMesh* addTerrainMesh(const io::path& meshname, - video::IImage* texture, video::IImage* heightmap, - const core::dimension2d& stretchSize = core::dimension2d(10.0f,10.0f), - f32 maxHeight=200.0f, - const core::dimension2d& defaultVertexBlockSize = core::dimension2d(64,64)) = 0; - - //! add a static arrow mesh to the meshpool - /** \param name Name of the mesh - \param vtxColorCylinder color of the cylinder - \param vtxColorCone color of the cone - \param tesselationCylinder Number of quads the cylinder side consists of - \param tesselationCone Number of triangles the cone's roof consists of - \param height Total height of the arrow - \param cylinderHeight Total height of the cylinder, should be lesser than total height - \param widthCylinder Diameter of the cylinder - \param widthCone Diameter of the cone's base, should be not smaller than the cylinder's diameter - \return Pointer to the arrow mesh if successful, otherwise 0. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IAnimatedMesh* addArrowMesh(const io::path& name, - video::SColor vtxColorCylinder=0xFFFFFFFF, - video::SColor vtxColorCone=0xFFFFFFFF, - u32 tesselationCylinder=4, u32 tesselationCone=8, - f32 height=1.f, f32 cylinderHeight=0.6f, - f32 widthCylinder=0.05f, f32 widthCone=0.3f) = 0; - - //! add a static sphere mesh to the meshpool - /** \param name Name of the mesh - \param radius Radius of the sphere - \param polyCountX Number of quads used for the horizontal tiling - \param polyCountY Number of quads used for the vertical tiling - \return Pointer to the sphere mesh if successful, otherwise 0. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual IAnimatedMesh* addSphereMesh(const io::path& name, - f32 radius=5.f, u32 polyCountX = 16, - u32 polyCountY = 16) = 0; - - //! Add a volume light mesh to the meshpool - /** \param name Name of the mesh - \param SubdivideU Horizontal subdivision count - \param SubdivideV Vertical subdivision count - \param FootColor Color of the bottom of the light - \param TailColor Color of the top of the light - \return Pointer to the volume light mesh if successful, otherwise 0. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. - */ - virtual IAnimatedMesh* addVolumeLightMesh(const io::path& name, - const u32 SubdivideU = 32, const u32 SubdivideV = 32, - const video::SColor FootColor = video::SColor(51, 0, 230, 180), - const video::SColor TailColor = video::SColor(0, 0, 0, 0)) = 0; - //! Gets the root scene node. /** This is the scene node which is parent of all scene nodes. The root scene node is a special scene node which @@ -1070,17 +515,6 @@ namespace scene \param camera: The new camera which should be active. */ virtual void setActiveCamera(ICameraSceneNode* camera) = 0; - //! Sets the color of stencil buffers shadows drawn by the scene manager. - virtual void setShadowColor(video::SColor color = video::SColor(150,0,0,0)) = 0; - - //! Get the current color of shadows. - virtual video::SColor getShadowColor() const = 0; - - //! Create a shadow volume scene node to be used with custom nodes - /** Use this if you implement your own SceneNodes and need shadow volumes in them. - Otherwise you should generally use addShadowVolumeSceneNode functions from IMeshSceneNode or IAnimatedMeshSceneNode.*/ - virtual IShadowVolumeSceneNode* createShadowVolumeSceneNode(const IMesh* shadowMesh, ISceneNode* parent, s32 id, bool zfailmethod, f32 infinity) = 0; - //! Registers a node for rendering it at a specific time. /** This method should only be used by SceneNodes when they get a ISceneNode::OnRegisterSceneNode() call. @@ -1108,254 +542,6 @@ namespace scene by existing scene node animators, culling of scene nodes is done, etc. */ virtual void drawAll() = 0; - //! Creates a rotation animator, which rotates the attached scene node around itself. - /** \param rotationSpeed Specifies the speed of the animation in degree per 10 milliseconds. - \return The animator. Attach it to a scene node with ISceneNode::addAnimator() - and the animator will animate it. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimator* createRotationAnimator(const core::vector3df& rotationSpeed) = 0; - - //! Creates a fly circle animator, which lets the attached scene node fly around a center. - /** \param center: Center of the circle. - \param radius: Radius of the circle. - \param speed: The orbital speed, in radians per millisecond. - \param direction: Specifies the upvector used for alignment of the mesh. - \param startPosition: The position on the circle where the animator will - begin. Value is in multiples of a circle, i.e. 0.5 is half way around. (phase) - \param radiusEllipsoid: if radiusEllipsoid != 0 then radius2 from a ellipsoid - begin. Value is in multiples of a circle, i.e. 0.5 is half way around. (phase) - \return The animator. Attach it to a scene node with ISceneNode::addAnimator() - and the animator will animate it. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimator* createFlyCircleAnimator( - const core::vector3df& center=core::vector3df(0.f,0.f,0.f), - f32 radius=100.f, f32 speed=0.001f, - const core::vector3df& direction=core::vector3df(0.f, 1.f, 0.f), - f32 startPosition = 0.f, - f32 radiusEllipsoid = 0.f) = 0; - - //! Creates a fly straight animator, which lets the attached scene node fly or move along a line between two points. - /** \param startPoint: Start point of the line. - \param endPoint: End point of the line. - \param timeForWay: Time in milliseconds how long the node should need to - move from the start point to the end point. - \param loop: If set to false, the node stops when the end point is reached. - If loop is true, the node begins again at the start. - \param pingpong Flag to set whether the animator should fly - back from end to start again. - \return The animator. Attach it to a scene node with ISceneNode::addAnimator() - and the animator will animate it. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimator* createFlyStraightAnimator(const core::vector3df& startPoint, - const core::vector3df& endPoint, u32 timeForWay, bool loop=false, bool pingpong = false) = 0; - - //! Creates a texture animator, which switches the textures of the target scene node based on a list of textures. - /** \param textures: List of textures to use. - \param timePerFrame: Time in milliseconds, how long any texture in the list - should be visible. - \param loop: If set to to false, the last texture remains set, and the animation - stops. If set to true, the animation restarts with the first texture. - \return The animator. Attach it to a scene node with ISceneNode::addAnimator() - and the animator will animate it. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimator* createTextureAnimator(const core::array& textures, - s32 timePerFrame, bool loop=true) = 0; - - //! Creates a scene node animator, which deletes the scene node after some time automatically. - /** \param timeMs: Time in milliseconds, after when the node will be deleted. - \return The animator. Attach it to a scene node with ISceneNode::addAnimator() - and the animator will animate it. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimator* createDeleteAnimator(u32 timeMs) = 0; - - //! Creates a special scene node animator for doing automatic collision detection and response. - /** See ISceneNodeAnimatorCollisionResponse for details. - \param world: Triangle selector holding all triangles of the world with which - the scene node may collide. You can create a triangle selector with - ISceneManager::createTriangleSelector(); - \param sceneNode: SceneNode which should be manipulated. After you added this animator - to the scene node, the scene node will not be able to move through walls and is - affected by gravity. If you need to teleport the scene node to a new position without - it being effected by the collision geometry, then call sceneNode->setPosition(); then - animator->setTargetNode(sceneNode); - \param ellipsoidRadius: Radius of the ellipsoid with which collision detection and - response is done. If you have got a scene node, and you are unsure about - how big the radius should be, you could use the following code to determine - it: - \code - const core::aabbox3d& box = yourSceneNode->getBoundingBox(); - core::vector3df radius = box.MaxEdge - box.getCenter(); - \endcode - \param gravityPerSecond: Sets the gravity of the environment, as an acceleration in - units per second per second. If your units are equivalent to meters, then - core::vector3df(0,-10.0f,0) would give an approximately realistic gravity. - You can disable gravity by setting it to core::vector3df(0,0,0). - \param ellipsoidTranslation: By default, the ellipsoid for collision detection is created around - the center of the scene node, which means that the ellipsoid surrounds - it completely. If this is not what you want, you may specify a translation - for the ellipsoid. - \param slidingValue: DOCUMENTATION NEEDED. - \return The animator. Attach it to a scene node with ISceneNode::addAnimator() - and the animator will cause it to do collision detection and response. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimatorCollisionResponse* createCollisionResponseAnimator( - ITriangleSelector* world, ISceneNode* sceneNode, - const core::vector3df& ellipsoidRadius = core::vector3df(30,60,30), - const core::vector3df& gravityPerSecond = core::vector3df(0,-10.0f,0), - const core::vector3df& ellipsoidTranslation = core::vector3df(0,0,0), - f32 slidingValue = 0.0005f) = 0; - - //! Creates a follow spline animator. - /** The animator modifies the position of - the attached scene node to make it follow a Hermite spline. - It uses a subset of Hermite splines: either cardinal splines - (tightness != 0.5) or Catmull-Rom-splines (tightness == 0.5). - The animator moves from one control point to the next in - 1/speed seconds. This code was sent in by Matthias Gall. - If you no longer need the animator, you should call ISceneNodeAnimator::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimator* createFollowSplineAnimator(s32 startTime, - const core::array< core::vector3df >& points, - f32 speed = 1.0f, f32 tightness = 0.5f, bool loop=true, bool pingpong=false) = 0; - - //! Creates a simple ITriangleSelector, based on a mesh. - /** Triangle selectors - can be used for doing collision detection. Don't use this selector - for a huge amount of triangles like in Quake3 maps. - Instead, use for example ISceneManager::createOctreeTriangleSelector(). - Please note that the created triangle selector is not automatically attached - to the scene node. You will have to call ISceneNode::setTriangleSelector() - for this. To create and attach a triangle selector is done like this: - \code - ITriangleSelector* s = sceneManager->createTriangleSelector(yourMesh, - yourSceneNode); - yourSceneNode->setTriangleSelector(s); - s->drop(); - \endcode - \param mesh: Mesh of which the triangles are taken. - \param node: Scene node of which transformation is used. - \param separateMeshbuffers: When true it's possible to get information which meshbuffer - got hit in collision tests. But has a slight speed cost. - \return The selector, or null if not successful. - If you no longer need the selector, you should call ITriangleSelector::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ITriangleSelector* createTriangleSelector(IMesh* mesh, ISceneNode* node, bool separateMeshbuffers=false) = 0; - - //! Creates a simple ITriangleSelector, based on a meshbuffer. - /** - This is a static selector which won't update when the mesh changes. - \param meshBuffer Triangles of that meshbuffer are used - \param materialIndex If you pass a material index that index can be returned by the triangle selector. - \para node: Scene node of which transformation is used. - */ - virtual ITriangleSelector* createTriangleSelector(const IMeshBuffer* meshBuffer, irr::u32 materialIndex, ISceneNode* node) = 0; - - //! Creates a simple ITriangleSelector, based on an animated mesh scene node. - /** Details of the mesh associated with the node will be extracted internally. - \param node The animated mesh scene node from which to build the selector - \param separateMeshbuffers: When true it's possible to get information which meshbuffer - got hit in collision tests. But has a slight speed cost. - */ - virtual ITriangleSelector* createTriangleSelector(IAnimatedMeshSceneNode* node, bool separateMeshbuffers=false) = 0; - - - //! Creates a simple dynamic ITriangleSelector, based on a axis aligned bounding box. - /** Triangle selectors - can be used for doing collision detection. Every time when triangles are - queried, the triangle selector gets the bounding box of the scene node, - an creates new triangles. In this way, it works good with animated scene nodes. - \param node: Scene node of which the bounding box, visibility and transformation is used. - \return The selector, or null if not successful. - If you no longer need the selector, you should call ITriangleSelector::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ITriangleSelector* createTriangleSelectorFromBoundingBox(ISceneNode* node) = 0; - - //! Creates a Triangle Selector, optimized by an octree. - /** Triangle selectors - can be used for doing collision detection. This triangle selector is - optimized for huge amounts of triangle, it organizes them in an octree. - Please note that the created triangle selector is not automatically attached - to the scene node. You will have to call ISceneNode::setTriangleSelector() - for this. To create and attach a triangle selector is done like this: - \code - ITriangleSelector* s = sceneManager->createOctreeTriangleSelector(yourMesh, - yourSceneNode); - yourSceneNode->setTriangleSelector(s); - s->drop(); - \endcode - For more information and examples on this, take a look at the collision - tutorial in the SDK. - \param mesh: Mesh of which the triangles are taken. - \param node: Scene node of which visibility and transformation is used. - \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node. - If a node gets less polys than this value, it will not be split into - smaller nodes. - \return The selector, or null if not successful. - If you no longer need the selector, you should call ITriangleSelector::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ITriangleSelector* createOctreeTriangleSelector(IMesh* mesh, - ISceneNode* node, s32 minimalPolysPerNode=32) = 0; - - //! Creates a Triangle Selector for a single meshbuffer, optimized by an octree. - /** Triangle selectors - can be used for doing collision detection. This triangle selector is - optimized for huge amounts of triangle, it organizes them in an octree. - Please note that the created triangle selector is not automatically attached - to the scene node. You will have to call ISceneNode::setTriangleSelector() - for this. To create and attach a triangle selector is done like this: - \code - ITriangleSelector* s = sceneManager->createOctreeTriangleSelector(yourMesh, - yourSceneNode); - yourSceneNode->setTriangleSelector(s); - s->drop(); - \endcode - For more information and examples on this, take a look at the collision - tutorial in the SDK. - \param meshBuffer: Meshbuffer of which the triangles are taken. - \param materialIndex: Setting this value allows the triangle selector to return the material index - \param node: Scene node of which visibility and transformation is used. - \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node. - If a node gets less polys than this value, it will not be split into - smaller nodes. - \return The selector, or null if not successful. - If you no longer need the selector, you should call ITriangleSelector::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ITriangleSelector* createOctreeTriangleSelector(IMeshBuffer* meshBuffer, irr::u32 materialIndex, - ISceneNode* node, s32 minimalPolysPerNode=32) = 0; - - //! //! Creates a Triangle Selector, optimized by an octree. - /** \deprecated Use createOctreeTriangleSelector instead. This method may be removed by Irrlicht 1.9. */ - _IRR_DEPRECATED_ ITriangleSelector* createOctTreeTriangleSelector(IMesh* mesh, - ISceneNode* node, s32 minimalPolysPerNode=32) - { - return createOctreeTriangleSelector(mesh, node, minimalPolysPerNode); - } - - //! Creates a meta triangle selector. - /** A meta triangle selector is nothing more than a - collection of one or more triangle selectors providing together - the interface of one triangle selector. In this way, - collision tests can be done with different triangle soups in one pass. - \return The selector, or null if not successful. - If you no longer need the selector, you should call ITriangleSelector::drop(). - See IReferenceCounted::drop() for more information. */ - virtual IMetaTriangleSelector* createMetaTriangleSelector() = 0; - - //! Creates a triangle selector which can select triangles from a terrain scene node. - /** \param node: Pointer to the created terrain scene node - \param LOD: Level of detail, 0 for highest detail. - \return The selector, or null if not successful. - If you no longer need the selector, you should call ITriangleSelector::drop(). - See IReferenceCounted::drop() for more information. */ - virtual ITriangleSelector* createTerrainTriangleSelector( - ITerrainSceneNode* node, s32 LOD=0) = 0; - //! Adds an external mesh loader for extending the engine with new file formats. /** If you want the engine to be extended with file formats it currently is not able to load (e.g. .cob), just implement @@ -1392,11 +578,6 @@ namespace scene \return A pointer to the specified loader, 0 if the index is incorrect. */ virtual ISceneLoader* getSceneLoader(u32 index) const = 0; - //! Get pointer to the scene collision manager. - /** \return Pointer to the collision manager - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneCollisionManager* getSceneCollisionManager() = 0; - //! Get pointer to the mesh manipulator. /** \return Pointer to the mesh manipulator This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ @@ -1454,42 +635,14 @@ namespace scene This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ virtual ISceneNodeFactory* getSceneNodeFactory(u32 index) = 0; - //! Get the default scene node animator factory which can create all built-in scene node animators - /** \return Pointer to the default scene node animator factory - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimatorFactory* getDefaultSceneNodeAnimatorFactory() = 0; - - //! Adds a scene node animator factory to the scene manager. - /** Use this to extend the scene manager with new scene node animator types which it should be - able to create automatically, for example when loading data from xml files. */ - virtual void registerSceneNodeAnimatorFactory(ISceneNodeAnimatorFactory* factoryToAdd) = 0; - - //! Get amount of registered scene node animator factories. - virtual u32 getRegisteredSceneNodeAnimatorFactoryCount() const = 0; - - //! Get scene node animator factory by index - /** \return Pointer to the requested scene node animator factory, or 0 if it does not exist. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeAnimatorFactory* getSceneNodeAnimatorFactory(u32 index) = 0; - //! Get typename from a scene node type or null if not found virtual const c8* getSceneNodeTypeName(ESCENE_NODE_TYPE type) = 0; - //! Returns a typename from a scene node animator type or null if not found - virtual const c8* getAnimatorTypeName(ESCENE_NODE_ANIMATOR_TYPE type) = 0; - //! Adds a scene node to the scene by name /** \return Pointer to the scene node added by a factory This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ virtual ISceneNode* addSceneNode(const char* sceneNodeTypeName, ISceneNode* parent=0) = 0; - //! creates a scene node animator based on its type name - /** \param typeName: Type of the scene node animator to add. - \param target: Target scene node of the new animator. - \return Returns pointer to the new scene node animator or null if not successful. You need to - drop this pointer after calling this, see IReferenceCounted::drop() for details. */ - virtual ISceneNodeAnimator* createSceneNodeAnimator(const char* typeName, ISceneNode* target=0) = 0; - //! Creates a new scene manager. /** This can be used to easily draw and/or store two independent scenes at the same time. The mesh cache will be @@ -1601,22 +754,12 @@ namespace scene //! Get ambient color of the scene virtual const video::SColorf& getAmbientLight() const = 0; - //! Register a custom callbacks manager which gets callbacks during scene rendering. - /** \param[in] lightManager: the new callbacks manager. You may pass 0 to remove the - current callbacks manager and restore the default behavior. */ - virtual void setLightManager(ILightManager* lightManager) = 0; - //! Get current render pass. virtual E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const =0; //! Set current render pass. virtual void setCurrentRenderPass(E_SCENE_NODE_RENDER_PASS nextPass) =0; - //! Get an instance of a geometry creator. - /** The geometry creator provides some helper methods to create various types of - basic geometry. This can be useful for custom scene nodes. */ - virtual const IGeometryCreator* getGeometryCreator(void) const = 0; - //! Check if node is culled in current view frustum /** Please note that depending on the used culling method this check can be rather coarse, or slow. A positive result is diff --git a/include/ISceneNode.h b/include/ISceneNode.h index 71910276..63d1566b 100644 --- a/include/ISceneNode.h +++ b/include/ISceneNode.h @@ -9,8 +9,6 @@ #include "ESceneNodeTypes.h" #include "ECullingTypes.h" #include "EDebugSceneTypes.h" -#include "ISceneNodeAnimator.h" -#include "ITriangleSelector.h" #include "SMaterial.h" #include "irrString.h" #include "aabbox3d.h" @@ -22,12 +20,11 @@ namespace irr { namespace scene { + class ISceneNode; class ISceneManager; //! Typedef for list of scene nodes typedef core::list ISceneNodeList; - //! Typedef for list of scene node animators - typedef core::list ISceneNodeAnimatorList; //! Scene node interface. /** A scene node is a node in the hierarchical scene graph. Every scene @@ -47,7 +44,7 @@ namespace scene const core::vector3df& rotation = core::vector3df(0,0,0), const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) : RelativeTranslation(position), RelativeRotation(rotation), RelativeScale(scale), - Parent(0), SceneManager(mgr), TriangleSelector(0), ID(id), + Parent(0), SceneManager(mgr), ID(id), AutomaticCullingState(EAC_BOX), DebugDataVisible(EDS_OFF), IsVisible(true), IsDebugObject(false) { @@ -63,14 +60,6 @@ namespace scene { // delete all children removeAll(); - - // delete all animators - ISceneNodeAnimatorList::Iterator ait = Animators.begin(); - for (; ait != Animators.end(); ++ait) - (*ait)->drop(); - - if (TriangleSelector) - TriangleSelector->drop(); } @@ -109,22 +98,6 @@ namespace scene { if (IsVisible) { - // animate this node with all animators - - ISceneNodeAnimatorList::Iterator ait = Animators.begin(); - while (ait != Animators.end()) - { - // continue to the next node before calling animateNode() - // so that the animator may remove itself from the scene - // node without the iterator becoming invalid - ISceneNodeAnimator* anim = *ait; - ++ait; - if ( anim->isEnabled() ) - { - anim->animateNode(this, timeMs); - } - } - // update absolute position updateAbsolutePosition(); @@ -357,58 +330,6 @@ namespace scene } - //! Adds an animator which should animate this node. - /** \param animator A pointer to the new animator. */ - virtual void addAnimator(ISceneNodeAnimator* animator) - { - if (animator) - { - Animators.push_back(animator); - animator->grab(); - } - } - - - //! Get a list of all scene node animators. - /** \return The list of animators attached to this node. */ - const core::list& getAnimators() const - { - return Animators; - } - - - //! Removes an animator from this scene node. - /** If the animator is found, it is also dropped and might be - deleted if not other grab exists for it. - \param animator A pointer to the animator to be deleted. */ - virtual void removeAnimator(ISceneNodeAnimator* animator) - { - ISceneNodeAnimatorList::Iterator it = Animators.begin(); - for (; it != Animators.end(); ++it) - { - if ((*it) == animator) - { - (*it)->drop(); - Animators.erase(it); - return; - } - } - } - - - //! Removes all animators from this scene node. - /** The animators might also be deleted if no other grab exists - for them. */ - virtual void removeAnimators() - { - ISceneNodeAnimatorList::Iterator it = Animators.begin(); - for (; it != Animators.end(); ++it) - (*it)->drop(); - - Animators.clear(); - } - - //! Returns the material based on the zero based index i. /** To get the amount of materials used by this scene node, use getMaterialCount(). This function is needed for inserting the @@ -620,45 +541,6 @@ namespace scene } - //! Returns the triangle selector attached to this scene node. - /** The Selector can be used by the engine for doing collision - detection. You can create a TriangleSelector with - ISceneManager::createTriangleSelector() or - ISceneManager::createOctreeTriangleSelector and set it with - ISceneNode::setTriangleSelector(). If a scene node got no triangle - selector, but collision tests should be done with it, a triangle - selector is created using the bounding box of the scene node. - \return A pointer to the TriangleSelector or 0, if there - is none. */ - virtual ITriangleSelector* getTriangleSelector() const - { - return TriangleSelector; - } - - - //! Sets the triangle selector of the scene node. - /** The Selector can be used by the engine for doing collision - detection. You can create a TriangleSelector with - ISceneManager::createTriangleSelector() or - ISceneManager::createOctreeTriangleSelector(). Some nodes may - create their own selector by default, so it would be good to - check if there is already a selector in this node by calling - ISceneNode::getTriangleSelector(). - \param selector New triangle selector for this scene node. */ - virtual void setTriangleSelector(ITriangleSelector* selector) - { - if (TriangleSelector != selector) - { - if (TriangleSelector) - TriangleSelector->drop(); - - TriangleSelector = selector; - if (TriangleSelector) - TriangleSelector->grab(); - } - } - - //! Updates the absolute position based on the relative and the parents position /** Note: This does not recursively update the parents absolute positions, so if you have a deeper hierarchy you might want to update the parents first.*/ @@ -778,7 +660,6 @@ namespace scene RelativeRotation = toCopyFrom->RelativeRotation; RelativeScale = toCopyFrom->RelativeScale; ID = toCopyFrom->ID; - setTriangleSelector(toCopyFrom->TriangleSelector); AutomaticCullingState = toCopyFrom->AutomaticCullingState; DebugDataVisible = toCopyFrom->DebugDataVisible; IsVisible = toCopyFrom->IsVisible; @@ -794,19 +675,6 @@ namespace scene ISceneNodeList::Iterator it = toCopyFrom->Children.begin(); for (; it != toCopyFrom->Children.end(); ++it) (*it)->clone(this, newManager); - - // clone animators - - ISceneNodeAnimatorList::Iterator ait = toCopyFrom->Animators.begin(); - for (; ait != toCopyFrom->Animators.end(); ++ait) - { - ISceneNodeAnimator* anim = (*ait)->createClone(this, SceneManager); - if (anim) - { - addAnimator(anim); - anim->drop(); - } - } } //! Sets the new scene manager for this node and all children. @@ -841,15 +709,9 @@ namespace scene //! List of all children of this node core::list Children; - //! List of all animator nodes - core::list Animators; - //! Pointer to the scene manager ISceneManager* SceneManager; - //! Pointer to the triangle selector - ITriangleSelector* TriangleSelector; - //! ID of the node. s32 ID; diff --git a/include/ISceneNodeAnimator.h b/include/ISceneNodeAnimator.h deleted file mode 100644 index cdff7009..00000000 --- a/include/ISceneNodeAnimator.h +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SCENE_NODE_ANIMATOR_H_INCLUDED__ -#define __I_SCENE_NODE_ANIMATOR_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "vector3d.h" -#include "ESceneNodeAnimatorTypes.h" -#include "IAttributeExchangingObject.h" -#include "IAttributes.h" -#include "IEventReceiver.h" - -namespace irr -{ -namespace io -{ - class IAttributes; -} // end namespace io -namespace scene -{ - class ISceneNode; - class ISceneManager; - - //! Animates a scene node. Can animate position, rotation, material, and so on. - /** A scene node animator is able to animate a scene node in a very simple way. It may - change its position, rotation, scale and/or material. There are lots of animators - to choose from. You can create scene node animators with the ISceneManager interface. - */ - class ISceneNodeAnimator : public io::IAttributeExchangingObject, public IEventReceiver - { - public: - ISceneNodeAnimator() : IsEnabled(true), PauseTimeSum(0), PauseTimeStart(0), StartTime(0) - { - } - - //! Animates a scene node. - /** \param node Node to animate. - \param timeMs Current time in milliseconds. */ - virtual void animateNode(ISceneNode* node, u32 timeMs) =0; - - //! Creates a clone of this animator. - /** Please note that you will have to drop - (IReferenceCounted::drop()) the returned pointer after calling this. */ - virtual ISceneNodeAnimator* createClone(ISceneNode* node, - ISceneManager* newManager=0) =0; - - //! Returns true if this animator receives events. - /** When attached to an active camera, this animator will be - able to respond to events such as mouse and keyboard events. */ - virtual bool isEventReceiverEnabled() const - { - return false; - } - - //! Event receiver, override this function for camera controlling animators - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_ - { - return false; - } - - //! Returns type of the scene node animator - virtual ESCENE_NODE_ANIMATOR_TYPE getType() const - { - return ESNAT_UNKNOWN; - } - - //! Returns if the animator has finished. - /** This is only valid for non-looping animators with a discrete end state. - \return true if the animator has finished, false if it is still running. */ - virtual bool hasFinished(void) const - { - return false; - } - - //! Reset a time-based movement by changing the starttime. - /** By default most animators start on object creation. - This value is ignored by animators which don't work with a starttime. - Known problems: CSceneNodeAnimatorRotation currently overwrites this value constantly (might be changed in the future). - \param time Commonly you will use irr::ITimer::getTime(). - \param resetPauseTime Reset internal pause time for enabling/diabling animators as well - */ - virtual void setStartTime(u32 time, bool resetPauseTime=true) - { - StartTime = time; - if ( resetPauseTime ) - { - PauseTimeStart = 0; - PauseTimeSum = 0; - } - } - - //! Get the starttime. - /** This will return 0 for by animators which don't work with a starttime unless a starttime was manually set */ - virtual irr::u32 getStartTime() const - { - return StartTime; - } - - //! Sets the enabled state of this element. - /** - \param enabled When set to false ISceneNodes will not update the animator anymore. - Animators themselves usually don't care. So manual calls to animateNode still work. - \param timeNow When set to values > 0 on enabling and disabling an internal timer will be increased by the time disabled time. - Animator decide themselves how to handle that timer, but generally setting it will allow you to pause an animator, so it - will continue at the same position when you enable it again. To use that pass irr::ITimer::getTime() as value. - Animators with no timers will just ignore this. - */ - virtual void setEnabled(bool enabled, u32 timeNow=0) - { - if ( enabled == IsEnabled ) - return; - IsEnabled = enabled; - if ( enabled ) - { - if ( timeNow > 0 && PauseTimeStart > 0 ) - PauseTimeSum += timeNow-PauseTimeStart; - } - else - { - PauseTimeStart = timeNow; - } - } - - virtual bool isEnabled() const - { - return IsEnabled; - } - - //! Writes attributes of the scene node animator. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const _IRR_OVERRIDE_ - { - out->addBool("IsEnabled", IsEnabled); - // timers not serialized as they usually depend on system-time which is different on each application start. - } - - //! Reads attributes of the scene node animator. - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) _IRR_OVERRIDE_ - { - IsEnabled = in->getAttributeAsBool("IsEnabled", IsEnabled); - PauseTimeSum = 0; - PauseTimeStart = 0; - } - - protected: - - /** This method can be used by clone() implementations of - derived classes - \param toCopyFrom The animator from which the values are copied */ - void cloneMembers(const ISceneNodeAnimator* toCopyFrom) - { - IsEnabled = toCopyFrom->IsEnabled; - PauseTimeSum = toCopyFrom->IsEnabled; - PauseTimeStart = toCopyFrom->PauseTimeStart; - StartTime = toCopyFrom->StartTime; - } - - bool IsEnabled; //! Only enabled animators are updated - u32 PauseTimeSum; //! Sum up time which the animator was disabled - u32 PauseTimeStart; //! Last time setEnabled(false) was called with a timer > 0 - u32 StartTime; //! Used by animators which are time-based, ignored otherwise. - }; - - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/ISceneNodeAnimatorCameraFPS.h b/include/ISceneNodeAnimatorCameraFPS.h deleted file mode 100644 index 91a00680..00000000 --- a/include/ISceneNodeAnimatorCameraFPS.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SCENE_NODE_ANIMATOR_CAMERA_FPS_H_INCLUDED__ -#define __I_SCENE_NODE_ANIMATOR_CAMERA_FPS_H_INCLUDED__ - -#include "ISceneNodeAnimator.h" -#include "IEventReceiver.h" -#include "irrArray.h" - -namespace irr -{ - struct SKeyMap; - -namespace scene -{ - - //! Special scene node animator for FPS cameras - /** This scene node animator can be attached to a camera to make it act - like a first person shooter - */ - class ISceneNodeAnimatorCameraFPS : public ISceneNodeAnimator - { - public: - - //! Returns the speed of movement in units per millisecond - virtual f32 getMoveSpeed() const = 0; - - //! Sets the speed of movement in units per millisecond - virtual void setMoveSpeed(f32 moveSpeed) = 0; - - //! Returns the rotation speed when using keyboard - virtual f32 getRotateSpeedKeyboard() const = 0; - - //! Set the rotation speed when using keyboard - virtual void setRotateSpeedKeyboard(f32 rotateSpeed) = 0; - - //! Returns the rotation speed in degrees when using mouse - /** The degrees are equivalent to a half screen movement of the mouse, - i.e. if the mouse cursor had been moved to the border of the screen since - the last animation. */ - virtual f32 getRotateSpeed() const = 0; - - //! Set the rotation speed in degrees when using mouse - virtual void setRotateSpeed(f32 rotateSpeed) = 0; - - //! Sets the keyboard mapping for this animator (old style) - /** \param map Array of keyboard mappings, see irr::SKeyMap - \param count Size of the keyboard map array. */ - virtual void setKeyMap(SKeyMap *map, u32 count) = 0; - - //! Sets the keyboard mapping for this animator - //! \param keymap The new keymap array - virtual void setKeyMap(const core::array& keymap) = 0; - - //! Gets the keyboard mapping for this animator - virtual const core::array& getKeyMap() const = 0; - - //! Sets whether vertical movement should be allowed. - /** If vertical movement is enabled then the camera may fight with - gravity causing camera shake. Disable this if the camera has - a collision animator with gravity enabled. */ - virtual void setVerticalMovement(bool allow) = 0; - - //! Sets whether the Y axis of the mouse should be inverted. - /** If enabled then moving the mouse down will cause - the camera to look up. It is disabled by default. */ - virtual void setInvertMouse(bool invert) = 0; - }; -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/ISceneNodeAnimatorCameraMaya.h b/include/ISceneNodeAnimatorCameraMaya.h deleted file mode 100644 index a1dba263..00000000 --- a/include/ISceneNodeAnimatorCameraMaya.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SCENE_NODE_ANIMATOR_CAMERA_MAYA_H_INCLUDED__ -#define __I_SCENE_NODE_ANIMATOR_CAMERA_MAYA_H_INCLUDED__ - -#include "ISceneNodeAnimator.h" - -namespace irr -{ - -namespace scene -{ - - //! Special scene node animator for Maya-style cameras - /** This scene node animator can be attached to a camera to make it act like a 3d - modeling tool. - The camera is moving relative to the target with the mouse, by pressing either - of the three buttons. - In order to move the camera, set a new target for the camera. The distance defines - the current orbit radius the camera moves on. Distance can be changed via the setter - or by mouse events. - */ - class ISceneNodeAnimatorCameraMaya : public ISceneNodeAnimator - { - public: - - //! Returns the speed of movement - virtual f32 getMoveSpeed() const = 0; - - //! Sets the speed of movement - virtual void setMoveSpeed(f32 moveSpeed) = 0; - - //! Returns the rotation speed - virtual f32 getRotateSpeed() const = 0; - - //! Set the rotation speed - virtual void setRotateSpeed(f32 rotateSpeed) = 0; - - //! Returns the zoom speed - virtual f32 getZoomSpeed() const = 0; - - //! Set the zoom speed - virtual void setZoomSpeed(f32 zoomSpeed) = 0; - - //! Returns the current distance, i.e. orbit radius - virtual f32 getDistance() const = 0; - - //! Set the distance - virtual void setDistance(f32 distance) = 0; - - //! Set the minimal distance to the camera target for zoom - virtual void setTargetMinDistance(f32 minDistance) = 0; - - //! Returns the minimal distance to the camera target for zoom - virtual f32 getTargetMinDistance() const = 0; - - }; - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/ISceneNodeAnimatorCollisionResponse.h b/include/ISceneNodeAnimatorCollisionResponse.h deleted file mode 100644 index 66334127..00000000 --- a/include/ISceneNodeAnimatorCollisionResponse.h +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SCENE_NODE_ANIMATOR_COLLISION_RESPONSE_H_INCLUDED__ -#define __I_SCENE_NODE_ANIMATOR_COLLISION_RESPONSE_H_INCLUDED__ - -#include "ISceneNode.h" - -namespace irr -{ -namespace scene -{ - - class ISceneNodeAnimatorCollisionResponse; - - //! Callback interface for catching events of collisions. - /** Implement this interface and use - ISceneNodeAnimatorCollisionResponse::setCollisionCallback to be able to - be notified if a collision has occurred. - **/ - class ICollisionCallback : public virtual IReferenceCounted - { - public: - - //! Will be called when a collision occurs. - /** See ISceneNodeAnimatorCollisionResponse::setCollisionCallback for more information. - \param animator: Collision response animator in which the collision occurred. You can call - this animator's methods to find the node, collisionPoint and/or collision triangle. - \retval true if the collision was handled in the animator. The animator's target - node will *not* be stopped at the collision point, but will instead move fully - to the location that triggered the collision check. - \retval false if the collision was not handled in the animator. The animator's - target node will be moved to the collision position. - */ - virtual bool onCollision(const ISceneNodeAnimatorCollisionResponse& animator) = 0; - }; - - //! Special scene node animator for doing automatic collision detection and response. - /** This scene node animator can be attached to any single scene node - and will then prevent it from moving through specified collision geometry - (e.g. walls and floors of the) world, as well as having it fall under gravity. - This animator provides a simple implementation of first person shooter cameras. - Attach it to a camera, and the camera will behave as the player control in a - first person shooter game: The camera stops and slides at walls, walks up stairs, - falls down if there is no floor under it, and so on. - - The animator will treat any change in the position of its target scene - node as movement, including a setPosition(), as movement. If you want to - teleport the target scene node manually to a location without it being effected - by collision geometry, then call setTargetNode(node) after calling node->setPosition(). - */ - class ISceneNodeAnimatorCollisionResponse : public ISceneNodeAnimator - { - public: - - //! Destructor - virtual ~ISceneNodeAnimatorCollisionResponse() {} - - //! Check if the attached scene node is falling. - /** Falling means that there is no blocking wall from the scene - node in the direction of the gravity. The implementation of - this method is very fast, no collision detection is done when - invoking it. - \return True if the scene node is falling, false if not. */ - virtual bool isFalling() const = 0; - - //! Sets the radius of the ellipsoid for collision detection and response. - /** If you have a scene node, and you are unsure about how big - the radius should be, you could use the following code to - determine it: - \code - core::aabbox box = yourSceneNode->getBoundingBox(); - core::vector3df radius = box.MaxEdge - box.getCenter(); - \endcode - \param radius: New radius of the ellipsoid. */ - virtual void setEllipsoidRadius(const core::vector3df& radius) = 0; - - //! Returns the radius of the ellipsoid for collision detection and response. - /** \return Radius of the ellipsoid. */ - virtual core::vector3df getEllipsoidRadius() const = 0; - - //! Sets the gravity of the environment. - /** A good example value would be core::vector3df(0,-100.0f,0) - for letting gravity affect all object to fall down. For bigger - gravity, make increase the length of the vector. You can - disable gravity by setting it to core::vector3df(0,0,0); - \param gravity: New gravity vector. */ - virtual void setGravity(const core::vector3df& gravity) = 0; - - //! Get current vector of gravity. - //! \return Gravity vector. */ - virtual core::vector3df getGravity() const = 0; - - //! 'Jump' the animator, by adding a jump speed opposite to its gravity - /** \param jumpSpeed The initial speed of the jump; the velocity will be opposite - to this animator's gravity vector. */ - virtual void jump(f32 jumpSpeed) = 0; - - //! Should the Target react on collision ( default = true ) - virtual void setAnimateTarget ( bool enable ) = 0; - virtual bool getAnimateTarget () const = 0; - - //! Set translation of the collision ellipsoid. - /** By default, the ellipsoid for collision detection is - created around the center of the scene node, which means that - the ellipsoid surrounds it completely. If this is not what you - want, you may specify a translation for the ellipsoid. - \param translation: Translation of the ellipsoid relative - to the position of the scene node. */ - virtual void setEllipsoidTranslation(const core::vector3df &translation) = 0; - - //! Get the translation of the ellipsoid for collision detection. - /** See - ISceneNodeAnimatorCollisionResponse::setEllipsoidTranslation() - for more details. - \return Translation of the ellipsoid relative to the position - of the scene node. */ - virtual core::vector3df getEllipsoidTranslation() const = 0; - - //! Sets a triangle selector holding all triangles of the world with which the scene node may collide. - /** \param newWorld: New triangle selector containing triangles - to let the scene node collide with. */ - virtual void setWorld(ITriangleSelector* newWorld) = 0; - - //! Get the current triangle selector containing all triangles for collision detection. - virtual ITriangleSelector* getWorld() const = 0; - - //! Set the single node that this animator will act on. - /** \param node The new target node. Setting this will force the animator to update - its last target position for the node, allowing setPosition() to teleport - the node through collision geometry. */ - virtual void setTargetNode(ISceneNode * node) = 0; - - //! Gets the single node that this animator is acting on. - /** \return The node that this animator is acting on. */ - virtual ISceneNode* getTargetNode(void) const = 0; - - //! Returns true if a collision occurred during the last animateNode() - virtual bool collisionOccurred() const = 0; - - //! Returns the last point of collision. - virtual const core::vector3df & getCollisionPoint() const = 0; - - //! Returns the last triangle that caused a collision - virtual const core::triangle3df & getCollisionTriangle() const = 0; - - //! Returns the position that the target node will be moved to, unless the collision is consumed in a callback. - /** - If you have a collision callback registered, and it consumes the collision, then the - node will ignore the collision and will not stop at this position. Instead, it will - move fully to the position that caused the collision to occur. */ - virtual const core::vector3df & getCollisionResultPosition(void) const = 0; - - //! Returns the node that was collided with. - virtual ISceneNode* getCollisionNode(void) const = 0; - - //! Sets a callback interface which will be called if a collision occurs. - /** \param callback: collision callback handler that will be called when a collision - occurs. Set this to 0 to disable the callback. - */ - virtual void setCollisionCallback(ICollisionCallback* callback) = 0; - - }; - - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/ISceneNodeAnimatorFactory.h b/include/ISceneNodeAnimatorFactory.h deleted file mode 100644 index a50703f2..00000000 --- a/include/ISceneNodeAnimatorFactory.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SCENE_NODE_ANIMATOR_FACTORY_H_INCLUDED__ -#define __I_SCENE_NODE_ANIMATOR_FACTORY_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "ESceneNodeAnimatorTypes.h" - -namespace irr -{ -namespace scene -{ - class ISceneNode; - class ISceneNodeAnimator; - - //! Interface for dynamic creation of scene node animators - /** To be able to add custom scene node animators to Irrlicht and to make it possible for the - scene manager to save and load those external animators, simply implement this - interface and register it in you scene manager via ISceneManager::registerSceneNodeAnimatorFactory. - Note: When implementing your own scene node factory, don't call ISceneNodeManager::grab() to - increase the reference counter of the scene node manager. This is not necessary because the - scene node manager will grab() the factory anyway, and otherwise cyclic references will - be created and the scene manager and all its nodes won't get deallocated. - */ - class ISceneNodeAnimatorFactory : public virtual IReferenceCounted - { - public: - - //! creates a scene node animator based on its type id - /** \param type: Type of the scene node animator to add. - \param target: Target scene node of the new animator. - \return Returns pointer to the new scene node animator or null if not successful. You need to - drop this pointer after calling this, see IReferenceCounted::drop() for details. */ - virtual ISceneNodeAnimator* createSceneNodeAnimator(ESCENE_NODE_ANIMATOR_TYPE type, ISceneNode* target) = 0; - - //! creates a scene node animator based on its type name - /** \param typeName: Type of the scene node animator to add. - \param target: Target scene node of the new animator. - \return Returns pointer to the new scene node animator or null if not successful. You need to - drop this pointer after calling this, see IReferenceCounted::drop() for details. */ - virtual ISceneNodeAnimator* createSceneNodeAnimator(const c8* typeName, ISceneNode* target) = 0; - - //! returns amount of scene node animator types this factory is able to create - virtual u32 getCreatableSceneNodeAnimatorTypeCount() const = 0; - - //! returns type of a creatable scene node animator type - /** \param idx: Index of scene node animator type in this factory. Must be a value between 0 and - getCreatableSceneNodeTypeCount() */ - virtual ESCENE_NODE_ANIMATOR_TYPE getCreateableSceneNodeAnimatorType(u32 idx) const = 0; - - //! returns type name of a creatable scene node animator type - /** \param idx: Index of scene node animator type in this factory. Must be a value between 0 and - getCreatableSceneNodeAnimatorTypeCount() */ - virtual const c8* getCreateableSceneNodeAnimatorTypeName(u32 idx) const = 0; - - //! returns type name of a creatable scene node animator type - /** \param type: Type of scene node animator. - \return: Returns name of scene node animator type if this factory can create the type, otherwise 0. */ - virtual const c8* getCreateableSceneNodeAnimatorTypeName(ESCENE_NODE_ANIMATOR_TYPE type) const = 0; - }; - - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/IShadowVolumeSceneNode.h b/include/IShadowVolumeSceneNode.h deleted file mode 100644 index f19e6aab..00000000 --- a/include/IShadowVolumeSceneNode.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_SHADOW_VOLUME_SCENE_NODE_H_INCLUDED__ -#define __I_SHADOW_VOLUME_SCENE_NODE_H_INCLUDED__ - -#include "ISceneNode.h" - -namespace irr -{ -namespace scene -{ - class IMesh; - - enum ESHADOWVOLUME_OPTIMIZATION - { - //! Create volumes around every triangle - ESV_NONE, - - //! Create volumes only around the silhouette of the mesh - /** This can reduce the number of volumes drastically, - but will have an upfront-cost where it calculates adjacency of - triangles. Also it will not work with all models. Basically - if you see strange black shadow lines then you have a model - for which it won't work. - We get that information about adjacency by comparing the positions of - all edges in the mesh (even if they are in different meshbuffers). */ - ESV_SILHOUETTE_BY_POS - }; - - //! Scene node for rendering a shadow volume into a stencil buffer. - class IShadowVolumeSceneNode : public ISceneNode - { - public: - - //! constructor - IShadowVolumeSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id) - : ISceneNode(parent, mgr, id) {} - - //! Sets the mesh from which the shadow volume should be generated. - /** To optimize shadow rendering, use a simpler mesh for shadows. - */ - virtual void setShadowMesh(const IMesh* mesh) = 0; - - //! Updates the shadow volumes for current light positions. - virtual void updateShadowVolumes() = 0; - - //! Set optimization used to create shadow volumes - /** Default is ESV_SILHOUETTE_BY_POS. If the shadow - looks bad then give ESV_NONE a try (which will be slower). - Alternatively you can try to fix the model, it's often - because it's not closed (aka if you'd put water in it then - that would leak out). */ - virtual void setOptimization(ESHADOWVOLUME_OPTIMIZATION optimization) = 0; - - //! Get currently active optimization used to create shadow volumes - virtual ESHADOWVOLUME_OPTIMIZATION getOptimization() const = 0; - }; - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/ITerrainSceneNode.h b/include/ITerrainSceneNode.h deleted file mode 100644 index b0c822ce..00000000 --- a/include/ITerrainSceneNode.h +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -// The code for the TerrainSceneNode is based on the terrain renderer by -// Soconne and the GeoMipMapSceneNode developed by Spintz. They made their -// code available for Irrlicht and allowed it to be distributed under this -// licence. I only modified some parts. A lot of thanks go to them. - -#ifndef __I_TERRAIN_SCENE_NODE_H__ -#define __I_TERRAIN_SCENE_NODE_H__ - -#include "ETerrainElements.h" -#include "ISceneNode.h" -#include "IDynamicMeshBuffer.h" -#include "irrArray.h" - -namespace irr -{ -namespace io -{ - class IReadFile; -} // end namespace io -namespace scene -{ - class IMesh; - - //! A scene node for displaying terrain using the geo mip map algorithm. - /** The code for the TerrainSceneNode is based on the Terrain renderer by Soconne and - * the GeoMipMapSceneNode developed by Spintz. They made their code available for Irrlicht - * and allowed it to be distributed under this licence. I only modified some parts. - * A lot of thanks go to them. - * - * This scene node is capable of very quickly loading - * terrains and updating the indices at runtime to enable viewing very large terrains. It uses a - * CLOD (Continuous Level of Detail) algorithm which updates the indices for each patch based on - * a LOD (Level of Detail) which is determined based on a patch's distance from the camera. - * - * The Patch Size of the terrain must always be a size of ( 2^N+1, i.e. 8+1(9), 16+1(17), etc. ). - * The MaxLOD available is directly dependent on the patch size of the terrain. LOD 0 contains all - * of the indices to draw all the triangles at the max detail for a patch. As each LOD goes up by 1 - * the step taken, in generating indices increases by - 2^LOD, so for LOD 1, the step taken is 2, for - * LOD 2, the step taken is 4, LOD 3 - 8, etc. The step can be no larger than the size of the patch, - * so having a LOD of 8, with a patch size of 17, is asking the algorithm to generate indices every - * 2^8 ( 256 ) vertices, which is not possible with a patch size of 17. The maximum LOD for a patch - * size of 17 is 2^4 ( 16 ). So, with a MaxLOD of 5, you'll have LOD 0 ( full detail ), LOD 1 ( every - * 2 vertices ), LOD 2 ( every 4 vertices ), LOD 3 ( every 8 vertices ) and LOD 4 ( every 16 vertices ). - **/ - class ITerrainSceneNode : public ISceneNode - { - public: - //! Constructor - ITerrainSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position = core::vector3df(0.0f, 0.0f, 0.0f), - const core::vector3df& rotation = core::vector3df(0.0f, 0.0f, 0.0f), - const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f) ) - : ISceneNode (parent, mgr, id, position, rotation, scale) {} - - //! Get the bounding box of the terrain. - /** \return The bounding box of the entire terrain. */ - virtual const core::aabbox3d& getBoundingBox() const =0; - - //! Get the bounding box of a patch - /** \return The bounding box of the chosen patch. */ - virtual const core::aabbox3d& getBoundingBox(s32 patchX, s32 patchZ) const =0; - - //! Get the number of indices currently in the meshbuffer - /** \return The index count. */ - virtual u32 getIndexCount() const =0; - - //! Get pointer to the mesh - /** \return Pointer to the mesh. */ - virtual IMesh* getMesh() =0; - - //! Get pointer to the buffer used by the terrain (most users will not need this) - virtual IMeshBuffer* getRenderBuffer() =0; - - - //! Gets the meshbuffer data based on a specified level of detail. - /** \param mb A reference to an IDynamicMeshBuffer object - \param LOD The level of detail you want the indices from. */ - virtual void getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD=0) const =0; - - //! Gets the indices for a specified patch at a specified Level of Detail. - /** \param indices A reference to an array of u32 indices. - \param patchX Patch x coordinate. - \param patchZ Patch z coordinate. - \param LOD The level of detail to get for that patch. If -1, - then get the CurrentLOD. If the CurrentLOD is set to -1, - meaning it's not shown, then it will retrieve the triangles at - the highest LOD (0). - \return Number of indices put into the buffer. */ - virtual s32 getIndicesForPatch(core::array& indices, - s32 patchX, s32 patchZ, s32 LOD=0) =0; - - //! Populates an array with the CurrentLOD of each patch. - /** \param LODs A reference to a core::array to hold the - values - \return Number of elements in the array */ - virtual s32 getCurrentLODOfPatches(core::array& LODs) const =0; - - //! Manually sets the LOD of a patch - /** NOTE: Any values set here are overwritten again in the automatic - recalculations when the camera changes. - \param patchX Patch x coordinate. - \param patchZ Patch z coordinate. - \param LOD The level of detail to set the patch to. */ - virtual void setLODOfPatch(s32 patchX, s32 patchZ, s32 LOD=0) =0; - - //! Get center of terrain. - virtual const core::vector3df& getTerrainCenter() const =0; - - //! Get height of a point of the terrain. - virtual f32 getHeight(f32 x, f32 y) const =0; - - //! Sets the movement camera threshold. - /** It is used to determine when to recalculate - indices for the scene node. The default value is 10.0f. */ - virtual void setCameraMovementDelta(f32 delta) =0; - - //! Sets the rotation camera threshold. - /** It is used to determine when to recalculate - indices for the scene node. The default value is 1.0f. */ - virtual void setCameraRotationDelta(f32 delta) =0; - - //! Sets whether or not the node should dynamically update its associated selector when the geomipmap data changes. - /** \param bVal: Boolean value representing whether or not to update selector dynamically. */ - virtual void setDynamicSelectorUpdate(bool bVal) =0; - - //! Override the default generation of distance thresholds. - /** For determining the LOD a patch is rendered at. If any LOD - is overridden, then the scene node will no longer apply scaling - factors to these values. If you override these distances, and - then apply a scale to the scene node, it is your responsibility - to update the new distances to work best with your new terrain - size. */ - virtual bool overrideLODDistance(s32 LOD, f64 newDistance) =0; - - //! Scales the base texture, similar to makePlanarTextureMapping. - /** \param scale The scaling amount. Values above 1.0 - increase the number of time the texture is drawn on the - terrain. Values below 0 will decrease the number of times the - texture is drawn on the terrain. Using negative values will - flip the texture, as well as still scaling it. - \param scale2 If set to 0 (default value), this will set the - second texture coordinate set to the same values as in the - first set. If this is another value than zero, it will scale - the second texture coordinate set by this value. */ - virtual void scaleTexture(f32 scale = 1.0f, f32 scale2=0.0f) =0; - - //! Initializes the terrain data. Loads the vertices from the heightMapFile. - /** The file must contain a loadable image of the heightmap. The heightmap - must be square. - \param file The file to read the image from. File is not rewinded. - \param vertexColor Color of all vertices. - \param smoothFactor Number of smoothing passes. */ - virtual bool loadHeightMap(io::IReadFile* file, - video::SColor vertexColor=video::SColor(255,255,255,255), - s32 smoothFactor=0) =0; - - //! Initializes the terrain data. Loads the vertices from the heightMapFile. - /** The data is interpreted as (signed) integers of the given bit size or - floats (with 32bits, signed). Allowed bitsizes for integers are - 8, 16, and 32. The heightmap must be square. - \param file The file to read the RAW data from. File is not rewinded. - \param bitsPerPixel Size of data if integers used, for floats always use 32. - \param signedData Whether we use signed or unsigned ints, ignored for floats. - \param floatVals Whether the data is float or int. - \param width Width (and also Height, as it must be square) of the heightmap. Use 0 for autocalculating from the filesize. - \param vertexColor Color of all vertices. - \param smoothFactor Number of smoothing passes. */ - virtual bool loadHeightMapRAW(io::IReadFile* file, s32 bitsPerPixel=16, - bool signedData=false, bool floatVals=false, s32 width=0, - video::SColor vertexColor=video::SColor(255,255,255,255), - s32 smoothFactor=0) =0; - - //! Force node to use a fixed LOD level at the borders of the terrain. - /** This can be useful when several TerrainSceneNodes are connected. - \param borderLOD When >= 0 all patches at the 4 borders will use the - given LOD. When < 0 borders are just regular patches (that's default). */ - virtual void setFixedBorderLOD(irr::s32 borderLOD=0) = 0; - - }; - -} // end namespace scene -} // end namespace irr - - -#endif // __I_TERRAIN_SCENE_NODE_H__ - diff --git a/include/ITextSceneNode.h b/include/ITextSceneNode.h deleted file mode 100644 index 2e12379f..00000000 --- a/include/ITextSceneNode.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_TEXT_SCENE_NODE_H_INCLUDED__ -#define __I_TEXT_SCENE_NODE_H_INCLUDED__ - -#include "ISceneNode.h" - -namespace irr -{ - -namespace gui -{ - class IGUIFont; -} - -namespace scene -{ - -//! A scene node for displaying 2d text at a position in three dimensional space -class ITextSceneNode : public ISceneNode -{ -public: - - //! constructor - ITextSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position = core::vector3df(0,0,0)) - : ISceneNode(parent, mgr, id, position) {} - - //! sets the text string - virtual void setText(const wchar_t* text) = 0; - - //! get the text string - virtual const wchar_t* getText() const = 0; - - //! sets the color of the text - virtual void setTextColor(video::SColor color) = 0; - - //! get the color of the text - virtual video::SColor getTextColor() const = 0; - - //! set the font used to draw the text - virtual void setFont(gui::IGUIFont* font) = 0; - - //! Get the font used to draw the text - virtual gui::IGUIFont* getFont() const = 0; -}; - -} // end namespace scene -} // end namespace irr - - -#endif - diff --git a/include/ITriangleSelector.h b/include/ITriangleSelector.h deleted file mode 100644 index 04aa0467..00000000 --- a/include/ITriangleSelector.h +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_TRIANGLE_SELECTOR_H_INCLUDED__ -#define __I_TRIANGLE_SELECTOR_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "triangle3d.h" -#include "aabbox3d.h" -#include "matrix4.h" -#include "line3d.h" -#include "irrArray.h" - -namespace irr -{ -namespace scene -{ - -class ISceneNode; -class ITriangleSelector; -class IMeshBuffer; - -//! Additional information about the triangle arrays returned by ITriangleSelector::getTriangles -/** ITriangleSelector are free to fill out this information fully, partly or ignore it. - Usually they will try to fill it when they can and set values to 0 otherwise. -*/ -struct SCollisionTriangleRange -{ - SCollisionTriangleRange() - : RangeStart(0), RangeSize(0) - , Selector(0), SceneNode(0) - , MeshBuffer(0), MaterialIndex(0) - {} - - //! Check if this triangle index inside the range - /** - \param triangleIndex Index to an element inside the array of triangles returned by ITriangleSelector::getTriangles - */ - bool isIndexInRange(irr::u32 triangleIndex) const - { - return triangleIndex >= RangeStart && triangleIndex < RangeStart+RangeSize; - } - - //! First index in the returned triangle array for which this struct is valid - irr::u32 RangeStart; - - //! Number of elements in the returned triangle array for which this struct is valid (starting with RangeStart) - irr::u32 RangeSize; - - //! Real selector which contained those triangles (useful when working with MetaTriangleSelector) - ITriangleSelector* Selector; - - //! SceneNode from which the triangles are from - ISceneNode* SceneNode; - - //! Meshbuffer from which the triangles are from - //! Is 0 when the ITriangleSelector doesn't support meshbuffer selection - const IMeshBuffer* MeshBuffer; - - //! Index of selected material in the SceneNode. Usually only valid when MeshBuffer is also set, otherwise always 0 - irr::u32 MaterialIndex; -}; - -//! Interface to return triangles with specific properties. -/** Every ISceneNode may have a triangle selector, available with -ISceneNode::getTriangleSelector() or ISceneManager::createTriangleSelector. -This is used for doing collision detection: For example if you know, that a -collision may have happened in the area between (1,1,1) and (10,10,10), you -can get all triangles of the scene node in this area with the -ITriangleSelector easily and check every triangle if it collided. */ -class ITriangleSelector : public virtual IReferenceCounted -{ -public: - - //! Get amount of all available triangles in this selector - virtual s32 getTriangleCount() const = 0; - - //! Gets the triangles for one associated node. - /** - This returns all triangles for one scene node associated with this - selector. If there is more than one scene node associated (e.g. for - an IMetaTriangleSelector) this this function may be called multiple - times to retrieve all triangles. - \param triangles Array where the resulting triangles will be - written to. - \param arraySize Size of the target array. - \param outTriangleCount: Amount of triangles which have been written - into the array. - \param transform Pointer to matrix for transforming the triangles - before they are returned. Useful for example to scale all triangles - down into an ellipsoid space. - \param useNodeTransform When the selector has a node then transform the - triangles by that node's transformation matrix. - \param outTriangleInfo When a pointer to an array is passed then that - array is filled with additional information about the returned triangles. - One element of SCollisionTriangleRange added for each range of triangles which - has distinguishable information. For example one range per meshbuffer. - */ - virtual void getTriangles(core::triangle3df* triangles, s32 arraySize, - s32& outTriangleCount, const core::matrix4* transform=0, - bool useNodeTransform=true, - irr::core::array* outTriangleInfo=0) const = 0; - - //! Gets the triangles for one associated node which may lie within a specific bounding box. - /** - This returns all triangles for one scene node associated with this - selector. If there is more than one scene node associated (e.g. for - an IMetaTriangleSelector) this this function may be called multiple - times to retrieve all triangles. - - This method will return at least the triangles that intersect the box, - but may return other triangles as well. - \param triangles Array where the resulting triangles will be written - to. - \param arraySize Size of the target array. - \param outTriangleCount Amount of triangles which have been written - into the array. - \param box Only triangles which are in this axis aligned bounding box - will be written into the array. - \param transform Pointer to matrix for transforming the triangles - before they are returned. Useful for example to scale all triangles - down into an ellipsoid space. - \param useNodeTransform When the selector has a node then transform the - triangles by that node's transformation matrix. - \param outTriangleInfo When a pointer to an array is passed then that - array is filled with additional information about the returned triangles. - One element of SCollisionTriangleRange added for each range of triangles which - has distinguishable information. For example one range per meshbuffer. */ - virtual void getTriangles(core::triangle3df* triangles, s32 arraySize, - s32& outTriangleCount, const core::aabbox3d& box, - const core::matrix4* transform=0, bool useNodeTransform=true, - irr::core::array* outTriangleInfo=0) const = 0; - - //! Gets the triangles for one associated node which have or may have contact with a 3d line. - /** - This returns all triangles for one scene node associated with this - selector. If there is more than one scene node associated (e.g. for - an IMetaTriangleSelector) this this function may be called multiple - times to retrieve all triangles. - - Please note that unoptimized triangle selectors also may return - triangles which are not in contact at all with the 3d line. - \param triangles Array where the resulting triangles will be written - to. - \param arraySize Size of the target array. - \param outTriangleCount Amount of triangles which have been written - into the array. - \param line Only triangles which may be in contact with this 3d line - will be written into the array. - \param transform Pointer to matrix for transforming the triangles - before they are returned. Useful for example to scale all triangles - down into an ellipsoid space. - \param useNodeTransform When the selector has a node then transform the - triangles by that node's transformation matrix. - \param outTriangleInfo When a pointer to an array is passed then that - array is filled with additional information about the returned triangles. - One element of SCollisionTriangleRange added for each range of triangles which - has distinguishable information. For example one range per meshbuffer. */ - virtual void getTriangles(core::triangle3df* triangles, s32 arraySize, - s32& outTriangleCount, const core::line3d& line, - const core::matrix4* transform=0, bool useNodeTransform=true, - irr::core::array* outTriangleInfo=0) const = 0; - - //! Get number of TriangleSelectors that are part of this one - /** Only useful for MetaTriangleSelector, others return 1 - */ - virtual u32 getSelectorCount() const = 0; - - //! Get TriangleSelector based on index based on getSelectorCount - /** Only useful for MetaTriangleSelector, others return 'this' or 0 - */ - virtual ITriangleSelector* getSelector(u32 index) = 0; - - //! Get TriangleSelector based on index based on getSelectorCount - /** Only useful for MetaTriangleSelector, others return 'this' or 0 - */ - virtual const ITriangleSelector* getSelector(u32 index) const = 0; - - //! Get scene node associated with a given triangle. - /** With CMetaTriangleSelector-selectors it's possible to find out a node - belonging to a certain triangle index. - NOTE: triangleIndex has nothing to do with the order of triangles returned by getTriangles functions! - So you can _not_ use this function to find out anything about to which node returned triangles belong. - Use STriangleCollisionInfo struct for that. - \param triangleIndex: the index of the triangle for which you want to find. - \return The scene node associated with that triangle. - */ - virtual ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const = 0; -}; - -} // end namespace scene -} // end namespace irr - -#endif diff --git a/include/IVolumeLightSceneNode.h b/include/IVolumeLightSceneNode.h deleted file mode 100644 index d67dff58..00000000 --- a/include/IVolumeLightSceneNode.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h -// -// created by Dean Wadsworth aka Varmint Dec 31 2007 - -#ifndef __I_VOLUME_LIGHT_SCENE_NODE_H_INCLUDED__ -#define __I_VOLUME_LIGHT_SCENE_NODE_H_INCLUDED__ - -#include "ISceneNode.h" - -namespace irr -{ -namespace scene -{ - class IMeshBuffer; - - class IVolumeLightSceneNode : public ISceneNode - { - public: - - //! constructor - IVolumeLightSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, - const core::vector3df& position, - const core::vector3df& rotation, - const core::vector3df& scale) - : ISceneNode(parent, mgr, id, position, rotation, scale) {}; - - //! Returns type of the scene node - virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_VOLUME_LIGHT; } - - //! Sets the number of segments across the U axis - virtual void setSubDivideU(const u32 inU) =0; - - //! Sets the number of segments across the V axis - virtual void setSubDivideV(const u32 inV) =0; - - //! Returns the number of segments across the U axis - virtual u32 getSubDivideU() const =0; - - //! Returns the number of segments across the V axis - virtual u32 getSubDivideV() const =0; - - //! Sets the color of the base of the light - virtual void setFootColor(const video::SColor inColor) =0; - - //! Sets the color of the tip of the light - virtual void setTailColor(const video::SColor inColor) =0; - - //! Returns the color of the base of the light - virtual video::SColor getFootColor() const =0; - - //! Returns the color of the tip of the light - virtual video::SColor getTailColor() const =0; - }; - -} // end namespace scene -} // end namespace irr - -#endif diff --git a/include/IrrCompileConfig.h b/include/IrrCompileConfig.h index ccdeec8e..ac3715f5 100644 --- a/include/IrrCompileConfig.h +++ b/include/IrrCompileConfig.h @@ -190,12 +190,6 @@ If not defined, Windows Multimedia library is used, which offers also broad supp #undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ #endif -//! enabled Direct3D 9 -#define _IRR_COMPILE_WITH_DIRECT3D_9_ -#ifdef NO_IRR_COMPILE_WITH_DIRECT3D_9_ -#undef _IRR_COMPILE_WITH_DIRECT3D_9_ -#endif - #endif //! Define _IRR_COMPILE_WITH_OPENGL_ to compile the Irrlicht engine with OpenGL. @@ -292,21 +286,6 @@ define out. */ -//! Define _IRR_COMPILE_WITH_SOFTWARE_ to compile the Irrlicht engine with software driver -/** If you do not need the software driver, or want to use Burning's Video instead, -comment this define out */ -//#define _IRR_COMPILE_WITH_SOFTWARE_ -#ifdef NO_IRR_COMPILE_WITH_SOFTWARE_ -#undef _IRR_COMPILE_WITH_SOFTWARE_ -#endif - -//! Define _IRR_COMPILE_WITH_BURNINGSVIDEO_ to compile the Irrlicht engine with Burning's video driver -/** If you do not need this software driver, you can comment this define out. */ -//#define _IRR_COMPILE_WITH_BURNINGSVIDEO_ -#ifdef NO_IRR_COMPILE_WITH_BURNINGSVIDEO_ -#undef _IRR_COMPILE_WITH_BURNINGSVIDEO_ -#endif - //! Define _IRR_COMPILE_WITH_X11_ to compile the Irrlicht engine with X11 support. /** If you do not wish the engine to be compiled with X11, comment this define out. */ @@ -351,13 +330,6 @@ you will not be able to use anything provided by the GUI Environment, including #undef _IRR_COMPILE_WITH_GUI_ #endif -//! Define _IRR_COMPILE_WITH_PARTICLES to compile the engine the withe build-in particle system -/** You can disable this if you don't need particles or use an external particle system. */ -#define _IRR_COMPILE_WITH_PARTICLES_ -#ifdef NO_IRR_COMPILE_WITH_PARTICLES_ -#undef _IRR_COMPILE_WITH_PARTICLES_ -#endif - //! Define _IRR_WCHAR_FILESYSTEM to enable unicode filesystem support for the engine. /** This enables the engine to read/write from unicode filesystem. If you disable this feature, the engine behave as before (ansi). This is currently only supported @@ -432,69 +404,9 @@ tool . */ 16Bit + SubPixel/SubTexel Correct + ZBuffer */ -#define BURNINGVIDEO_RENDERER_BEAUTIFUL -//#define BURNINGVIDEO_RENDERER_FAST -//#define BURNINGVIDEO_RENDERER_ULTRA_FAST -//#define BURNINGVIDEO_RENDERER_CE - //! Uncomment the following line if you want to ignore the deprecated warnings //#define IGNORE_DEPRECATED_WARNING -//! Define _IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ to support ShadowVolumes -#define _IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ -#undef _IRR_COMPILE_WITH_SHADOW_VOLUME_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_OCTREE_SCENENODE_ to support OctreeSceneNodes -#define _IRR_COMPILE_WITH_OCTREE_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_OCTREE_SCENENODE_ -#undef _IRR_COMPILE_WITH_OCTREE_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_TERRAIN_SCENENODE_ to support TerrainSceneNodes -#define _IRR_COMPILE_WITH_TERRAIN_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_TERRAIN_SCENENODE_ -#undef _IRR_COMPILE_WITH_TERRAIN_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ to support BillboardSceneNodes -#define _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ -#undef _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_WATER_SURFACE_SCENENODE_ to support WaterSurfaceSceneNodes -#define _IRR_COMPILE_WITH_WATER_SURFACE_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_WATER_SURFACE_SCENENODE_ -#undef _IRR_COMPILE_WITH_WATER_SURFACE_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_SKYDOME_SCENENODE_ to support SkydomeSceneNodes -#define _IRR_COMPILE_WITH_SKYDOME_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_SKYDOME_SCENENODE_ -#undef _IRR_COMPILE_WITH_SKYDOME_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_CUBE_SCENENODE_ to support CubeSceneNodes -#define _IRR_COMPILE_WITH_CUBE_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_CUBE_SCENENODE_ -#undef _IRR_COMPILE_WITH_CUBE_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_SPHERE_SCENENODE_ to support CubeSceneNodes -#define _IRR_COMPILE_WITH_SPHERE_SCENENODE_ -#ifdef NO_IRR_COMPILE_WITH_SPHERE_SCENENODE_ -#undef _IRR_COMPILE_WITH_SPHERE_SCENENODE_ -#endif - -//! Define _IRR_COMPILE_WITH_IRR_SCENE_LOADER_ if you want to be able to load -/** .irr scenes using ISceneManager::loadScene */ -#define _IRR_COMPILE_WITH_IRR_SCENE_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_IRR_SCENE_LOADER_ -#undef _IRR_COMPILE_WITH_IRR_SCENE_LOADER_ -#endif - //! Define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ if you want to use bone based /** animated meshes. If you compile without this, you will be unable to load B3D, MS3D or X meshes */ @@ -509,119 +421,18 @@ B3D, MS3D or X meshes */ #ifdef NO_IRR_COMPILE_WITH_B3D_LOADER_ #undef _IRR_COMPILE_WITH_B3D_LOADER_ #endif -//! Define _IRR_COMPILE_WITH_MS3D_LOADER_ if you want to Milkshape files -#define _IRR_COMPILE_WITH_MS3D_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_MS3D_LOADER_ -#undef _IRR_COMPILE_WITH_MS3D_LOADER_ -#endif //! Define _IRR_COMPILE_WITH_X_LOADER_ if you want to use Microsoft X files #define _IRR_COMPILE_WITH_X_LOADER_ #ifdef NO_IRR_COMPILE_WITH_X_LOADER_ #undef _IRR_COMPILE_WITH_X_LOADER_ #endif -//! Define _IRR_COMPILE_WITH_OGRE_LOADER_ if you want to load Ogre 3D files -#define _IRR_COMPILE_WITH_OGRE_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_OGRE_LOADER_ -#undef _IRR_COMPILE_WITH_OGRE_LOADER_ -#endif #endif // _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ -//! Define _IRR_COMPILE_WITH_HALFLIFE_LOADER_ if you want to load Halflife animated files -#define _IRR_COMPILE_WITH_HALFLIFE_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_HALFLIFE_LOADER_ -#undef _IRR_COMPILE_WITH_HALFLIFE_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_MD2_LOADER_ if you want to load Quake 2 animated files -#define _IRR_COMPILE_WITH_MD2_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_MD2_LOADER_ -#undef _IRR_COMPILE_WITH_MD2_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_MD3_LOADER_ if you want to load Quake 3 animated files -#define _IRR_COMPILE_WITH_MD3_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_MD3_LOADER_ -#undef _IRR_COMPILE_WITH_MD3_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_3DS_LOADER_ if you want to load 3D Studio Max files -#define _IRR_COMPILE_WITH_3DS_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_3DS_LOADER_ -#undef _IRR_COMPILE_WITH_3DS_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_CSM_LOADER_ if you want to load Cartography Shop files -#define _IRR_COMPILE_WITH_CSM_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_CSM_LOADER_ -#undef _IRR_COMPILE_WITH_CSM_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_BSP_LOADER_ if you want to load Quake 3 BSP files -#define _IRR_COMPILE_WITH_BSP_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_BSP_LOADER_ -#undef _IRR_COMPILE_WITH_BSP_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_DMF_LOADER_ if you want to load DeleD files -#define _IRR_COMPILE_WITH_DMF_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_DMF_LOADER_ -#undef _IRR_COMPILE_WITH_DMF_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_LMTS_LOADER_ if you want to load LMTools files -#define _IRR_COMPILE_WITH_LMTS_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_LMTS_LOADER_ -#undef _IRR_COMPILE_WITH_LMTS_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_MY3D_LOADER_ if you want to load MY3D files -#define _IRR_COMPILE_WITH_MY3D_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_MY3D_LOADER_ -#undef _IRR_COMPILE_WITH_MY3D_LOADER_ -#endif //! Define _IRR_COMPILE_WITH_OBJ_LOADER_ if you want to load Wavefront OBJ files #define _IRR_COMPILE_WITH_OBJ_LOADER_ #ifdef NO_IRR_COMPILE_WITH_OBJ_LOADER_ #undef _IRR_COMPILE_WITH_OBJ_LOADER_ #endif -//! Define _IRR_COMPILE_WITH_OCT_LOADER_ if you want to load FSRad OCT files -#define _IRR_COMPILE_WITH_OCT_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_OCT_LOADER_ -#undef _IRR_COMPILE_WITH_OCT_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_LWO_LOADER_ if you want to load Lightwave3D files -#define _IRR_COMPILE_WITH_LWO_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_LWO_LOADER_ -#undef _IRR_COMPILE_WITH_LWO_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_STL_LOADER_ if you want to load stereolithography files -#define _IRR_COMPILE_WITH_STL_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_STL_LOADER_ -#undef _IRR_COMPILE_WITH_STL_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_PLY_LOADER_ if you want to load Polygon (Stanford Triangle) files -#define _IRR_COMPILE_WITH_PLY_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_PLY_LOADER_ -#undef _IRR_COMPILE_WITH_PLY_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_SMF_LOADER_ if you want to load 3D World Studio mesh files -#define _IRR_COMPILE_WITH_SMF_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_SMF_LOADER_ -#undef _IRR_COMPILE_WITH_SMF_LOADER_ -#endif - -//! Define _IRR_COMPILE_WITH_STL_WRITER_ if you want to write .stl files -#define _IRR_COMPILE_WITH_STL_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_STL_WRITER_ -#undef _IRR_COMPILE_WITH_STL_WRITER_ -#endif -//! Define _IRR_COMPILE_WITH_OBJ_WRITER_ if you want to write .obj files -#define _IRR_COMPILE_WITH_OBJ_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_OBJ_WRITER_ -#undef _IRR_COMPILE_WITH_OBJ_WRITER_ -#endif -//! Define _IRR_COMPILE_WITH_PLY_WRITER_ if you want to write .ply files -#define _IRR_COMPILE_WITH_PLY_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_PLY_WRITER_ -#undef _IRR_COMPILE_WITH_PLY_WRITER_ -#endif -//! Define _IRR_COMPILE_WITH_B3D_WRITER_ if you want to write .b3d files -#define _IRR_COMPILE_WITH_B3D_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_B3D_WRITER_ -#undef _IRR_COMPILE_WITH_B3D_WRITER_ -#endif //! Define _IRR_COMPILE_WITH_BMP_LOADER_ if you want to load .bmp files //! Disabling this loader will also disable the built-in font @@ -634,107 +445,22 @@ B3D, MS3D or X meshes */ #ifdef NO_IRR_COMPILE_WITH_JPG_LOADER_ #undef _IRR_COMPILE_WITH_JPG_LOADER_ #endif -//! Define _IRR_COMPILE_WITH_PCX_LOADER_ if you want to load .pcx files -#define _IRR_COMPILE_WITH_PCX_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_PCX_LOADER_ -#undef _IRR_COMPILE_WITH_PCX_LOADER_ -#endif //! Define _IRR_COMPILE_WITH_PNG_LOADER_ if you want to load .png files #define _IRR_COMPILE_WITH_PNG_LOADER_ #ifdef NO_IRR_COMPILE_WITH_PNG_LOADER_ #undef _IRR_COMPILE_WITH_PNG_LOADER_ #endif -//! Define _IRR_COMPILE_WITH_PPM_LOADER_ if you want to load .ppm/.pgm/.pbm files -#define _IRR_COMPILE_WITH_PPM_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_PPM_LOADER_ -#undef _IRR_COMPILE_WITH_PPM_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_PSD_LOADER_ if you want to load .psd files -#define _IRR_COMPILE_WITH_PSD_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_PSD_LOADER_ -#undef _IRR_COMPILE_WITH_PSD_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_PVR_LOADER_ if you want to load .pvr files -#define _IRR_COMPILE_WITH_PVR_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_PVR_LOADER_ -#undef _IRR_COMPILE_WITH_PVR_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_DDS_LOADER_ if you want to load compressed .dds files -// Patent problem isn't related to this loader. -#define _IRR_COMPILE_WITH_DDS_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_DDS_LOADER_ -#undef _IRR_COMPILE_WITH_DDS_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_DDS_DECODER_LOADER_ if you want to load .dds files -//! loader will decompress these files and will send to the memory as uncompressed files. -// Outcommented because -// a) it doesn't compile on 64-bit currently -// b) anyone enabling it should be aware that S3TC compression algorithm which might be used in that loader -// is patented in the US by S3 and they do collect license fees when it's used in applications. -// So if you are unfortunate enough to develop applications for US market and their broken patent system be careful. -// #define _IRR_COMPILE_WITH_DDS_DECODER_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_DDS_DECODER_LOADER_ -#undef _IRR_COMPILE_WITH_DDS_DECODER_LOADER_ -#endif -#ifdef _IRR_COMPILE_WITH_DDS_DECODER_LOADER_ -#undef _IRR_COMPILE_WITH_DDS_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_TGA_LOADER_ if you want to load .tga files -#define _IRR_COMPILE_WITH_TGA_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_TGA_LOADER_ -#undef _IRR_COMPILE_WITH_TGA_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_WAL_LOADER_ if you want to load .wal files -#define _IRR_COMPILE_WITH_WAL_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_WAL_LOADER_ -#undef _IRR_COMPILE_WITH_WAL_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_LMP_LOADER_ if you want to load .lmp files -#define _IRR_COMPILE_WITH_LMP_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_LMP_LOADER_ -#undef _IRR_COMPILE_WITH_LMP_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_RGB_LOADER_ if you want to load Silicon Graphics .rgb/.rgba/.sgi/.int/.inta/.bw files -#define _IRR_COMPILE_WITH_RGB_LOADER_ -#ifdef NO_IRR_COMPILE_WITH_RGB_LOADER_ -#undef _IRR_COMPILE_WITH_RGB_LOADER_ -#endif -//! Define _IRR_COMPILE_WITH_BMP_WRITER_ if you want to write .bmp files -#define _IRR_COMPILE_WITH_BMP_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_BMP_WRITER_ -#undef _IRR_COMPILE_WITH_BMP_WRITER_ -#endif //! Define _IRR_COMPILE_WITH_JPG_WRITER_ if you want to write .jpg files #define _IRR_COMPILE_WITH_JPG_WRITER_ #ifdef NO_IRR_COMPILE_WITH_JPG_WRITER_ #undef _IRR_COMPILE_WITH_JPG_WRITER_ #endif -//! Define _IRR_COMPILE_WITH_PCX_WRITER_ if you want to write .pcx files -#define _IRR_COMPILE_WITH_PCX_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_PCX_WRITER_ -#undef _IRR_COMPILE_WITH_PCX_WRITER_ -#endif //! Define _IRR_COMPILE_WITH_PNG_WRITER_ if you want to write .png files #define _IRR_COMPILE_WITH_PNG_WRITER_ #ifdef NO_IRR_COMPILE_WITH_PNG_WRITER_ #undef _IRR_COMPILE_WITH_PNG_WRITER_ #endif -//! Define _IRR_COMPILE_WITH_PPM_WRITER_ if you want to write .ppm files -#define _IRR_COMPILE_WITH_PPM_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_PPM_WRITER_ -#undef _IRR_COMPILE_WITH_PPM_WRITER_ -#endif -//! Define _IRR_COMPILE_WITH_PSD_WRITER_ if you want to write .psd files -#define _IRR_COMPILE_WITH_PSD_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_PSD_WRITER_ -#undef _IRR_COMPILE_WITH_PSD_WRITER_ -#endif -//! Define _IRR_COMPILE_WITH_TGA_WRITER_ if you want to write .tga files -#define _IRR_COMPILE_WITH_TGA_WRITER_ -#ifdef NO_IRR_COMPILE_WITH_TGA_WRITER_ -#undef _IRR_COMPILE_WITH_TGA_WRITER_ -#endif //! Define __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ if you want to open ZIP and GZIP archives /** ZIP reading has several more options below to configure. */ @@ -758,26 +484,6 @@ ones. */ #ifdef NO__IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ #undef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ #endif -//! Define __IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_ if you want to open ID software PAK archives -#define __IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_ -#ifdef NO__IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_ -#undef __IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_ -#endif -//! Define __IRR_COMPILE_WITH_NPK_ARCHIVE_LOADER_ if you want to open Nebula Device NPK archives -#define __IRR_COMPILE_WITH_NPK_ARCHIVE_LOADER_ -#ifdef NO__IRR_COMPILE_WITH_NPK_ARCHIVE_LOADER_ -#undef __IRR_COMPILE_WITH_NPK_ARCHIVE_LOADER_ -#endif -//! Define __IRR_COMPILE_WITH_TAR_ARCHIVE_LOADER_ if you want to open TAR archives -#define __IRR_COMPILE_WITH_TAR_ARCHIVE_LOADER_ -#ifdef NO__IRR_COMPILE_WITH_TAR_ARCHIVE_LOADER_ -#undef __IRR_COMPILE_WITH_TAR_ARCHIVE_LOADER_ -#endif -//! Define __IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_ if you want to open WAD archives -#define __IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_ -#ifdef NO__IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_ -#undef __IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_ -#endif // Some cleanup and standard stuff diff --git a/include/SMaterial.h b/include/SMaterial.h index b70a7df5..295cfbd0 100644 --- a/include/SMaterial.h +++ b/include/SMaterial.h @@ -368,20 +368,7 @@ namespace video The specular color of the dynamic lights (SLight::SpecularColor) will influence the the highlight color too, but they are set to a useful value by default when - creating the light scene node. Here is a simple example on how - to use specular highlights: - \code - // load and display mesh - scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( - smgr->getMesh("data/faerie.md2")); - node->setMaterialTexture(0, driver->getTexture("data/Faerie2.pcx")); // set diffuse texture - node->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting - node->getMaterial(0).Shininess = 20.0f; // set size of specular highlights - - // add white light - scene::ILightSceneNode* light = smgr->addLightSceneNode(0, - core::vector3df(5,5,5), video::SColorf(1.0f, 1.0f, 1.0f)); - \endcode */ + creating the light scene node.*/ f32 Shininess; //! Free parameter, dependent on the material type. diff --git a/include/irrlicht.h b/include/irrlicht.h index 62ded3c0..ea82b621 100644 --- a/include/irrlicht.h +++ b/include/irrlicht.h @@ -49,19 +49,16 @@ #include "EMaterialTypes.h" #include "EMeshWriterEnums.h" #include "EMessageBoxFlags.h" -#include "ESceneNodeAnimatorTypes.h" +// #include "ESceneNodeAnimatorTypes.h" #include "ESceneNodeTypes.h" #include "ETerrainElements.h" #include "fast_atof.h" #include "heapsort.h" #include "IAnimatedMesh.h" -#include "IAnimatedMeshMD2.h" -#include "IAnimatedMeshMD3.h" #include "IAnimatedMeshSceneNode.h" #include "IAttributeExchangingObject.h" #include "IAttributes.h" #include "IBillboardSceneNode.h" -#include "IBillboardTextSceneNode.h" #include "IBoneSceneNode.h" #include "ICameraSceneNode.h" #include "IContextManager.h" @@ -71,7 +68,6 @@ #include "IEventReceiver.h" #include "IFileList.h" #include "IFileSystem.h" -#include "IGeometryCreator.h" #include "IGPUProgrammingServices.h" #include "IGUIButton.h" #include "IGUICheckBox.h" @@ -104,7 +100,6 @@ #include "IImageLoader.h" #include "IImageWriter.h" #include "IIndexBuffer.h" -#include "ILightSceneNode.h" #include "ILogger.h" #include "IMaterialRenderer.h" #include "IMaterialRendererServices.h" @@ -115,12 +110,7 @@ #include "IMeshManipulator.h" #include "IMeshSceneNode.h" #include "IMeshWriter.h" -#include "IOctreeSceneNode.h" -#include "IMetaTriangleSelector.h" #include "IOSOperator.h" -#include "IParticleSystemSceneNode.h" // also includes all emitters and attractors -#include "IQ3LevelMesh.h" -#include "IQ3Shader.h" #include "IReadFile.h" #include "IReferenceCounted.h" #include "irrArray.h" @@ -133,31 +123,19 @@ #include "irrString.h" #include "irrTypes.h" #include "path.h" -#include "ISceneCollisionManager.h" #include "ISceneLoader.h" #include "ISceneManager.h" #include "ISceneNode.h" -#include "ISceneNodeAnimator.h" -#include "ISceneNodeAnimatorCameraFPS.h" -#include "ISceneNodeAnimatorCameraMaya.h" -#include "ISceneNodeAnimatorCollisionResponse.h" -#include "ISceneNodeAnimatorFactory.h" #include "ISceneNodeFactory.h" #include "ISceneUserDataSerializer.h" #include "IShaderConstantSetCallBack.h" -#include "IShadowVolumeSceneNode.h" #include "ISkinnedMesh.h" -#include "ITerrainSceneNode.h" -#include "ITextSceneNode.h" #include "ITexture.h" #include "ITimer.h" -#include "ITriangleSelector.h" #include "IVertexBuffer.h" #include "IVideoDriver.h" #include "IVideoModeList.h" -#include "IVolumeLightSceneNode.h" #include "IWriteFile.h" -#include "ILightManager.h" #include "Keycodes.h" #include "line2d.h" #include "line3d.h" diff --git a/media/2ddemo.png b/media/2ddemo.png deleted file mode 100644 index 5084114ec2ced3a7b2c7e039bb7ad8532c7af46f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44217 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 diff --git a/media/Faerie5.BMP b/media/Faerie5.BMP deleted file mode 100644 index 2a85c5a0e4dc5c88d6ec8aa5c394294913354327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43538 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

MSh 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

%*vS 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

T_eJ0}v?=AyDiH!2&^aww=;hYXeOM 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�#5`WmgRvauuNJK{Vi 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 z zaz$Iv#QTVSdB^9)v{ks*%{jqCbnk{~oXYES@c*ZIaQwfXgDA>JzUx&=(W|OHJV!mx z9-cnP%Ds@0k(QQKe(~@GMfiY@YDR!jpp9mSPI^P0wm3cJd`cQ5yg=U$l~*CqVwk#qv3 zygZo2&%dR8A{v>b^H5mwHtzwa!gvN#uM!RDd)q4go2=)4z_JSGd4ilzL9~Vzj)7N4 zA92UV=v(b1=fGjH%P5c3!}nwF%K~$P0Y6Hn1HRV3n5t=Lq1Q8&_53$C$XWdVN|tb6 zN#NbQ%LE<~Ua7ZC{-gGSKR;>j`SMdRPg)5Q*~Z|X#>X_f_!ZHq`E3pI`U7hPwv_mv zLVMK`(&=#*X4%f0Epe9nV_grdMZbPA?wbiC&lS=$CwU*jvQgib*JM1D{Tb6@CfIanm#;-z98~+UpjKK z7DTb7I?!(07kZsj@x}i6Ti}&49w{t^5xEQCk(Iw+X=y6rgL~@^MDpO0C^u9G!z>CD z)49U+b_0#^%>J7DKjg~&E|51?c%p=6!ft&QYmb_4D=?W>O&;-jgbF=7E2VA-_&)7? zvX?{k<~-1MdT_hNW4hs#<-P0MraZ`&YYI=4b9R@PpVWWDEx_j7WZGW1|3zxo&N5D> zN2DMN>#29v>M`c#b!$~1p4^F`u-+vaoMV$|kNVY_XPme#p!CBuR|DL} z$K-X+5ox8PA05SudlbDn@srKC?ffP>3JM4hEkd^mha8lF(10QCz7H50?G^)Km`DPJo^J!f zVuNH{R|zKB8CDbrcMh~O`pHht&5d&&*`syYVN1#OzqEAA9!d0UsDt1x0g*whKggQF zQvp6ou9%{;>Ax7gsDCr)OA;chZ_O*^* z{yw=TaZT;De5TQ;os(iZ1 zt+0f@N`nUYb!z^Adz5?CBKGAkunBiK7d^xw3|t|)d(Fs zz?^d8VPI}T@VGu6=B6yYCw1u;5wSyq8=n(jO)_!_A2R;PgFH&ZxhvkCpyB>t^83z- zV~p7hO-S*3wX+?AmZ-3%0ohNKw>2UpQI_ZnarC3;KrDT|OuA9II;Q3s7YVof&#V9d z%<_2JZUh>X3ezDdK0Vs7Klbms{F&zA(MSxHg=@^AcBHVg269PZ27{dU5q+$adyY`R2oc(3FOtc^UZm%u+ zI7f*FG(BvM4jd`tGs@X`y$7iTsA7y8d$NolVSOv5yIxEyh~oNbm!WTu`8YlF%|O5u zy4Wk9H>*Uk5(L(ZWzb2EdPwuBlPet&D`}34h03lu1Df9n``s%PK zqwVW=28Qkii6JEhq*HK6X#oLg>F$;sy1TnOq(MrQZjf#yq(KxxLExKvy}#!>^9;}X z=e&n=_Bng)z1C{JYYXGM}*dPN}yft!xD z$eku$Zfo0ToBitI1mD_yM_%bbdZlc{xA;X>MaIi; z_AduHQvd5xPP_T^5qo=liOV0oapckD@3Xgn7BVXKv=pUaJ+kMWm)OM~FmT?>e>i#%?Rm~(f+x=Ek1V$u!QzjV3t1B@?Jk+{*X_LmR zFZ2xgvujPWw7#eOeQPe7+Nwv4aQqdBS*GOutmf%3?=7;(pBdtN=5Sjgb23XZcs3JV zJU^_wD4_|Vsie_5<^0@2@XQ$l48fkv@%>v@YB7qSPB zgCvtkkja=v2-NHtuY7<(O^=gEtY$Bi3F?3m0(W?CW(ko;I1|88JXerT&?C#vN6dAo zLVT^Xj*>F>u@B~V%OR#(3ZUse!B88a9%Pe*q0Uv@CgIZ?=Pf} zjCtBkA*nVGTas+t=SUG6$H|2FFdFm#SNy3Irrd+ia6!3}IP3q3{Bp}{;z_Sdcl&1X zsdi8EXKHCao$5TXUW(codFCrSoJ7cw_khJtsGhjY%YwEk5UoX?-mdpkTVDV1m92nL z`v@L-iYS4_(W@GQRE#ha2(iYx=1E&kQL|`dB9o6f1`D)0+yxuY2WnphHR4T;O509S zmV;x4Qeo^vyoAxPNECF6q_S9~%z{uAm|sFe60s2oPh*faHB%PLP-!6wOdkWPBO9V- z;wuez264cj!0Pmc8_!fnan(DP$>gzTZNV%|?(b(!-W8MZR#y7(cqlK<+di>n_RU#{ zra~TvdKNkrJ0E#SgJi8778LTLAJK5BVcQWehwNXtwkyxKee(2r_!_`N;G8{q*D3In z^z+4k!#v;|cxLuoz;1{Rhwtnmi)V1HCxwS+xZ5@3fW@wFdmwE*vE<1dx1RxW!NM1Wcz+p;(!q~Vvvq>DG^wi{gcBg-G-j84vj$tHqgX|so_0WT#(~N5-oo8N|RVU*Zv+`4*UhMZyL4pLs``}r( zh-!UoY|bYpI-H7Faky8Vp-Ew=I>st8O0(Q?;8+rLIU-?H;$#OnJQ8kcTQ_aEvWS;B(Jwx#BFB~|4V8wls>($wch=}? zbyCy^pE%8msK*&2<}@Czo7GU&qZiQ{#*%bCbl1`SDeu{%?AEYAUkq23Jpp36!zxluoWM_Wttywxd<{wVC}L zy7)G1-mQ?$D(@@D2&Gj%8&)uWG#Ji>PDpyRNNdMD&}A4tticF|vgV^b)3$??1}kh} znVRaxApimnNmR{r0V6mJYOWh}j-teCvmQKBYmDgT6T4_=(J^2Bj;W$kB!5(1_N`z~ z&MJ8qGBcLjF#07BkD2oaZkHE5W?8>{`f|qw@9gy> zu!`{hXFtb!5xTqkWvyNU$G-vw)av3$KY7c&QP+3t`>3hcOE*M2XZ12svVW1NP|hY< zz+HcUXGd7n}M#s+AVxI@``<7Rnh0p#>f3 z0Kf@UuL83lX<=Eybc!(xyK($c8xiW*YIj|LMMz3G7+u}!VJkb|8Kx&d*!LMt8uu5{ z>CrY!xa|0a&uS_JJ4e)_5B(7z$;KIwh;?cUdCnER(s#MJ1VE#;O)%+-SjII=p&Zt}!Fbr0{_lY|?vmTUXakmtbC;-?~ zHg=r5;Wb7DrB<}TkW@O77(oe!40vW)r*RTs<+_k7<*HL5yV~GVCC{#O{zti}`Tux@ z7;s=+U}IT*Y9Q z_gWzqTD8PD3sAG(!3m8?@jV6!lj4$bT?!QVFV4zy~fwQ$&*!O*7naM`D zukYtq49_0z!5;{pw;I!Yd?x>Nqxo&y+Ux}xqxS3F{W#pfycE9g1Ir=rK5p?(6UoQb z8VY*FtCe8FSfk^jQVZiVq_L|BbsBM9br}H$xkTspq*Nh6xuzI}QBpS43iE^hagrklIBzONUSIh(=bYBnK@q?Tz6;}gq^g4t4wl0g-Kt>Sa$^Gf}z9w zp*3VjFn9o*<0ue=yj-fymm3?hd;a{5>VocT6f8IW)N_cFeWcuR$ za_`$ei{xOocXmU6nGfVUY1gh5?LPUujUESBTq=mr!KgFXFm^baR9Onz6C7hR1jTAA02ImSb5X*Gg=GYj zWCCKeXFE?dwD{Sh>#8Z1Bk5TMO()$!5{edmsK}x>WavyU$HnG>Za{;`_>|9u>)=)F zYev^ze|)j=VDiifP(&CrY%qpnj*GSJQBD3LE$0?4 zBYc9*sHB6K7i|GksC}NnGAj!X?ju-R07C&3_Ud9n0*L!(0w5{XGLbb_(gZ;pyU>Ir zLw;f+Pz)8d5ki9#>cQdaatI8-l)me|XFcK+sovRFHyFkP4YfdId&a(ITT+y!YW5~< z<7tavmf~P7L=bor%FJ5V$}$#fxkqccV=R&(3w;anrFVhDnk+iz4hv6+6CQ_%C$9F(i2S{?VH*RKUdyggi=V<`>BJgYBDXWX*cPeht29+h`B@vrM~0dk5mRT}GB^8%mW}v~#(A?Hn#_A4 zQrJYzmbxZ=8)zI1W}33Ag*~scXWWNu2qcv_S)ovC<7cx^<99xBFWRGkwWLONeX1D#|tF7>?!#D?EqsJrV%J$%K`A3 zN@R!KPC8k7wXJ2#Xf=H~sS=8G16<9%23O}N5TL}V7k=xch6P(i9zj{(9)m0)WF92V zhR945l8}TJL)TkUH)8VNl>qb&?N!^*NiZi^0gFfRKWz% zFEFc>_Wmp+a}-Xz6}FE9=DuK$HODH!Frc!f5Egodj2wP8uLYD+pOzeWIBe)nQ^)g(CZ`$BUv?IUid z3dY~|wE#WqnpUcb-nceL6-KRpJe6(fhr2&bB6rF6;Z<%2`vPvag;s%W=ap+imKWQ4 zXO46<-Vx-Un;$%eQ>V2TMvC^{7B$~QYUW2&DV4Sq*s>S)3LCGoOP%<+JA_~AdGMhU z{;cmubx634YPsW_%8louL0H33CH-NRk@4MnvZifu<}v0F$e z7K6e1Qm(a$iy?vtZVem?1Rz2Hp1t20^ITEfA%cX4NHQBicE}4%9b0ZP1li{unTZxK4NCuEd4vAQGI;o z!B>q;=Qu?Aw$yTYX}~(Hzu|0ddL>)9KkC&13-}+P{(bV{1Kk;!$+b=O?E8dOZ=Z*H zBKO4dHMt(bi%d?k{!P;Y!=ZXlvHRivzdr0qdIV2nDPc$NImsLXvtUq>~LDsZ8TN`u-?Wq~5-XEwg@CZ?um49rcaqyVlf%zcCEsZg;FDd;r>s^HAf zXbgg*+UQ%yK1bhXPm`A|EGi-OP-7{^YSZGBGk{h*Xhl@dvZ(>I;{v&=H;>!uE>bfW zj^f`<9?%tslOBZtIB%nUzgMK5)3MjTt9AzlfSsfEF~EFrLu+!lrET>S)ugb}7T0q- zm`4?MZO-Hd-=dqDotCFj^+1Qk7PjvP*sYRytBmC3NAC?;7n^q+5tpU0^Zv9vNHy~FH z0LA=Xel|y}yvKFjPTv5TjdNBhmwE$U3?j6WbWT*1BHc7vFEaZxg>+pkMhGrrI&D`P zH2n7EYrNl{t$3+3kCM9EH*&w4U1g>YJX3h$=DmGjZ6Uf5c_MOly(Pz9|GF+CkKJ$1 z>V>9DZ`!;3dRp6Ez55k+S7IJF{g?8Kf9ItXVDkVc(WPImtK*q?5D<|C9yW-L`Oz{=18I{O{16Dz>VLx zejn><)(Da%&gBxvY|RIuVU-@%tgPbf#ws~0$=M3JC_KFHO|1+`8u_?+ z^(rZ@{vPQ?GCgcpr{o%^Dw`l! zpg-sPHt?6soi}?eQQ+`dr%T2ly%tAv^d+?pbsg*G$Thf-+aQ-ioE!sboxGv*-dJ7Z zi_U}$@lq{U6>8X}JfVGYqL!37UbKe#$d|7WT?%{ZWsJNU67I@SZdUGV9RgEaaj5nl zkxdK=Q!ND40t0j7qM46E5u{4AaD=p3(7bRkn(3f`jva`{xTcMiLr=Cul2ogtGP>0o z4(ZMDfQ9|R9}9xt)ck5GoeosqM_dTr7ZCg{aVY4esq@a(`TOsF-M6;s_gi6A`=V#1 z#QenZ>fwFd`p1lT@ul7eJ@>?YU%IYtBR2!R{DPtV*ZDr6v*Q|T3M@{s|C?sV`)npgS$YE(;Ds79FA{n$WmrNC&?f4IwS@pR@!j4r*S)>ph^`Dc$icZzL>|EBRV?3N&< zhc(g6CfuD*5{9xU1)iwW(s)Loxw>az((Fo)V&n7a|qo@P_T$d(=}wOA`^Eg>nNku1l3u6X(Edo)UlZOSg7Fu{Z|Hn z+876%$ru6C0<^)g>T4tEIvRQ;L|WW+(Q+lh9JcCFniU@2bsmw{KyUVca&&Y~7SvnA z+6W%P$FGZ3Az^POqFfVfpXZV|72`#`O0m?)A$%{7t@c$Mx*B3!)B1 zYqI;oYjW7i+#v(TqO6i{j3WuffPXWuvILpDMCA-(;#iIG(yQXI&&Q8FD9^AnT>kC|I4X@<0G#&f~^oIb8%byr$a3^TthOB9eID(-snsGTM5 zIn%C4xWAQ=71ZDUOI6c$5Q&o`2b|)|RmyGq4SBzIdIkzUu^LFbg7JK-(r~)B`EvH? z08@Q!IW#%%kH@+|f?bWisJl+!Uf%t^N(NJQLF!}Lsf5G0Cqm>?^kIj$_*y1+Ep@2q zsN>ByBBb?qWadN>TPiD)Cj}(b1decKi=w0~l2n*fqkPF48ZW7gw8!Tc9MFs4oply|A~9fVkX?s;F>D>)6!82Q>-QjC;E#S1;V6Yfd9CiR+0 z`|<)7@WE6_LRpOR_BF55jVw(!&NC$F#=cLT_=@_er!VdkzEcZD&m1u!bLcN}e`(7#+U)R9Mk$3#9tTUU8DKJDR>Cwd7sF`8~NiAlp zDQIZ8=qx9*E%pVVBYHBk7{^p`Nbx2C{;&t+!4kIKRYS}jlBK6bcJEpm)X$R)5=zP_;ZqA9-*?=^rb7_S7d2M#b4C&VhKVW7>L2T(ct1^HBtps z!YJOc&rFScb(RxMfJAp3cllBvvQrE33u*OL^nkJ-UTC=3?=!gBQ}?UHp+?p7UjxcE zN=WNvv(p)m)5c6zqf>tjCD)SM3ud>h@djb*lwszR)jw%#kd=M|2@2mgmIt?2dcG?D zm@9PtIZmnR)hYgpnS-)W_Z_Tk4Cl@KFMD;yn4NO(Eac^ghYQ)%5+p#CT*aTNJuUA=>P@7D0FU@8d}bbpoSGe3DnHiIuh-D zwYwuNi^4!+f~a6J9rQ#|ooui@ijlAVUJx-xU6kUA;YK-}EHB>WFj}@HF`}}wE$v6_ z5rOHNw!TWMsnfxqO^-MDotPkOU^6BT0lB}B%rfS=v83V8I{S!pR%URLh@!>HyE(&; z02_O@)Zza`S5ig$win#~46BNu&(9WB{an$z&MA&v(LoG{3o1 z9A*%hMPo#1uX>UUH^FRhCBI0wrt{o#vkwn&%P787uw2PP%g^yxmN|JrVj(%RWGdiX zbT4E*KdH0b|JVQPadR)UH#JJ8aA;B&|Q%eVo578(*quJbv7{b9fc_N}W7(<^lbgLTiRY z?o>LAx4nZw9phSU&z*udPleHqdR<_$R%dpU! zXQI~HRsD1LD0H(iLq#tx9~Y_pj2^g0*k8$Uw%9A9ZP?>_>YXZ23SL0i!g$!P(Bo)0$8p*e*gOo~3LWzjGxyz{}g`0DVaaAyuKSh7xB%0f|4q~k@>%{3m zvg`{RDTC;_b&3;_c_oH!6A6N_QJMoIIP%jzBnTA`M;L;q9Nr|#AAd}hL3pUmmHr72 zE{6j3SLy34SCsk0t)R?{qLyLmbGlTyc|CS)x@S_D{5{@P(e3sCBoXn%4VW{k4G#2Z4^$ zo$x;ejJ~_c@3~J;ch35G0#>@-T`ab=8(Uc59oO=iXIBgqEToJVdnshDI=%l&A<#W< z5srbagl8G~v^oD)oETPI2bmih2V~zt;BN#4OjweYl_}r~4yooFcZYbt(i9Z74i0}| z!%}TDO7~kW7*|H9DACEX@i0f>sI$Ejz%WJY&d|W#te(fWP1Vyt=6ES#g?K% z3mtH9%DeCD1QLs6jY){%^TAp+vZmiPMjJ77>_}or##BDkvb?OeF{6;%fpv+&{u5=>Dh%}k;P$yV7o~MM%`_ZJx@xs^cPJ}CO2incNVCLvEYXs zmEysJgmM^0qkhdNW_4tOf-SW!{V`_oN4)&5b-tOo*@fGa06ZtcynlQzM9rrYDi+_D z{*42IMY%5?hpHO4l$8C%{JI_r9!{ce%oB2Xe*9&wJF8alk$S=R^OtToMSgREsL^wc zboI7li>k!@s1K!pdV6DHJdyNx3G38XXMzO+tC?F&K(hj!*KZ7S61=S&F~pizR_k}h zL(%loyp;GwEjN8X|3Vq+;V?y#!W(q_J}92W8zED$0THU1l(jU9u9ruwPPcr*R&+tH zY`JFJqa*&|LR|ac+Iy61LFI=i4 z)f}kS?3R%&nwTW#)B^$eIh=)|za@1Eyc;!f6)PX%Yz+-gxBF4$x`bysH6LsC>^eRN z`xh9^x3%W|OXEXNZXWKRH%hI)^ZhPKo4ezFqlTQ((t^t#yF&>BFnNhqbJT% zHVJKj(DTOcYQDizyxKO{K&8OO;gW=LlvnI??JV<}GoTc6l8v;X-)4vynp1pPoA}nBq>lwWWT!b}orFXalLzJGc(`Mppp)W% zFDe)r_8;ws9qbx{Ctug#m<4zQ_8Z^aHBiRg{!i5-^>2&BiGY>RdMmAj-dqpeIdM*0 z!P;+c9je*Ay>A2NPFsIH*!aa9g_^%vduQi%F;lH<5S9@(l8{E9K7(`+;HWWsac4!{ zwzR=BI0!)(7au_UPUwj|jCd{hIqZ-+8!Uowa1nANDv$Fa;Y+^jhr!;!0T2uK(ndtI#$yOs{6$!AVsVv^1O>e_7**ndy z%Z7*wabL?1bcx5fvD%i?%W+%o2F4u&@q?|(D#6n7p*|T?gM?IP^UjbGIvCAr?{LiFONJJ1(Y>^u=4`;Cxjhpb)P0BE< zq6#!EJh%F~SMM9PDAT6jX*TR!9Gz_%+;{c_y7W@xPv+}$dSjiHRB^jdn|7^~`)b@t zeh7*X`=Kh45O?XkIlOW%{+=l6j2ppu&s{)sK~ptw1jjNdg@ zYXOFVDXo8^I=3!IZd_dm3PvTWv_3JmZBBu+nw#qvqLD_1**wLn<r%^KKA*%1d~Ch6^0!p!#A> z?*3o&;g-9Z%+%+Mv$_~~|1j@w;A{O5_}iUa8=XRO=KOCM8}loizAW8_ha|T@=6@En z$uh)X51Zk$=P1#sVE$KfpPN%fudQutu;CIt1c{o9>|~WU%TyRu>9{M&Xx3T8xw|?NtUxSV z*AG!dCI15t=>BP2{6|<)9C>CtEfwBTGa?N$I35`vIgv~ZC{hlB76}_rBVhw>q_M_H zdS*bEI$nzYvtLD~AAN;~9!}vqG-WRyx!SXPoj(Nnogo19Wv6C@-|~BLrb>Xoq{$k}XbY zI~Ib-ewp;)xzh0*S4PS?#+q_aGOA zp+#%U$!g=rIWF`)7ceV`6MFSzssXX(fJn1TKjA^*&5D z8^IHjw4rZj_PILdpNzo7~%yF90gwz`K~ z;nT2DXfsywFrNGI* zy6H?lpO4dpWyaYY&YQFS$AM`hx|fYh{z?vq6s}$gHs`BTs%J2tkM};Rjk?OR0y}NZ zLPewfZw>;wKM2<|M1&2-dqoXgkENKu-<8=Y$wpSFdhpLG$MqleCo|RU@|at;4a+v% z)s6Kou2$-3(ksw}S=wWMS`=i_N=9x|@1QxaB!!xLDj#Xq@CxJkq}xc5kx~PIO4!0F z2L)Z&jq-bZzi3L@kx`O+}&t9kVSRo7(pc> zvvW6VK6ND!L(??#CF_gSOZ^sg1E!5RkrJ8cu4!3wzBpl$jk2Ifh{n+NOuMnJ7@73c z7cz#R`p>>zdgGR%!(9i~bo@<%f;#+t|nbRJkd`&AfK5Ie$KuS2nL>JGKPN75*So0w z!J4fq$nYA!nC*I|Ty)g`=f+}eyla1Bz(NYwirU1dhZk)=jH!7>HnnNW4V6edZ|)B% zmzgp-G`5zA$?TZOMvwo(z*i}O)K+G`mBa>pSxxrqvCY1?IDCCP*Y$u6T4Cov^&JeT zuWK<~3ScCdu{drCNvHuBAt7u-d%WB6t!Z|AHFifU`1LKlPepa+1MIg?P0%HSF;s# zmLV>Uu7XaJ3YX?$A+zrFYdzm|%CGVDp128-oqaY>8@N05^%DAxWjB3%g5PSuwWM(@ z{%ZUr+Z{NjXZTx9pu>_1bM~s6&qik=6uB7VdWR9Bu>J8bjA$FpwaP54Pum`F7kTUa z_KPY2jR>j|6bpaE8%gzG&wySZweGupR$YpB7@zwJkQDsjk~qEfT>m7=2iKoze!iI7 z((eDRbz(uB1U5az<}5HNilV}-Vqvwmfr4MfqWbDn?!0)H<#N>G^q%vfdQ($9Ukaoe z)@|^uj8bb?{o93;A8l`d*Ba-c6xOC_*}B;85L;{#&t^Hl(07II+wm#-aB9Ab?&r=q z0r7aPZC%j+PRs9tOj<#Y1geyXg^_R9brRVd1s>k1!lxO(D+~p`KjeHkb70SQnf{=# zE^+tWl{4zwClAtB(;H7S7@zyU|6O`cf+yRiplv7(AFd=@av|S~Qnc(JFl#Fnd7vxe ziloSFT7TumNZ%2Qs`EK+ZG1JR>~nlTG@EIz2vdz{&=0M#q91QrA_lB$OGhT)FTk!o zEiDND;Mvj(Pb)j$z;fub?MlaI`*8*J4H@DK{is@+NsC%md~ge?xyeINA)SFk^i)tb z^NRZeb(3SUn_A-+7!W?Su@|&Obs*C++-4~~+P)IVUzRCBtEY6YN#BJGyb`r_KNznt zaleGRw?7$td5Fy%)E;R!oxt$rOQok#* z!;sdNB;FtDHSYXjJC)g)&%&er=43=_Ac0gas}Jb_qj0oQ~GxSJh8RmkjWq ze(kImV9PW-FRrZT8cH7EEPrO*6XCEznB`}ZlHbA5(xCL zAXbvR?`jST{>*9jm~~IQ+ar=FgL52j4$U8TiuB(t5V+?v6!i7IyK+hQ@95j?VJrX4 z_I_{hCih2PPdXZn_@o~(Ks!^H_eoGr2UL$`m=tF9#-pM=?Gbbi#i z9n*eK+_2xC{0}U;SMkMt)Kbl`d%xHCShD;uo`#;|zdE-k{daYIlr#C>>G4{&v%ab9 zl=ICiMwq=g;|fVQWlb6=|}3SVAQjIWyBd-f-yejmtO!sKwxy#}BW+uY~V zf1COe=Vfq@OrpKdyKHb9G3`%nS}I#nIjdr^*dvylh{P5lA7ptW{S+o>d1NxUG~^tz ztfs5^EUo+-Xqm^Ox>8pBtT;WZN5-+H$kS!oLT4xBugFHZU#ykHsF=1s_@PE+hi@Ph z56|^%;gi*O6amplCo8%ii$-rgqEN3}@xENbt3wKo{bw-wQMefj-M?P@y{uL9XV2(im64hGg}(8r$r5D@^9TBDVQCCn_ugk&i{~av;CEhVq4J}de+Eb+2lLY$ zeAb2WFC>nOe}2Ec^N9jz*A@;LHKkFg3Wr<;e1}_PVH$Gx|H*Ps=Mo%hzv<7C{7Y9T zma-6tQxm6|pX6)z0&1b+b4@<{zz7lJCbde3RLw2XFQk1)mLj);@i! z*i_K57jY(Jrq8q~Y8;Idli1(8uYHoQso0iTHWhA?YVaP1iwb*Zl`4KZK?OQe;bSA` zs>jC#U{v6NwY+MW5y>X<`TQl88cCSNHf^>~09GM>IClzb5Vx5XN`EvJ z4yp}L-|He`oD2I~Hcw_VJ8UWq)1OJt{p^o$@GLl;HnFd@+MizU`sYR?31Jf5c@umS zm|8UMt#3lMjyzcPNGhKV1^BmG9r?$Pj!YX2PepOAlyDFX8PB_uqvc9A6yW^*_ARX6 z>tF9-=yvs!wb^a6$8?KQ<`5wb$I z%nVgHRxTXe$^cF@HoKSgJCM{lDd+E;(FWAuU?50zk&icdsD_eN^krzAh!1I7Rv||C z9SOn9P`Ni8G`wlt40H=~`%93HF1><9ho-Zb@k$gWFm0{j00(_W0}1-9t#$zLz3<^Pj_Vth2 zt#Rq2ziPSlesAS5vxrvrekl+*i_yJ)7GTga1(KHgA)b^Mnz^`LRO4IzBk3n+@16a; zEhbk*2L4-d?B=wJWUQ^0gX3sd-C&t=t-Mc*5DA5VyIS{>helkxUrL$b)lGGWsO1C@ zV}3xd9|UkVf~>QGa0oz9vtkW(+>Ur7Vs;F|XomHy$iq3HuXa{>WfmR^0??0{AhU5} zfL<#CM8f=rjG_Sz1jxLG00cNdXW$TMM!gdYtVSxDjcRjtUS}<8%t`G37FHL61(+mf zF*LjPuAyI-22@74(GVaOh-h=`PV=5^XECSW9GxZZ&6ga)2c-k~ z99UE`pL4sFc7|N>Tkz=Tw0If)RwrIc(;s_N&TjbaV#AQERMx*^LGTA}&t`|s(u|mW z2P%AQ42}22e8kNBgmEtz@cKBXYWD$~`A!|sx5#Zmjohi}8C-UK-!*!nXI<{FDp+VS6Mi<>N_R8g1|1_U8#1+}DvE>Dn7z z?K-=aef-c$si3P+@>}B_n4Ya{Or@ndu$FJxvuBly=~R&o4dd3Ccv6mJ zmdO)!o=<_gli4UCpTtq3HY+FKukFeRgFO}i1Pv0;#|4_DC=P9E>5-%+FrtTu2S^8i zArk~opQ0k7wD}M$pYF>E)_+O>HpVD{L)pkqz97AaIU=wa zZJKW(yg^3wB`=BuNP>L2P9#5MdF}}g3p0F;;VcN?&-(9L12)>oHx8|J@Ymgx1peev z1a@5fb+;7}&PpG5h?gCU9mWouoc%c*+Vs%XseC$mz1s@Zqs(f zcp1MaX}(_VJiW3U$}o~*${+1LJ`Ex&j~&fbwA?e1zS@n-4hfCC{`eA4%cY2b{Kxuz zPQi1=Ka2EgvnVRFS=L{xW>n?l`eUpns)d(SP#WmcxJ2ceASmZAH&g(#lL6$Rtrl7n z6l$Mk3J{!V@<6rMQJ}1=ARsj;6eI-!wqvb9Fgq9;0!xw!@Hzwt(`3%-=<%lTh<%A% zW<`#>B}a-{9I=6ioL{#bxtO>`Peh3Q;%>#RFekAZx7$?YxWp=)UALO@gYc(}JB)cM zw*Jp5$HtGQw(Hzp^sGQwaf0Li1pThY!*fo1jdx?^*`o)Hk%?q_B*94g0~u;qON$>B zD1j5K$+y-}A^Z8N|J&Hd_OshY$lxiZXW~=4V~UB4YkMP-GR8@fRrjRx4_R)rVnlm~ z)ne=BwNa?c8Hdd5sNZ8@q1VsALsN84E%d6~#D%Y35Dsm;GMOXk5d7LGT) zIQS*gs-i&{zia^cxT$Ig!4pCd+`qVlM{4Q5;tFV+lEOtH2nDvak>v489{{!XK#vMY zFWN;@>_HVFknOR=kp$xPKyY}~G$OQEd*g_JuuC~Pl;+Tb!uc7CHlQp*1`W>jaq#iUzws2$v#7aR&-e&xwHQ{-1}{`so*9nk?)egcSm(QJe=F}`}2K`z9`3w@Q( z0_ejUnE_iF@eV5LD%D2V zSjip&>GLQKz$BNofQf3NVC_mV5UduC<7tfoT|+VpBpZWM`fNc^0X+yd#-W@sM#zY8 zA9%B-?l<4DtbPo9bCBgW@B5$@R)>RM`vS@Q<$9j$R;R~Www3RHLK||7*s0##{>-m` zR1m#ypK#pT^uE1fqz};l_@@nf?!&~NulqE34dS*b0^}?2{P+@#mSvfn49;tbFsrKh zji_4qA?37wsy|A87jrTtCdI^f))w0Cqbq zfLlAz5m=9YhK<#y@)Vj~N7G$os(XI14newf1H9>4xNjs$;-KlMfc^XEMeSw>DtENL zXwY`ZFcnR;ga?^LDHIf7C-9pCnYm$g)G7Yva8R|@=u_d3d4TOv66MgXk#g?^Z271E z3%qLfn{sP&E%hJ0N~JeOM4bM#ti-Cke|0N2C+^91cILhITu0=a|4Du&N123D-);|& z_}Gp`zE0rIuT68>n(3cVLVq9eHs+mCnA)=`41A?pn^ggC3$~#*2>XNNQ5zl4>Subb{bL13mZn+)ez-jA{G| z8wSBOvkJ;-N+3{5kOk^HWW_+II05V+SdHD!sXn`m3f;vcLNJT*2v*FVWU&GR*@%|D8B`fL5>|3``@_J zmM0gA8{8d<)I^F0j#1d9r#~3&w#7I*K44if20o=mpYK2l^_Zme8>=~^5lmcLJt2wI`}1XK7Y8x2fXRPY zd3s5pHn9OaQ-h;nqX0OqN6|r7`+jLS2vZv(L>Uz)LhcPV(79s^BqxFi-gq#8LMs+( zKx#aEy4ip+7#N_!1R8e14d(xksJ9G@a&N!Cuc5m^x&)-V5g59=ySrOJUEcO7fX|@BM#%%nRlP2M2TU&2_Hxv!Z|*-&s%CAJHO|Vqsm-5A!LGcA~zW z8K95c!hcsZL1qk`Yng3K+jaX_U*gYVY7|<*bu5h;nHd3ajthSxl(WRi zK3{DbF{Z!!VkXKhXY859%N?OEj$=Dp!;KE3Vct9ssB%`3Re;dPm+`2SDL(3JfjKUW zT2m>HDB4%35so~`;#_4ZtO!*K>$ct#O49-Uz)D zcbZx3{|qLeDNoqr`atDHJgd`hWJ&Yeh9JLQZnj z`N2CN#6@2V5Y6lkq@y?FGg9~9YOvpr%F%jI4k5LFe&{#A{Iu}dJoB3mCO2LwmGK#$rNM*6OdgyxAwmI{`wX&}*r1^>0|pwPIBdRZQVDDx8{7F z0bcccP@v8|YNbBCUUp-DdxO9jl0XEObEHDdcLn=hd*tcjcU;Y?%0e(iESWO8FrWNX z=E*k$hUBTt_yeE1JmD6t0pHe!SsL;WBU=*&OdG+FwjyP~e9P!n9z=gl^a#qIgl!<8 zOgSlo0iSFLBY|TN%mB(x7>I1+9Wo%b#0`Yh{nctD0lqCI19)R|fGHz4;Cwy}%J*kh z1CGXt<4^!2E$Bg9y7~a{V3%eY5Tg>>C4>h<^>Zz-D`zB3V2slb?6oj;aBcIh&PQ_F zQpkE^&Gv7@rmg1FUckSbqRw@(&X7g+7L{bg$A;4J-vKt`LuA5Zu-m5MkS8o?c$(+O zr&DMY)V7wLeLA_s_eU}ci(!kiUa6CX)(2~jLTF@yisy7j@ z$D?7R=nwe?2#ZU9%o+mlZf14iRD1Ej__(T2tkytN#kal7*KudhxP*w-In?D_h*R-a z*Zal33D&B@@`dAOr>ZsUe!fof)o*$yBaBQIgs1h}ST+G>ZuHl-;m^-Dttmwj#RYCH z6z-BZA!C-QktIUSqHUx-y9$p!&4p%j>+sR}ec_fm_%ml>5g>3Lf%=aVs=rLApGzL) zs;v-YL+T!=STb`WEYKmnwFwy+EvHX5Nnu={D z%Wm1nu(05;U=TJRueSO_A zd!LZ^?W3*PXXsBiG?2AVl%gs!yeUHYwopciU*G6(b%J29L>XdP9t{hm*mtSOw-dZj z#J}BFsD6mBK3IM2_b|K%RY7?{mr1asZKq1Z&dMmV`lPsPV!4#viWV`XwwgHwb{>fb~}#!hhMR{n@c&NiEPyke=O_ z>Z{c45u=1*(k3HNXl7B8Xdp5GGNa+a5%(@L)V)7*tU;GwpAiM+Bl2HCfTGA`)ac2W z`30ihWPtZl1k@M)?~*x_K;_XPy{QaCZH8aUb$k#*&zO(Su3fz0p#y zcs?`sOy#ay6Twa4B9{1!yes8>BRz|^@Gy@&>I8hMI6i7@1#>E$+#W!@UOfyEvvmXI zN+HAQVgz}jmYt04kb+f7OS0gZ=7h-S2yJK7ces&>9gdA1#TJQOj|qx!EFCtduH_hQ0N{)vJRigLhvrGgp{a+ zjJ*772Z1!UBp6?f72j#8hM;BBwQ-Np4y+9q&d-~dOx`6^WM)AZw3 zuGveCho$Ru2Z`|T<=Gn=0}|9*GG&Vy&_b!|9&QpWfK zJ*yBJEnZ#w-7m0BDnQ4ico`l3#=K4B(1ycW!E4uZzMw>Jpy|hSCP=Rp|Hg7moyWKv zk2^kS&`eDI>$;Pw-Q+p7FgFc3sTdPF>UBss8kZxMEpm@D3kLi$;}1#E4=`*FAP7CR zB8(?tWJ?%!umqg!%21!RlXR+94rsP#4I%8!8jko7e7-RQhCESICLv3Oo)YI(?*YL?6Dm*pN&<^{^Vc9)1y#$(B=CiQqlz~VZIr?B4e2E-kMN^0|9-Y2f zwi81A;DB5y$q-5~+9;=h9NJp0jb%YvDsJq%|Tqb@7eC5hrcXdF-;D2_|P~LIH$TQ=2{DZ$j-N8Q(Fy0+S zv?Au*KAGFMA=OnokfiPXdqVlqO|gi0==A&gas1$`h46cS_NQ)(Dy4U6ixxT4vM(D| zR6mZr$a!nn%EC6>AFRsxigWz@N*{BbGi*A3-}!f+!5@G9l$$y@d}^>q%{=^G-fIn; zt&=Z;JHPRsF^)|M9%Sr$h)W-;D%NyU$%iMr+EUP`IIWo`9pA`jtb(r?dL)314{xeV zHRU_S>}DvyFv5idr~hy&4+oaQ)>0x?w-t1dA=3g~c_v1t?iu6IxL>P;D&DY9{MPmw zjxuz9I6D=)${1vRq)@*Yjx7&zFyc~C5wn>p02N3ok~pRF>m`9{ZZhR6Xf#efd?b_d zTO5x4c9Moahvl*5Yd{CeRmd?#zJV?~FxzL%BODVH`pKJWKgxc+W#R(?7=pcPn8>|S zu>0NB)lriFqt`%N-)>XAZqFVat^Mrxo(N;bD0ksmKU_Rk<=m8`r7wC?oXayO822zsWd> zyY8HXsqdc$OP{`&#qfK6{Ny}7ZkFmu5T5w?^R zA{N94*1VRa$#|157g#tt@x7rG`WWC9HZb{RU(4iYrSJbLAYcy{U)oP+TY8*@;rCUU ztzBp}bAQs~W+^HTdGEUxL05ydHKkV;taDL!>(%1UgYJ^Cv?pKEuYLtXd9Zu?* zlmjyzX=O!jcM|6&va+NE3up_br4CtE@L!mDuyWWt#NR6QzeO%V2JuFk{T8G#lqOFI zc6$5T>omgF4?(})Yeyp#^kr*vWPO)>rk+2FycP7q0j7D0<{dfX3K42=xW|)bA7Bpp zleWy@e6YKVNC%>CXcIoc#QeT}%k%vX1S{g8R2A_c22E{TvWH`d#1v#fTE)C_pWxlk z75WrV9?;);SQ6F$CxO-0;ycy~D%SdnqvwB#?UyTu)4!MMsSe(@=5Td$m^;2k7Wz1w z=(lDEZGIZ7_$Cg|%E$RbEYq{lxq^xkjM3%B{JK9imXC^7S;&G`y+FIvB}PeQWg8@?b@8CxLY+q%RnsO= z-E2XkLXOccw!MR_5LkjfX=UbNAR{#NuS}vkH?_3>u*Bvwu@hE()tPeZHj#ugB)yR8 z?T9?+eseS~6Oe#y7g-h4BBO=m7xWGurkG4td*>*I5=A|;b$L>BbMvF1Rq1XPY@>3m zJc|b&1IZ~HtLg;W`_0^iH%GxHP~Yaj*T}C`l$Vx08RPRhc0Kab8Ur~nKxWqZF*5je z%TmU-{mw{&{N4LM`$Ex=@3{=R)dd+E&W+s`xNGMJqFG<=I7ad3y!hf6o$(rw)7GG zCV$FoG{y5i08f7Vpmm{^gdmYj7M!T3COMXG@NC;JSMCp3&E7XV>n_{(jmCG~2KnRj zYpffZX3Pz6N3Qb~jCMm_U2ZT64XR&ISbpyuBeH?1clG>95+DPlk3`6_=nB73fcIZF zkTuIS=aYG)mOE9Cz;ap|HvSdDk`g7ncEm^viBl|*(Q+{7gKBgiiGC|!^9gTb0vtpN zqopyzIq*WO%P~M=TZs<=A3HkO$5Koh+?kZ2siR!f+E_c`^P6@;*rucsz&g;=^XJQY z9(uNFHO)OdPIM&ire5`Um|0%839NBLg_gtZQwQ)g-Wrr5QyIjNNkzAaGVg=_L6vVw zx3=tL=DO?t0MaDTM*}}6TKw5^{7(k}3F}wJp|5 z$=E(6#r)X!L|)9yum;L&65c01({N4BpynHR%}nfE~FI_HB#;ilW)3RVoHCmh9k9@MeS1STO2*r8Wo; zpq_E@An4u-K_&RrV$!pheWQ2(Uq1$=Ncz`SkGz!fyinlFuJROHSjjhkIf*&1h>>F_ z38Z3FS-(Thpv8{L*Y-Ud6LjBcv%~lR(KoLem`qGsuN*L3q(mf{ww*yMdM+h=Efq$; zPIB!lVs!8XD!r#_BolGGY4FkLRT))BL^>F8;H9PD!}W62!L6$HW&q$dB)D_NO3TL5 z5v-1+;*sSS9xvNcg$>EIT7>tdED#9`f+r(e@DEpfvuy5gM0cW*k_;#+sZV_TlV}C$ z?FY3N+fEQ(1YpmJ!g!*OpXU za2x28@^{R>QIeKG_zv%eZd#sx?2KcMZxySgRrGxawAx;!pW3MRE$;ObNogb$<>mPh z#LvHcCGjgxMoeD?O7efiu&XeDZ(L!p3Yyj?2WUhNLF$)e8Z zf;!GKb1G-K!Jloj2D@j!3gfx_dg%)cmCAJSXITv~pUiyx#cx6gbOz4i4>Y_+3_o)&J0Q$1TfAZ-&LjSlMbHV; zzr0bm3pFd{hCI46QtNq2$>Pf6F8o+^Q{3)Y;7tqsxN}Z|3hcS>Gm|wQLjQ!NvouV~ z+q%rF z2&zF8Ssy!(1YWq0`o1 zl-7FbV5AB)<~Axw;}=hO9&f#U>h4zofCXzkxW5BI{BYN5rRK9}Q-v>Vkea=}PwiJ0 zLLK@j08n^Dvb`*@`9+J};_RiwUrUW%R6%u5`!Fv5=jQ<*ZvU5c=talRZy$nr zvz?z6DrJ~SD~1MrYY^=A&kS*z-~xp&AJx^P{%f!q*sx5iRMHfHF?9~+^kzm8$M2)b zKEL+8`EJB>0abbe9ljtqUT=1=DXm(u)gzU^LGs*c^(`H)eLO{Q#=#JI!@NR(af4jI zDKC&pPwu@|BpnWRRpxu!L0ZQP!~DRCU2mj{(lc}OkOo9am)onOZjR(fe+IazD}T?K zz6l0No=O5=4U|aWz2Jl2%u_=no63p!T^TY>t1!}viNDr$tElmSd5t6BfC8j&;}j4j z)(}1%r5ts+@EI1z48C({qAY->QNKLeS#cFFP(nIZcXzKl;N1!X{plYCH51C zV!r(bi$=~~g$<#Zy{YEdb`3v8q4=}~3g~bC5stWny1^?t6ses}_@CJng6!uACk$k* z@|XEfp8XmdxmS1?`_yfd=^VzN*%|j%Lv1%8MBX-;+M?tbX}8-@%+5G((gn|Mh3ZR7 zH)M1=u%eD&S*CJMRVHasJ(j=hGwT-+x};4VtcD_N@MtL?uc_XuG@7&}X$Us8dz2?M zH#;dd+>T9R5C;e|ohKZTdON}bZd{=3QMa?iZtI1785=_jH?0Rs-y;$BWe)Z-I~Ww= zgTcgLW1f+L`VOq{QJ)eBP8|}ntU~Eq>lDKf>FPOxD)umo8F?&K*>K(SHwqfX%xL3B zIYxh$gcaudqRV-0$cQ{_B1BxFEv62OV4LRuB|H}_n#Z{wpM4iQHVt-3Ih|N?ILjS3 z#x$nK6bY{XD5*iNV;^qd(hvfu|Gx@ygG4T8jb$$?N3EY!W(Zl z9JkbxOYEr#x$Aqlx}}+~*fs>*=z-3}SR@^h-7@qC0Z4CDB!LpprbdARtf;V2BAxRH zASAL%V|5TSCnD1#O!keypeB+MrY@jFYT+Aj&NZd!M5DEx>e8Z8O6Yx3be8;DK9kEE zhDyVo42uc@VKu<>i&u%yA7C=|@QVYKU*-g(I=5c@)nW9p2hst@!Nrb>=v;N|m+r73cTQOZbtd=fICTit+7KZt1Et@chH(Y9%D9Xn?VY`f1 zZV}?|KC2#*&~;?&GOEs>JP+F`$y6rH1@dN4o9?BU$-u1H)%x?R!%@nRz%W`2mE);u zy;Ye3%B0gmBI_lXLuN3nYZ;Y0lf2Kg08QxhKx3!913951KLoQzi+ zPf873iIfj*nbc2Zw;l{~P1Ove^_xUd{dq>Abd2>=)V8`=T2ZO0usbgFcZMu{#7N#Q zf_gW5i=JrqLKN0OJRNijLHF)2h9awpA2DtG&IjYoVtr6WTG!S~jg?t&{1fhmY(D*t zBqs?epJR_VUKq@l%V&Ik#(_ty#eQGXsO|F=KEIvH)N&OS6+!Yg6_mkG+GA4>Ge!a>k73`xPwR&i;@e)KD}>g&1D-U_q~Gbp<`W?QFTNCTP$+jVOs@7d{%aB!kq1K>4DJ&}3dT?%Ea17}{&vg7ney*W>m*0xgW1V{gl3585ojum zbA#0TV3cc0q~kYl)nY65fiV|vyu)EDkpjzbmyZ=>(mRwgIL^IKid6=J2-o-tFU(L8ReVtohvQ?ca2^8NF%X>RFVNo= z4`N^Z2ZmzR;Cd|%y15*3Fwr^iIhWoZ_b<8|iGN$tC^mqAEgD}*ClUBjztMY$>r^+2 z6E`l}pxU7DHJVs14XZdF4?CuSqzOo=C{ z%}y7diG>Yi7Y4`a_4V+E14TH-Vfv{EpTzg&5|eQ=Qz;K=!bY&7RntFH!4Y_G)tj@I z01$p8s-YBQTD+g178Yl9!5sDV%wd2XdTgxIIud08hdFEo)Gjnz>(BU$E!x;Z%Auan zSSW6VW+13v9f_cOQ@xNw?3IK&5t~4SLfStq#!A?nlWXmFzaWzB>fxm|9oV1(`JYLU z*r;e+NyHYHeCGerYrA!q#JHNJ-?`451IIB&<}G>^X{mixLp$lnZ7Em(?gej44NE$tj z`Gl>MB;LSaeg-WJ;d)w6eG?;jFC;EbD1R(YzbGRNLUXE~n7>?U--;}mn@A#Z&%e9aaA0b@(ghzQ9`cna;# zBz@HQmi55#dq&#o9b!y^Ft7Xjc5X4PR$$&&4gm$ia|HD^a5r|p4$lk?nl*04+;SqvbcjJJ~sQk zxfBurs%)35V=j@R0+@PK6Sj%Y>0n|au~)u=O;u;ih|YR4{Klj~gb7H!vdP)3v2~>K zzhT<&k5~6TQmsWi; z;Tz>YLjud|40);h`OIth&^l+!q3&?bw|I4V(l9{CC})#Pwheh36^&neR#T-||D8{s z%N4L{5d?>gWm(C8V7SOSrwW;^A}oyklCJ>7 z6xL&nu>GbX{C3r3W*SAriGiF$ID{OTrbbT+tdM784J<}+1gqKV^wBej!KxAIIvwHn zz?>HM%K@K{v(c|>&=FERGPupfBx9(JyERNS)!@O{i_uHr!5MPy6D_0zO7qZ$LHktt z)Y50f=uo$B+AivyuZZ#?^%UmhtbKd)f=_eZ?x3@?MhKC zyRbLZuksP~e|P-rK+~~d-s{%{af?)5=JO=t8*vWpN!E^x%CpW z2E^WOj$^)15*(2-mrsu^uVo2grt7NUQ17qo{lLRZj9)>l#M2^-MaVrzS>CEg*P{x? zBbd2{?1oFjXyDJK2#l?aAC=TR2iQ5{lSzibNHdu-$yUdfZI+=9r{eHR8XP=I;k})g ztw13+@X{?k4$Ake%U`$mq`Uv$yRt&g2LllV;1WY(#$k<##J0awThy9F8ut*Zl+=-hzltP=w*ZSodimUaFpWR$e896;unBum_ zx7mCSlQ&cAvhr*AwF_UcWJ}ycuhT}`xk&>K31f^@?{|tp(u7-Ot>^dw!TY=q zh#@U#zRk!`1t}5|&sGv5Qbj_R6)P7acxBO-fY3x$kcB1^9wiPtIHTbc9txQgo}Hq; zsX18Pw!n9*xj zqd$1Ef-nOjkO|n{kTfeVzlL|u!&z)gT2dstr88Q6I6@NaLM-aUX(=YTR~9*} zE4yF12>EAN0O7Mi;is$)9q6^9Y1^&A+0aH~sDo>K!i zPJiL-9;nJAPT{jgr4Tsf`l53!B3|h2%?Y=kvg>325|qmY+XwD7MEsy(8}=59?EfR;iZZ-$sr>R zTNYU(G9!4&M;8_Q=Xp??$0C&uIZUti*S)ae3gj&ngkJu9;HHRObnR%gxLsKO>EISW zl=v&T{%OOugKHzxW?MvEMc-aD^s_D)tCn<>2xV}4En1W8>4-4Z;NAAHzEMZ?Ihm;$Cx(uG1@L?6<*5P5nzf$@G3Al!(hy5h&4M1z z%J*k@vg>pWvHK7CGr8>s25C6_XA+pEx}0>H!Q-|rI(YeS@b$sYrJkXn#eeu6McY>74YQazUp`27RB6}{^UVpeA zHll~8!X2X~b(c&q_-ca*5)(LNBo+_;%hEX-`YW-mWYx7hM&ce|`2AzYF0Zr0=Khl+ zv%X<;hNdVwU%Z1IK1vD3s=svKT8jADr;*G1c3N4n)mL{D0n?0=Z#{sz4BpTO;bUIF zD#ghyE|mvDMAt9b!dz`RV?N=9%RcjfW6>s6OBpVW!mNQT5Q)-f?P!kDJHR1zz)4T{ z32lg5mx6BhrX8 zWpb8&=XBT%$MtWXzFsoU=^oa5rl2V5xot|3^?SF?)^q;ri2a7?pTPogeLnuvJluAY zYm>a`Hr@16H*O-ZaQ5lBG3xI@@d`BqY)P|?nL{85lbB$X5nlcTv*u6aaz%oueUX9X z7$S1<%-Q32>aYUJUy+O`KWoiV)B(SBS&V%6he|O6Nu_OLB1F{s+1W8$-{t4b!fmfMV zkyoBqQE2lAB@{)84^=vtUvqZ0(;m^XgZnuFJ&3r#{JXU7MJ6Rn%&3erVZrny8h;(9 z4$?Mf#L_P+O~l4AN?lfw6rPz_=C%54L#h;>X=Hr=NJ*gtq~@YDrkhJnBu@XKu+dP0 z$pFZ-I}uM9rLm*kR8Str6BeY@76uMPeA`-e7-TEgVY6Nty`a~R$rPlSdVn+j=YZ~R zeeDicX5+Mr=Q;Y1L5xRNf1mvlx^F@8ahCT2$-u1cTF{5YHgdt`Z0Z87BI%Oe0 zS=%eiri3CiBy>eVZ2wSy^d z172pxKBXz|>>hT2_@%hPu3-Vl@H)4(N%4uQCfbpqQ+`Lvq3kkZE4mET&0ak3cE9)? zo(lR`hBfiduVqyrOZb{8%SjL?Ik6gBtRPSDut*-xY*HUE;AzClBDq$ca3`s%XEmQ^ z2Fov9ohI7>KSHxIGp>65623EBn#WS@Rwl(l1Ty87UG){8)%%y;i);tX6?-o1z|Qi0 zX*zrJ{3Jon&~0F3f%4F=NvWOmek zJKtqVuF6rEhS=qNdTcU88`WHgUQC534I>!}MB`3MZ0|l|u7MW1*S#w%P?S8;lzT0o z1b5)E`WMclE3a9NzB`=^NW57%ieK0O>eP8k&Co?|HVoIK$c}^Nt^Vyr#|Hx zC$g3de%cHpI^Y{_Wi6@NNAs_Q5 z{{bBvG{U8y`S#$7{Qb*|V>?SAyI=jp+wW@~>n&0@tI;kAtYx``^)*@EAbwcqn!^_!V$r@uGemNXDCLX72+t9#u$-Z& zH!iMu7QY>mF5zWE)@<#GAdyBZ;EN6 z*!FkYcF^R@)O-oC+)}D!OrAZGZ5o(2a6R`SI5=C3GGG&aFqDGMHWEple9SX%VPr0I zy1;?b4W^;yO#Z8ouR^+Uorpm6+uyc4UmR~OUY}3k*o#ymeb3=aKac!9cLHWM#<@?w zCBTRyyvhq5o0ok4V%>)-NRi?H4t9j$Fx%$Z^RpZ~700~i*f>7AmLwaS8Vi^Xd2!?`Mti-$cHj zS&IyrALl#|WN&8oa-4kh(`F&ir-Lyw3=)|PkT0d8Lt$0U z6t5!gEATP!`Hmq9*s@n@8XSnw_qHnQ^41f74Q+sR(U);L`}UjS%+T9!{B;yPfM48d z`wkWB*BXc9-~Tj|tIYvI4-ABNd-%?LE+4YTy)f(~-XQoF=IXAHmrrtNNE1F@ExF=e zcp%%F5KrofAJ@k@DqvC|4T+^pGbU9Z5S7gQd}7cxZ<^-r&7J&C1w+kzmxWHtGQP$O z!T1}z?v7}a`b_6!?K;)MA#pXicU$Oyu!jBKb2C04NB;LYLP5XieLwdC|F)Y6k0BS6 z@-I8LjjAhqP6p1-S_CZ?bUF1eW690_8dURqsg_R)B_!WW9QBCZaV074OW|=7>~zW-s+QeGTXGzrXVL*r z0MTauZy@Nz3oXy<{J(pX3*Nln(Z;mPC%DUYYnL6gAf*D~ah^u*Nbc7o&Sy1@r5O+8 z(TvQm(QNvQxyS-k)#bNTy*%pgou`*EM4#B`RemY)m~WuD7}H--T7Fzipa(Rx4^qBvxfOoWTUT8nXJvWLqOWNAW@A9URUF)Oi8wQly()gzpi2gwE~z*auN$WyViKl$h#1Gb80vgesa>Z>c$bc*A ztxC_zA#awI)}Q}0Day8kun!A_J}F*eFazT!{i3tilFcvOMjw}~G%Aym!HdfNv5hup zg-<^PT67=;4DH1AN8d@F5)r<|n6Y5XN7(uy=#16hP%*R@r;ahyo6S^{VTF7?Gqdeo z7$GTR^z{uwpXt4Vn*b7YNlml%ky)sDAF6t#rxp=Fw1ZL5bY3}L@R|n+b~gU{i_7xP zIV`+a^Gxs10JsD|`^m%o5Cw4tsokX)6`l@|G;zF5IT;`b(ys#!f7_ngOF_x?w0*8| zLP&(63Jpi(!&@J;Taq8zl?(AsoAA8kL{DPd5_B{3Nd7|2Wg?aMVN+MH`Q9D9F4|0G z39YX)*DJku2j(J@?2~5XN-c1{Pa`5v*&@V+yQcr0J<8oR?!QhF7(H&lMZB$a`aVb& zSuGQvV1jI|8RvMWH5sLUF*2F%Exlr8O8%TTBs0}ke2XR#Za|E^=`|(TRA$jit&NY) z`IB)_4W0n^Aj=NHHO1Vo*N2brJ!u{q1aB|}Rw^<-hCtdt%(s(CkxoF_z$h4hv_c)p zFC7LH+Xm312ZuS#)Iq+a5aKt-l@=rQWI_*>$s;pjEs51>vT|`ctwplJOn@mq1tTAF zqJ|qRH-E1)!7Ks-g9arsi#~NvK43s-$}Fx~8KOrCY~W=w;Q*(^*gXqvh`dk+^P|C=%hnhp|1t4FvS$oJg>z zDk|t}G|)8nw!C4?>3Lk7p6KRRs2)?dd8_S^Ib5#qRpKcW|89QcW~HH_H7#+!ajg_t zE1V7grXse#d3o7<8KL`wpM+H6)CH_^AJ$?hhqHaFnVX6Z84P8cITpeYDnouf2eU06 zm4F-DF_A<$eLsLlF)(C(){dP^Ct9?WjFJOZ5QPKVFc#;!Pz zB8BJ{S^ru=0lRSW-?>9h7ttI?b0QCve^0&7G}dUG0@?*-It6!8IXIvTLAY=ZrrQ!l zLTi@smOHPPl!wYn($ZX^`;rMaAR%ZG4$g3?wWkl;i&cz5K%*WDqkNm&Jq66{%L7vA z;=|U8g+lr^`s)TNSHJt9Kv~22HnYz}bDru5VLw%Y7?$KJ-XH2i1)o`PWDfqaT7B}@ z3SiFjuuS|UR-)s=NQx;+DRo^lSH&={_TDpL*vzV$6JTaRP@UC9(IQxco3yu}HFqgx z^uM(kZrU)QqaH0=|AQft#X=4L9E#C_>|R?~`}HM%qlfEx-`4xC=;I|jEO2Q@Ik@N& z0}M9dL@w{=nsA$v=#iZKOR@ky+`K00NWQMF%2V_l=Pn)Z*%jU88|%fF4I`FkvlWb4 z`WaqgaoX7-%x{055OzYGKgnkx?`k_EJ7neyX`F+DBa=M%V?_vZc1dogT$8H_f{~E? zeHVdwFMh*&_q>eWw=J3P?4X;*rd?0}kl<|&_X#yZz6t~E0;bJa8KpJ$ zTcGflNE;Q3jrTaMX`xkQ*~l?#+Gz=~vK4iBhBSu!(6>3ydE@kH+KKlSB*o;XL^n4SvH_lM^ zt8>49<==k`Mi8{ZNsII678esy?RlW>m-ol_kNporYUBPFd6Xe0R9wc-u6Wr;Pd4Rm zB=L(irBAL_lgEGVj4JIXxl|c0s^C5FZvHOV_VSkN1n;#3kb|3PIjo;^x7iE7f%&H8&YSJemXZL4Q9!$t;>SSSz+7{v z70+rQ-S}+^a&VU4VpYUVD4h_}^Z%A`a@V)bd7tah%ng>g5tbGoGi~4eE5A?R($)0H zV?t(?-g@2Cm{mHri#eNgYwBaI=a{l|A%ni^Smkv!tsa2St*Pw|wwYm1|E0a;C4P zK+f6POf?g!RWiGv7ro~!n4{~pg7?aZ-`Or$CpBc6VUhmwBIzhStzwD>O^F;b%;KSK zMr>C7`FMj=J_@a zGu`Mjn+k+hAWI!udm1TmWwcY&Hhm=aFA`^3uw0Z1Yteq7&%VmD(=>zNCCN#(KD0Ws zBYYF4#JK)5v=6d^87sM4{47%(tZX)e=P+QzaTxF%H~i#7Jh3EGGMr%4?n56~g9uZ0 zVXRI2XHH_%g+q)0aT?Qx3MKMj!b;MDtw-$_)MTGlM_|LK966VrnWs& zk28j)g@$0Nt3)#B-s^|m+5s@8m2NnNBD}{6-g9Q`71ND!AV31XaaVZhnayOvEU+Mo zufMhJz{PSHw+FN&A`Q6lR3XGOfP(`IVEGjU3VUZtpu@yIkV0F|SaRlCjIXIM5PUX^ zMt~4pn&I6*Tmp0x$MwKLV_8XKef-I+kRL)DC@oz|sh9jZk#EogkaQo3Kn5ZOH@x2e z6E^{9)Me(a`?F)cBG1X0g_q^Jf{vqK&9KO7Rh~zS4rViXRN-z&7ZvrM0B&Ux0hv>g z%SDnnhURc>WSTm=qW@**06+0NA< z8qMgiFgx>9$T{7(B)g(YD&xBbRk#!sQ!N!tk}zXstU)*+l)6d3KW^t^Q>mV3i=l843>;Imn%o318P`>#bplXG0f z=Z|rng=4(Mgsmk?K)J((v$w*K$<>hCw2Q@VyFua1+b-#SM4D#eH8!k}$DAZ4U@$`} zCCN^CibE%+v6hwi;7kq{xVnzQK|9OoY-d^Z!?w@mHI~~MO?!tQsrMl&jeKLa-O_?m z!DtwT&i1KTQJpNMwS<50^g6pWpk>Q0Bt`T3s#qBxVl7MX#+}4(NzVogyaT6lqj}?p zO_<=^3#L(SpYp}jfk6{y!(=aOenn{@&-bwB)1ve;=(N8QyhE^;XNL{q(r}s}JAOE;w63Z|9q7Nmm|D?lRWLCeID*3|7 z#ouGRnz0gf;AAHtpFHd{N3;B~_D6sR5I*CWPAZ=zBJk)ZO4DJ3XfvOIMDZG7mfp?@ zM&-(j4u!0IcQ!rR%!))vvZM<{V~|Y`w*I*ab`QK2n5e1n$5f3#nBEb3uS5#7?{#wN zpv;Q;d55z*Jx@{Lq@wRP?ds5_qg&UH+~@y~sILHuYw5Z@xV!rx!3plcHMqOGLvVKs z?!h&fg%;lI>^u4qc?8>;f#&7$|h#nJ7$usO)l0LYB1XF}TohK`O1og?odGGTO1b!WVa^~bz8b#I z_>sN}gcO&F1F#;x;oZ;ft4OfaUSCy&ZNIG_08ei)bI&=dpQwD4_IOTC0OwteW7l`P zNIL412j0^$QfDg=ukc`~C!K#_@HGoY2Fmkt1LWsZ?HIbWS%?c z>?iuRRJ-KI+XLf^(chPh*krOf%(a3}R$pBsKcylZJ`Jmp`g^Gf_V}Gwf7)d31nZ5z ztAyeFZGVfneP8PldhP$7g2AyWjdG~JKYGK@IjVJB!xt=HnCVL87Cm2_=9hde?KHuB zX=a*g&lkTXCi>f81Z62+StFjQc8{Y*0*9RRq<7NNfOlx1$->J*=c)M}DgV34xh9ha zCi5#A>ty7^N-asMbD9g7UOZ1i-|a$@riDc3-C?xfrl01Tw|elQhnU?T--2}6#_!q? z?85WiAPi+9?43C@S+ugFMydAVT{L7>b@Kpi{vdAZe+2N6o#>OTBawO{oS!<4rf-Wl zp&Qt}Y~SLab$UM%K1T~#Lw1>fx!daR--MZ+)1obZGe7nQx-MK%SBqhEe$@tNkWBD9 z-M&ksJ}s!_=jRJi7FIs`UazEj#8bGF)vOCujBCrn#Fz|bH2WU}6m-c|>+wK67QY)W zF!%?CS%66r+mM31w)JB3WT*KOV3}9Q;9Xr3;dNGF7(z~ zz}BXdEaKMve*sx=z8@$r zQ>*%=@I;-dZh5e%Q15}Jpo(cu{h%;Zl3Ke{Y5#R>!_9k}sz+7m8^*YL%M_p!^&trL zZc8KrT2|9rqA%>pac1<#_A3A=e412^&YZwtjquBIXPe<`pw*ikD}xY z_4hJsj?hkVK%SWvkbuedE+(KC{|=HofCVUu@V?_yNq_S!c2hPDNk|+5S?Na}vzS33 z3!i>~kb|EfjDyS)CX`8nrwh@}$qghWQVjzsARI^PDE|BvsIw?LlY}7-`2jr;u30!x zC1yFX4_hL|XdDVk>CdNO3WNl23(i12^2L_%7Km@v&iFe@F(Rhui{htjgyCjQ-Klz~ zr%t-dqrtN%|5MM{E(VsI1mu-qYxOm2^_z{o6Q!Wy9*gN=t+qSJ%Ip{I=-p9?2_hG_ICpWP@dJn^s<$M0YkBKnZotX9)rtYyEwV)A~LeQH&L)9CnG zA#Y8q@uA%4GQs#YLls)NMD)Ot1AVkCGhjJtg z1DmlLCKX_kh@B-TQf7pato0>w74jzstfAal6D}6E|9yNjM); zM)*$?5m43_E6oxJRS_zz^hJ~j;Ap^|$0tftPS%JF)D}>|#~ffV_UOJRt=7@OmL0@R zOVhA#wz0-HDYHMJrUeXSW3|3N21tQ<#-4|RxPLJ3$ilf0hDhXU!=9?srIW(NZef^u zyX}ckI{r%>wJILaf1kLcl6`kaT|9%qGrI*6~0g}uA~G`vQHL#1LX62zG-f{g#6AQDjyyNob$8#K{G4=YUZ1s5wg zeJ}@LI#iE_p=aZ22~jGbScV3Mf=ufmLMf?q%>e9704BuSsE~!#h^=n~GAk}>Obr%g zm!2gSnu4j!8ovH}AS5U(7utTO`dl)S1@UvI2&n6qsMsltq)tX3Y@?*t=JUNpGj^*Q zRuh@yBkA z!`V-O(B|an<4Knk zlPt=zc%kHaJAKevlQzOet6od*oJ=={-7Q|d8n+I4ppt?TEu6j%bp{=nMS4CC4eVHD z7%+5z(--kKq-7?tuC7_jQspvWCIivqf7gnEgk{Zc?t}tf4rZ+R60-?Wcs!#BM>XHU z#-h)V|EvkGA26W_~uVh?|cZEa0A#A+pN6Zp|QE-A{YEB+RdB7=laDGACrn(t3Ry)Mz`E#1Ghu17$l@6Hzz>kc^Z^bXGLxRZ47-2`G>W zP--EpI-RDNU!gZ?+9Q+2~w~JCe}ML*bkEk{6z)+8QhcCk-Q|M zg~6r&%ZGzCAVf>TxXZpG#<07StULwY&(j5AKb~`Rs{i8NYALw;HyI1aCUkXu)SmC= zR|3jB`jgB34jt3Qu&Xe#bu9m2-pJX>q!rCZM?}|JVnxNI!h}RCSeTSNxqf{3owMK3 zV~7(hrJCeNTUkM?Li8F@EK|8HAGI+bqA^fHOAZj*!03we%h|K@=#WNXq~T-XTVopm z3*dWch?yxPl@U1|Cc#f7d}@3CL>TfG;c)ycwZPaue57FtKzMP4c7W%*3#70GIgSjw z4u`xcl1Lzg-66j5N(;6H^e=LF2H-r(h7OulRJ*c}HcFB+sv=4Qhn%BBEeF9MI`$XM zHkhm))O$}@u2>tOB?~9}cj%;Pt=_a@{p(@Bwn|;SV^MW-M=|xkm=pX7CM$1wea+7N zy*Z=KnqEhEJi@N0^r~;0T8@P2>zk->n0c=yM+nGrG)&dbQax5yHlP3CkkHtJ8I}D};1y#;0 zh6FAwHVm2T=S~(TJ~84hXlUp=c4op%e4v(5isT4-3Z!riBszMKeqwz>pilryD6SEZ zX+sWge8+OmpsucNX{gTGx9zN5Zh~`mh&*dMjicLqZZZG~VJ@f8n9ZSqGw=L5sQW-i`Bfj$K#?LtXL9B7;%M;?7vF$_i4~VuU;mV z-rGD!FK~M1sb(r@NK`f>(&Dd)iX$Vj%E{W68KVORGR1vxZ&2ayM&z5tOUEVy0r_El zqA$jJTx0E}iVCsro^8KQ{+{wbgu}BMoUZf8t`Jj`K-N8CDA*KDe*R}uRcbm3Q|YcL zJ7_TUXuHtYPuU8MXLz-crs|_f=Y7 zxGpv@eF$Hc5)oSc4uqVj&A>Nhy|30E9lk`NDwHESm=Ee%wU(R#QV;8z{>w%Poj(TH`#$PMB(D8i#eC|}6&jbM<4Wi?JD14|BB;F?(= zS)>6Z7)b>-`M?4ul_4Fd3?LMm3s#Gu3P%LHGO8K_i?Z^LOSGOoyx1Br$SejeMFrGU zyIyuK;$js&!J$xt^Sz*e^xE^f9(|OIOVohq=E<3&J2}z4L%SbxH@X@$I(h%e3IW8? z%q#x5o-KLQY`>W4l3JIFr!VWX*dB;^Yec9-{fAO9nQ9SmMgDkbd;Q3Vhf^V$mpBNTaa!@`>%!+O9*y;Xq zfNaIHS3knA4)iNR!iH9cguoYuEC&SY7~3JC#g>)55c=G;aghs%U_^08=H1u&A*&#n zk6+QzK zIf2-K36E2X065%vQ#m zvRe8^croumTjq~Y(G~_bF`BU!Mk{yzKE5C-Z&qrCp>@aXILa%x%e$ap#=1s%4!&(~pNAlYFjtMJ1Nh!QZe4$kd^Y5SWUIKNt}-&i>_B>xUN7e_Xp zzvqt)oIMzul@8NA>>Ns0C7vxV$7b+l)&c+?0@*QtS1lH9*1y{ce0M~OMDfT3z8-(m z{`&UiFxCqeg0S`?MzgBW++!hc>D4rhB`J}a^G`7;rlpLwUjl}=t0kSK=IVLVb&}7_ z$>H6E6dMR{Kd8SzEV#6$Zpg)ZTO*|Kq7rr3L{X!+b)Hv^K~favPyD>;+vS@Xnvkhh zZSuy*pjiDt92qGbL-!qCITc;3B8n>36dAxN7j8?)FCH>e2?UKtK@g$S2_qtzNrURe zph6`@DKLlN`(`shn)mf@8Eq$juves9Qb9V48tS$j!L+!s6nxeA>LO4OfPbYqxKMRe z!iDy8TKbx_`6dz#x#MtUK!&Q(llRQQL&jiK=}0Np#R>P%R)YV9qciQo=BSbRxpplq z+SqV?aQ)fWx8?qIX=&r=F`_`oQ86pFYZdQ8?ru0S%_hwehiuVg;cCVFq>$Baulyje zzktdBw z9g29{3UL6_z40o)$lSiOG^HCUw_287u?#1oO<1nw#`8+1W2pv2lKwLp086eMx4X}> z2EM#6$L{&~m9_tUt+jz&a%c2f?8uk2(Al>mMlP&Pdq(x6i?!!70`7U!4A+6C*1CXY z2Zf@OIn`K2w+y^L&RTZ2HVH3&wP~FdorQCCNkLN$On79_xzKvw)<09k>!&FvFpY*5 zN28~j!ZKLumlWe^Q6YsJz*NGTl=o$75~`X(=9f#WvuM>*%W1)wD=IdbWE2j`Q-ShY z)e9nFihj1CN1JPllh1g52sVV=rCo%IQi23%8p@<9Gg5Hs@l)GNgQdC8~J`Z-MB%kzCUGnUvubBnx# zMDw_9$-(sRA4>MD|H8ky-k%7^7OQp;7y>jAZW<339Ii6PwoCd9H`244sn!jQX4)8L zZO>DN?IGFL!~N>STExdpx2vH0e#RtaYEo`{;*QG+ zoNJkk&A#%qN2F)wO;mlJf*CbkhlE5=sv_{B!l@r1shRuvv(iQ>(!5hT7JU?xo+}K_ z=7ih{@lZ#eP+pJbW*ro|imX$2WX7BqSZ3!D6AXhf7(F&#gs6 zr)BJ&K<`xj(P|;?t$2OZNfHQW9HQ=hiu;Vl-$|F1O>ek6KW9hy8kMBY2rcMuIj#nD zryn(_eGbDED5js50WHK^Nsb_=|LwLgE{ODdx(2#N&6JJOhx!PsNJ5l#Zm3zb zk*k~1er_n2W9|;I{#N@FDLSQc?P-Ehgb4rnJ}O>IS7eTM#zZRMjFjyLjF6DV~v-!so;z^{^2< z#LX;uXK-F(#d_bldNg~p|KaLsUw=JW=hb)as%rvm_#HZlN@}dg-^1yGFDy6UPTc<{ zg(v5of4|OndLvKhe(KAGjA_8+v!I#BS4Up91wLhD^WwYPby-O~RiT&aWlPx;w&Yng zc~c?oDlc!E+lSN7-Jw~Gv2FC{H53q*`_sJ@hjc|KUou09<=v*IIx2|w*v-y;IzLV0 z$yqpB-H|DC&tNk1s!*F*TAZ=vu`4nA)*py|OLL{}j0&=s@~z!mHfq(yMsXbZAWX{C zBzMqEvtDm$Xw~tMfc|9Z>4V4*o98vyKLORH1iT$~MCG&#tx3TQj;7{DMX$&;kP0(n zj*d*^>6vuKdN$-%GxqlK#!G7KGs6vmlyqd8CE58%v$#2wVPIoIFw2eCXo z`OZhv$Te5v-BGz`7uuT#xy?t7Yn!LlR6QR7ZZ} z5f@|k`f@Mpqp`I@&9C{hwIV5=D)jFR@24E=Lw^*+W(di9Y3-QK&5_Xot%=h076l&1JFaM;Z%CT>H*e>xMh$C~t#? zem&+b_XwU653tUeNd#J!91_zrB{-}e-SaenMYtJg48;>v8nM3Y3iY|~^}!u)oPBBv zBUvE(?ExDlOX8rQSy^9bv>1tp{9&D#%HWI3g~G>gPv4$CM_k|SygX$T^y<@Z9>o4- zfq1i(w}`hAifZu^X49;kBoz{}a+?r_eVE0YUZ7e9Nn=1!~^ zQ5XsO=P|Nc{7{bI82jTFckWs2$CICJg#I^g%-u5H~;eUK{UBaHtKSupb9^Ij7t2ZFq*b% zl;m?+B|@5dJB1Iv=xpIdIaS1{L^`RB8UO3$Qccv)ujkYS*Et;^k_1MF+KBUf(@8uF zYP7{svjw8-fOKuxkr!@=d1;1M3pbD1iPlfqk9kLAH|VT4$JX*LhpK&(@C1Z5|B?^- z%Ki^I5C@N~SJ~Z{jQ5=z9JC{GBWKpHONdEAgh<*;z^2?JkGv5+7VG$VR;~kJA5UGGNFijf z>~(i-$s4L@%Cjh|32iSOz2~j;Gv5n)U)bb|FNP+;!~9YpgSb-bCsx4T10RxLSMmkJ z3m-Y7=ziIG<)M*0aoDfR6Fr0q*t-^HK9g#rM4Flf1eicfS~7l6`T5ytY4CEo=UlTNS9m@C~)6huHJQ zp6~C5FCN2*7q4n8iL0-s+I2Z&*ZjB#KNz zX*dC@kEYB{qEy&mNYulWe2H_tFC8bjmAHrE+n18~NY&uOr&;*zux| zGr#(qCs~3#_69j`iDzGiJ64SKNUuv3Dqso!nzH63tXrRS`6?GMkOs=Ak+8+m`}p(t z*?hx0&*Kf#`l@*7Bq#7|k=@4U`1v`4_e`ok3s;cH%?|8GXpboR^0B3Xj#TIt#q=|_ z_JiCN{bqKK=Ge&!udnWb%Y_D_H`I%NiKYyYf#_q9^ zMkZNN%}oDA~_M++Lg%ySLKRyFLWQhRmk6PpZ>mG`$Jzr5q;|Hf|FB8%dl z&Ec4)O0uo^y|cDAyGHPhV$-*Wq<3To++q`yy>mu63n@9YSWZ~ht#&|uCF5uhD#BK9 zQfCGN*A_*>ZM{Jo2}XUqKbXmAgiSxMW&D2wohgBAx89;^Q3bZ3#FE?3*;d^F|ep)nj z;#=OePo{vJUAP}}(Bx z@|Yyyjh^Xei{Pk2%Z7R{jq=^yQ+rITJ*%B{O{Q<9nq{9>Y}|gTH2x%?Zku4K(xp_u zpTEOi?nQd|U_#rmfQ(aaaSf4l+a!abkD3~bHQ9T z&}{UbKiUagj>GS=$_kn_0C0#8NC<=yaAN8s&~kCZ4Rri9@t;ZDpxhMl3QZhMynx|3 z1>gn4a}yyp+UU$hI(D?GZtC{wNaUb725Zk>g%JWAdpB)(1=LEbGS!Hc$6GRRy8)E}*D+hcYH`mLYWEWwo>uFc>& zp(B~e%7?%OM!+%>jqu(fhztQgpcfZT9UWmx{r`Y_brC&G2I0(^?7DXRFb2hy39~a-|Zds1ZtF~^w z=y~56>ylhw8&$L@Z0HL8Wg#uZnPNr(T&321*)^f5Ap z>PSu4<-QR0`c*M$N*lhK8pf42y(4Sp5t=9ENo&-Dk2oYZk@ZEmhHFttSgRkuEGV|L z7xEOFf5#)L-OZX5SyL|FqQ>Q?d`fNS*3ey8Pm7>kxX#q z0Yk2y^N+F$Jnpqx)3smLcsn;vCqLevt%0uK*-6s+jQ2nJ@@<`AL^C%phTkvhNP$kU zThyIbV3Ntj5|iA<51%~;CUXYE((JYr&F6&g=@PzrPLmBT*FTX~P?(lEy zGOsV6hQl8?cV_<^CIGngo}~dT{}F1if}C_-G=U>}MEUEjL6&sOJ(BGlmh))93#Ct zBZvNIL20w-`D{`f!=8H&`(qn~wB#4Q0`3VFeS}~LHim;BdP2{NY1h46A4(h5F73_{ zRS6L@JKo*qm-X5Ydkl)}srGwm(F0$p?!0}8$eX*K=K~Iyt6u6*0fW=nYyR6X3UoLR z5}z=a{Lig@NZoI~Oe@WeYp=wnp2{3U|5l_dYYS-+d)=n3*3atp@j3zCC)|c+#%cWJ zLeqOy0xQq4{&mDR*qv$VQZd%-cV=!LSJzEihomdSONS7>R^F{6{wjpfWCPV`R?fFl zlA?J$>DJKVnuvl5npEz1Vy$((;Z_w4<(7ddhap*azel4sC-~Ve(c|q0zXLH9^*KWW z=Iw_iR%KJgC@4iA9opd5&U zX?i@k{!F-qsLAMwyW8wGm!o-R*K_1@&&`$p;%?Y}>ar@>(=q=%U4h3eeROT?lK1-O zJUl9$OfU`bpI|y?*k=@hk`i6_;e1MU{g?t3Ec@_yL~4oQt<_D|?;+m#Kb-*p9QJP+ zo1Fa)eS4G1^{R|+Jn^%;rPd^B(1t8B!zE4G=+^D=^g62Dx4*CQJ~0yHa+9x!Pb_6? zM_7yrl15qNgpM9nTIn~lDwn=9`Te9BQ!pM*mnLY>CjF6#l}!#xJpVZANTK+YdLiQo z&SqeO9II527l1GRL=2Q$YFnI%eCA-Q+~@{4tUeG!2`m2eJoVA4;6?`X8Zs(^ZN^{k zIn*fQV@HXcn8TD2EHXkNfVyj5`Q?IrkGJ|Rh*96tRKEGo3-D`JYWP}lbLve3o>%*J&yWq)6 zDit+PjEq%(9qM2iW#5L;)HDL=^89J+kw|DsC3R=D?TlkjnIOpl>6)b?8rfRyR($V4 z`74rX@h|U%yL#(&Fou~8evEDrbp4h8)T>>gY_=$hrs={9-~mgC>&oy<>UqD8-+ z8V)qEZ!JvCe97PnPH`VwZNs+C+|eui>4E6VB9^z&JOR#MXxbV=?hFLhU_qp9h?hU}8s>mFF@tvUl^1!bVqXU* z8rCrvC*(KV_ODIqp|XyMWG$%@ZddU`B< zSgE^7-fR5!@T)p`d93MICLPRVE4`3C?{S9R z+~;)Xas5?HdFSz~4p!L6?y8D1NYe~~LX9_i1PnaBHA1F|4X8LLeI{l(wiWF4jCFcX z?z4KMvN?8tL|3p#5Gyq>TbhR5In|r$NAim3<(`FhRm>Q8XFjYcue~~_$Z#Nh;|l~v z7+_Gl8J`TWHYvl`y&Ai{LAK{0N*VJx{&JJ z*E3sO17C0+bQ2WGT(FTRf2QVTSjm3Az&b{>_9^F6`qo}eVO#!BiD1^&Np2T@a0}>v zul-fGQn+t-y?Od;8khRV!h4Hj>c1}8cdwC}IPFCCSuw3Sn?eOuW@$_HW}#fj$- zpGzk%yHHyPlA3d)@|3MHN^+S55j<0x2%7PGF`%myAf-CFowF=uDGoL@h^m&MO%5?4Hnfgv;VXh zoBtj@|MQZN0FSVUoScq?7>s)`fwMSR->Khu-f6(#2s=1VR6<5d>Yd?z!^PrQ!_-+H zD}fTU6{$qRpe&$%=W^m&SanCy<8yb(z7V7U<9xw&T#Jrm552v%at`;deAdzs&|a~`iKUD=~L;0wpvXl+KsckkCv zB6wCi<;A7vH6Am#Vj&>&^+%31QlX`!Xel&ruU0|=uV1R8&bw~m9E1a@kd!Voh|c0> z38!jJVtp8&AG)Z3x^wp^L`!@sGH6t zF{)_+E+mKFp&gYsAubcz_gBWF-i zEOcPmN*PA=Y?6MlPfY7%xzwZlaAZ*qS66f0%$i$0e>sY;W{%z)X%e&FLB3eNusZ-t zPS)+O8PvqcNBURk{0IK3UW!vdbw_3TvKW>P|W2&aOz@j8D0enbg7 z4m;lxY`cc=iG>T{O1*9d>U+ALeMa7HGWIsVhfnzgFTkS7>Z`BN@OryP7swtfOEEar zzbMh4kZ_Ww%CRE5Bi#8%csCY)>?@dT`dWjFc}ADKHmJu#Wz@ULnacsA09G|53J)9T z6)6eK81twVe)6^m6mNY_AlJ;NlZ3IP3?wsOFtMLXAEP1eKnlc6+<`@9q&=KlXV;Ch zURQ(=`w+O&jb1fZ00-uLGvxyo%0i?4ZR(LZ?zqB};crubva0@V-SWpt)+w#pB@fY> zs<(v{xCRPx6w+!WDvO=V-8iorylboJ%UAP`J4+IV?!$-zz`xV&lHZ;SJJ>ht?v!6# z3@Kw*A0#{^>tvvc}l8L+JsR@8|OeO{Wg? zGlHiVA!?4vZ9Eq~rQ%1U52HIAXOo(!zN`TcuZA%4rsevIpUhXrv2>R!ew}Hqr7wL4 zl#-;dNH@0&@elGSr~taK>{9heh@mU-&&E7{(}e3tnu*gAj?c->W8`|M2x`SL!-4>d z*POlB1W7fsuS6Mq;JCt15=nHp{6GGgC{Q^$4z^X)WoM5ovESRnp&-zMIyoUh%YKa= z&!goOt3{x%JqZJq6i`)=R6+&ATTUl`DP)B8LDc#BQE%KH*Z?oJ9|2fzt0|XJj}j;y9AX?rwmQuT+qDSCo7ubx|!6Fk0C;zrkou% zEJCz+*UpIRbsecsO#FWI7}Sll{%O24Mf`^)7D#-*ci){663~>f{mBKb=G+K{EqjGy zM%HfZv#(v!(3=VeLtFhJUy7XeuCwYpYI!+7rgR%=*_rIO?TJZG))^IE~)5g#Wq8qKqbUd|U=L)ew8^)9rLx zM`ib2XT-P;v$Oh^T}=!wII~m!mf=`lo8vv_!*}NH2OBl#o=+2O_pvX~ zB1ou^a{l4CN%m7ItPTINq7r%w0(zfFUI~2kc!mxQGqhJP+8G>#x#*)yK7P?kNgPgn zB+Uv#rC{{pnrc%{QtVtYTP>B>Lf<&76T#Qj=(A8jTpoxVu0(%nxq#9dUu%Hl&{ zQ%>w)3h@-dna>QvN3>5=l0n>IXn)ej%Z>>w+3EYlq6~26_LgEY!6|if_9~(aLqF54 zaD3;;mC{E{_`_7HsGsb*@Lgh2nhFX((dH;Y3BX@mjDrTLeD9bh5Cj_W2pI#h(4mDz zM1QWL67HDQ$dT_Tq#^T{Duf<%my(6+!hOl$1VI3tnSr&IcM(n4qX*;I9VpV6+xpBAWSSw6VXSccnhUoSsgAE%G!2@MYsXD_=@mf3FA zaLvG3?63^$h$0joiD((5Z8OXg_YHe{BqEYS8cNn$!C{BGFqD;F4@WpEHYSgqohE*| z_aDstCBv}$CpJ=e;p+M*XQ0dwA;~`lqK`YhA(E-1s_8<^p;IYGl5Fvym3&2Q$D+u@w zLBWbmb^i5BtIMkDmq-(Q3rf)?MEm>;02;$Kam4ATtgqln6;8c&A^N6`+W`AO(02ax zBJLG|ju=w#eSL$&$y-zm8S1u?`@KV}7Mxch&Qo;uN>k}qln4kt1Rl_zLb#ScQceF} zeF8tN2@N~ypHDrkJ#^X4a7d^RvmEwJ<#y6^epnpMa&J&ZS02EN)rcRoyrkrAoK-qS z_bto*hASVW=j?PLwD0uYRTS6_`+hxYNItJ~b<;4xVv@4AR-58QoanxaBLUHpAr6nF z*5&$44+-CYs98cv8`w8e4UJCNW)Z)+E5I^QGSbo|f(eaTtN0 zJmEf-5woU22bU7k_at`7BFKw_T+lZ5lwrVx4)RWOZC)`l7&b25vU9}!X4GoRJvlEE z2I$iS0tfY$p#o_?)}0^=oa%nWW-*Pr|92g-cu@BcbQTQ%(E=LKfTzAbek*A7tC#{a z0NPY(p9&7atX5&ocqaw2geMCKj8yjMI$(ZV@r!ouso5(P%&6gYcbjDQIo{PTZ~M~{ z6-gzSQeP75$246pqA8=9p%^2Z6Twc*Z#D;00W*i>ZkK_Gf?haV4k_YJv*yxD^0{JF zB-;2a9|uEN9D%{_FE%>1a@zQ8thHEM8+|j-2lDG)q64h3p3}Ub$7BX}K&b8Tm>ewm z4EzNUmxM~dOh(l#0D^Q)RX-1P6+Ks~T4$uq$$-)=)QH{`huT|x#YqV_fnN@K@%YD3pP78wq{wHxP1GGSZ4{7CpfO3$ ztus)Yob;qC0--7{m0cq#34$_1%)_lk44NWn*cjnRX+ei6-YlcPG*djiWn>Cf!tjMR zPjzXN;#Xx=sT&@r`-UES?#9z3;M(+;CjN|bP_4ltV{eBr7QS&~wxMY}WlElEW+bZ& zmRKBlyr`5zp@{Xg5eoh=d#O4Z0+0`F*nn2*sEijF_b_Yk;-^#SPZ-y$hX5FxA%HbS z2Lb??bpofk)`da}j~aW|GXeNz@Bm+GX2uTyM5xZPkicW9Mji;NLlCw}e=SJFt?$4d zN6qz#y`|wK(iws0d&Vf)QR)Rwyl}$`eLRNmQju! zJu}#JgxnKlTEPj*4QJ{zrCIKcOI&b@bQDK_nG$1q@7^W39-E{lcj-QE{}_QZ)v}|4 zp;bz8v4BUmx4QGXXkRS`3dpnkxP{CJ#35Gti+TV=roE-J0SNd^{qo6Eqp)RDquzbW^3%7ZZbO+q_A5ZeK;3Z~jReFY`n^8fuCm(lfK(4XxiH4YcO@bumPJ{nMZ4~KFE3{GQftg_=bVGslxsch z2M|D)!%8$p8klhn1;)d)2`6~p2xgI{0|b=gtlV8~!Ks@1KAZ7*As!C{D^{tj*{Uc- zgp1AQyTtb$27mU_D@&MgdwxtgPxJ%8y8qr-Nyptgd}d_5p>w|hEuseq?E?dlv2T{Z8wk6Kveu8&Tgjf5q{gY!hc8tfB$-;! zF|&5Yb$ahOz^XS6N7x%0pWNm100kdzlh9!uT#yiWne_Qc$@Iqtq?0#ncMYsR7|(`3 z692n;;{9(&ICC5XZ!IVSJ0W&*OveVOI^}q56&gpRcUm!~z77Fn;SD5#9DL<}mZz1gIrXCMpvCBSrYGZQJ_bPT~SVdXa`g!{}VGqu$ z4mHlwD_O18dK;<&;?m-52TUY2tC5L=5eg!pzP;7>95sx^4L4uKkMOh>+v~XT6YF}b zh~BWXwpK_G8_|7Km{ZB&O)6}tD1A0^P=F^2T!>f*#0-TUGz18k0F&=4Dq=hs3E40{ z4gg;Zg$Ilgp}CG&nnaAz(J|@jan4w<<922PGh+mnjtoQm_CMsXUbI^ z*Io1Em3RqW02lf^%fFdq(7i>f)+5GGG6n65N+om!#Sk^8`{HpFl3gx`2SW&4aDZQ0 z)bTQJIJ)>lwy%|s{zgkAq<^7qnuuiXcvgFPT^Ki$j42ww!Ey@EgPLdGa|j|nNVZ~Y zZ_8+?+Xt={-xarf_l4p$LRhvI3lu@IZw& zizJ91UW!F0i*yhJ12rra>F0=z{4HdPO*2C(hOxN{&Q@zH7_`dGs`mce6yM~&8uZH! zdu`^USTaKJKWkLXiL_<1gA@Z)qZ9-sjoOv-dsm?@zN|ct>Yq=^$Rq+4Mj9RF-o0@# zWlh?tPcNs-e!6gr2|C-j%tiWO?xaO!5|l^-0ut)ocAS{Z??WFj#18%#Zmy^39xjK2EIEcA>kp$t1> zV9R|kr~b*|n9+XiG#dOw&l=YB8j4XV>a3PW?h4GcmG)3tX-hxZB#m<6&DDO_kP z_FN{>bF7@VYE}@VV-hh=SJ=1nDLAqdNX(k8+9=LgVZ)s|OCC?0vgoUc#`z#8 zOi8bZB|)uMLe$NNdx}OLiQzAaz@d;4Va3J!<}cPj_*jDFy^`5aqe4_j4w;2M;a`U` z+HcOj6}o;t5h*# zY10VxkALj)2-q@}j8ir=s}ZP!OZb!zhkgh3n=LS}sOUfI(>^Cof{c~k$T(m&qQZ15 zZ$6@D?!8ffWz94|6m6_6hHgond5Q&68b+#h9FYD(avGZnnUB60E|dY!E0(IXGKEZF z2#UTPoh;Zz_8e6zvI`hoGY=)`K1k(eUNjb(y4&jJZP{a?%vxr4>y3Du2?!5a>`qem zVb9i=q$oo^kehHQr6RzMm{<%?T{loIhL~8m28U1rRyL1}9FxB@hL<@DL(-K zcOo0Tq%`cp%0CLLSUN{RLS-|FXBGZ}ShOM|d$Tw9n<8}kz?CnK(6E#cYOCNZKTu_n z*iWk+`CbR1Z&t1zKv+Kh){Cu^K$fou7QNNH>sa-YGRdT zzUryZd$hMOe{1yh2eVyb+{+y()82Xk8@0|bhQs7{JW&+Gz$h@TSi<0W*ofupBeSD- zm(yjFaujY`ekiG~{WTahSa{5!$ECz%?!jREwZl%pw-XY`HW)M;_C|j!8E{!rD_jSfm)>b+Y2V1zDqZT43Dn^=?K?O_=jV{i% zOWWXK&01Oc?FC?HRO&YojqAM%y$m531~!5J!|zu<;RpG#BNt~6eQHh$Zcf$Z4~guW zU3r{`PIOCUWe&F_p~e4R@lzZSW(c3FVvE%!ogDNBMPa|A_YI%ROAa8o2du zpk+LP=lix>NBZ+CJ~PgMMZ(=);8zWVPN^$3tyaj=p7KWT=|->;em#7&&&mB2Z8np` zvfF8>j{2QpwOO#wIS*Vjm)Qb_3HlstmLz`{YY}y}J3bzlTT#@0RNr_i!%^zy(&Ar5 zlpWxpJx*Uy5p5=s;znU2TRskl6B{}v{Kml^Ke%J?=HVSBAsqVmLL?emmX||T3G295 zL`sHOyY8R;JC>&iy3}avW)?qV?LXx+NHF($B(dnepGtW1=LFA}1s{_1)}_~FDr_V( z??FHRex0U+G|8WSs{?>3W0vblPMEpJrOiY*5qG(lNA=4DeOc177XMY=l$$-Y zsBCH4d4xL>h)fNWaz_iXI7-@HaztGXK$(-vEvx(`l2%Ov(-(6*)}|#H1(~aGVyhjL zB3&I?fIv$N#9})AKcc=eEb6ZN`Zq%j&Ct!zEscW2(2cZocdDf1(B0kL-K~JqAxKDz zfJjKFg!DVlec$i(KXWnP_;Tj#z0X;D?X^;q@Tf4i5yoGz>OEzJ6PObTN7uEg6Vd_m z^AzC&2-QdO;ny%>1`%@R*tfvmk-TTmO^TF)g`p;!|lCxaX z`Xxr3lHcO?rVOsl4{Y;>S`1bGJv8cPcGQ|c7+0UD3ub$FVt3y9{kfzs z&Hm;dQ@(oDw$2pM=?d;K!}#uQjH#?+CUGTH86BEE594~KI{u{sOBq|2VI%}Z*u!70 zK@OYcf*bLA*bl-R#}Imadimsv_Si&#i1bu*nBTFne0aDGX(*bORF*mL)^Sh+lQ(t^ z6RnMqUR=<9IHZ5Q2!LbFN16C#*MKrEGx$;#mpRKK*ej}IN?JcK#4^;dfsx9r)_LuJ z@nv$s*dl(Ob(I%%GO-RUXX0(xkLB90%XMuV@@P!WthzAGLYWIn*piB(XEQ{VyP6whC5yIcBLmo zF_z^>Zo<7yv|Hea_E1o(Mi&Z$W#_=^Agt&REBemn{WD5>--@xngv|qR1UDfk@iR8jci|r}=a>IqS(JKpX7Y~^3OKykn1yPDf7 zqwWpc<0m}}N$)(dd%o%dnbP^pV7PZfGkMvsSDbconjUfsB=lh@^Co9b~Qi$qtHUvt%p#|)3~2DzeFKiB{}9zJ~FJ_cHVofHC||EFWI_2K))^4&tfXdZ8sK!OCNDS75! z&dS3dGcSX3{Lk4@lO-5Uryx45iS7NWas(k}!H8rPt05M34WGvkV#o7d5C})Z3#1(n zKdzTueEu|&^%VGLJv_vBg|=UUF`_y_yMFDfk6n#&n?2v%m+V4*4c>!++y=17SkRlz z8_JX`!^YJwFa)Kjp*=d>YtK%Qyy)3idApV|FMurS=h&3hO@or7DBGSY*m&m|sb8jtXPrA?mNSauJG$nTOz5bVM9ij=m)9nty>V_A-2k(Qy}sa z`V~pg!sz54WN9+X8u*SevJ|oMZxawPC&Fa9Ts}hO_q>lc;5iU50BIbKdvw+)NzxYn z;Lq!IMC;GKqJ6pXC*bxT@@70RmZ-0CQB)8W;G>EpwG%1bn2AiT+B>i0dVWQbXK|{_ z>Mg!(u9@RvQ%u1A)5zPYkFtbhoBGT5vqfRY3_ptHkfb z;00vI@(Z2$aL>JIuvkti3e!`aE2@S%OXYWrdoso6GZmcY!7}hyt-L!C(;qZMRNo7E zik`jA6#-3cTieQec%lj>jnChF6@n*|wdNwI+@HH{ww}Dz76-28v3r%!*n9q7xkaie zPM4onuE>1iQMbE&`(u0I$*}?JPOBSjImyNFMh-3#0`+ut5s|capHl3wj3@taBNd7w z=6-$Ls8DD7>2&8s0toO&0gBLWNz9G2B%aixy5Gq2<2PVK{_S^Rz5K+jJn7Z`pa^av z27D1I(7BIJYIbz8qOTf|z=UcOC%vnudH0K*edp|4_06<%JJZJm#fH8?tAXa zMWFu_C1csW%3Q$va}(}6gCK{&E-k?s^suvcB9rHNi1v2|*1M6P;K>mXmRmY*Dm74u z{;f0~F3H(%X3b3WCojBDTq4km1FY{GJRLy9TQX~6$@B%*Z1#NnGeOk>vz1J%(t-+$v7^COE%op#jR4BR7)_F;4Y)6SXjZ<=} z&7&qWYwUjU(yhvPoU3T1iHr^lQIK8Re?ahN-|AP#u)O;2>#xtR?*<-r&bSIIWaP=d zI6SX>i9DMRj`3~b4^p{SIHw1?2=+R@V^KbnoeIWh8@^V$p!JjwXSIt2nu$ z;8@ga>@j~FpZP#S%mMJ7eZAFxZ)^$ZNYl*PQDe6ZFoyLu-{qy4(>n{BLV5ZhEobSZ z+!9o&t$agDxU4Dc_L#cXml7r<@V7g^S0aqxNuS03xT;eblR#DcvoarBJMZz)tmw3e zW<8u?P{^^&%GBnCmxLCgL|+m|sj@8d&(T|x@*)zqZ7L&H*~wn7!o9;u3TPElhlg!b z_2gn;YZm-g&Gu+{r%z^=H0gkA|HWtLg0J)Se`K_^?Qq!i53Nu@Rzg{-lLuPGN99LVANy=xDJY17|t z=Mx91xC7)9`AlTm>zsZqsXe^uPcS-uqm~hjdVZit@^!pRG;rbZt{|;>I{)L-w2b6E zZevQa+el|8OC+)(N$V8vi*<~VkEhsSnolirTl4{ZDsateauj{b<8|$=jci#?$7M~D zu`*<=|Ga*c3P&sjT0FNbbhjn_|9jtJW7j@d;ohH;uBgHEfLApwVRx*)`EI&F=!Wv1 zsXD!;DNA&!zkNZ62Q2?dAk9aRPzaFj7B*(_3wfm6yUD^>ZlkFV)LhiytYT4{D*LR~ zvuBDZ3VrKt^x{M?=~m^_7hFoj`IXtK_dx-BRF&jw*WU31w!%A0a$%NW6gaLHGg4f0 z@8P8=S(SUo*1?Cul@A`DgVI~@;1(>!g!8vd02K)x1zt)@lWrlSMUT}<56^VhN}wmd ztkv?@RfcED6G6|qY(FGMej?^gO5d#p6OOk3$h{Ep26yO8#>WeP?*C&~kr!$k$o|_%i`ZD=`T%iL>>eGC_jKpHIS%+e3XSu_X;9rge$IvE*LSDbgzJD%)%2 z*y@KB-60(a_&XKia;?$G5{7$SCPX;qwuPR80(PY`M?ByzY>h7WIJ-;za}fgOaJVru zpLe#CBDh{H{bHw09bI;FyP9HO(&?9Vn10&HmK0wW(_4V)K>>@@yyfT6knKD58dojb z8sAF|)#Zu=2twk#9mqnqu!*m4u}wf_%-ZU|=s&0nSa|TKh`-4au_H^IJdmPXhz=4X za)XsI^cNZu3dF(-hUqsTgz;37pYY&~ch0xY48^ocU$t*N6kbHRvyiYiNTW18d%c!1 zVFdCuOqhrNmhyg>_MWPnDZ^eIP`xTodmNY=V0jcFqdfC!-FOJYK(7w~#!9+t%^lrP zbVXMB^jKGPY(Ci%GOrThb-#V)9OmC=Jd@74ZSN}F`s5;e>PP%C5*Id&t#^*urz<^r zh1fW>cl5t6b@&ZL+gbkfzf+v|4q_n!w&YSo@Y3TVo~a^4P23C}0}e^o`Q#h0tVC~faFIroRB9!dIXI8$VcKmJaCsS{~Y^n%+C{SW-_s$20tiI^GN{bN78Gyi{7PEw4=VUsoHg z`0gn;wjjmLh0!CsD7aYS%Tw!dw~CLHYeeI}&x~>n?(X8w9ai5t=lvj8x-@?CUL$m?M2{ayCf>q8qxo5 zNeI6u>=EQIXV`>a(%#{p9KSo??D)L;rC-BM&o%9eP(s}Q%m(cmM8aCD+y2WR$qS-Ip)t8xF##SiR+J;Bx0Wfzat zGMjTvg@w7nm_ANe6-B|cPG8OMuIr{FCXIPOh2fX+)FV$49IxY##L}lL${e434sS}P zVZZ9?v*YLKjpUlz@nY;F3f#m&_B_0jWncvtlGN1Xwc#jZnU6fyPUoOKVgNAaA29vh zdMX(2XW1)l=wg0M$UOGz8+NvxO_0TAMrSQynWX77GC{Pt4uV$;ukkT(@g(aDEFvX# zg4l6BJ$f@F%J8ayfGt5Qq8_)}@pK(Iax}^rgS6)Hnytex1BL2ZG95S5D#-xw(J>wE zH^&26v0;T}HPedFT_h{9WuaTQq;KFT*BY`h<1spR*7^0xI{8W_e^)5>rF_K0p!y4aS@tP5%rt*jphtm~sTKMz`yvt~@;Fav|i}R<9lE z)wy+>9fWp7y$1oJb{zpmqD5gYH{aGervID5`7CT>T&m6!s5N=%7f6xv!mjgmyj*Nd zMPWjILz63d@*-z@&}q!wc;)9i-!Y8!zvv7rwiz|TZd1okF(dKa>ecxkZrEF~8H%cR z9qw1eXBiZkKSoDU`Auj`Jxf)EdgN<>oYPvh!*&r-wvty^VWh8&HG5nc3B$0&o@BzM z;82tlnJhyFV_hslXnFWB3roUlX93GNHDh9U2t5`rd9mV5MG=giF(;ZPCkzz=UO9p> z;iP{EqmLhmQ^Ew>Q)s|=aWO*{(Z2K1aH(oC?AxODTLUD_{8})jx-X3SMN5Zu3!kIw zQ@kICf3-?UEz{no@2u$@Jv$Ws*aqZQ z46EforQ&1Pv1d;H>)`Gib5J&1vzEQW@0@k=sqVUDhp9T0-q!toUW`mz-?So!5qc#o4+Z)a+AhU9@}@M#IvD|&WrDlG%~Sm!wiA- zj_jomU-<+Tu}S|#{^XSYl-1*ZBBkd%33>l8vv%(C(Zz{^GEGISQta}|MYjgdba@f?@b#ex zoz50%oSh^|S& z|B`Ia8wEiqLLI6XeHW#~UwIreb72m_vf=W(rI&GPb(C2l`B@=CT*L&NUV5rHXh5LK z#ZdXSBu=<_ajV{8d-PJ!DD2v8NIFrW-m?f7*y04>hQLvt^fL;MF!EnWz!kaRW7zJJ zdW~MAA}=J~zF?MW;RLMFL`T1A#T2v2wZ|}D%#V}P>eY<9u<&t33%>NmcGxklp*UOH zDuYW?a9U11#0b16m6YKeKV34bd|!CZq#fcl!z%?Lyu(>Lm86BSsh+(Yi8hz3d5CNCJ|}M&~KnnW?)DPhEJQ}j>dD#V*}<%P%R7U ztts)6nx+Y(Zf>IV0bOjBgTHKm1CLa^_0d;LKU;|epGswrqXmOLqS`XFyvj0OzEs;u zhXB~5OkZd(f22_}BAg-hwNIyX+`jor9updV3BUEZaW84wqhNmN>UxAMZlL@5P^NBN zUQixU6E4*|8-@QU_)U)b3X+qT->%m9H5+S(-mEujL*91-vLM0b^ZIss()h4tk5^6j zQ`9Cm9t0Q-#@%kkU6fo8LDL6gRcYYsL#%*0Jf~Qqow0 z;x+3niu6>W&4P85SPxi>8kI*ui7g%U`sc1`F+Q2Pk2K#8za=E6pxwQietQ}u$S)&r z+h%r@e4T=s+#aTA2bvPomC^BJ2>kbYbQZWZwzqnW>%00c^IkpGv(evR{9@bPFpZ4a zUrOtQWAc)MM>#n}n%(e68f7|X<#9R_AVoZTzCo=@xRv=0DxO^ zm{axIA398c<&8I$5pZ;xhQ+h7VKR(i`);F&)rAU~UYEGWAUzbz7;s3Mg9q`Jp z?Q-ySnnT~am(a2phO_r3#@>-HEh(uIoXu+|=wzR^fBG^(h^3`l(4$8zTS^@CC|CRp zclX>b9vg^`g2E?=v1BrF!G!MjDrg`bjR84CX@BvFvzulm#@_xhd?tB+ zdDGYagszgG|8u+L{$>bqfvy>Pv}@A~vtJ&QZTkNLJ}}j*$8ck}q<;0%2lv`1t2c4a zjbay$KkcviKBS15jDI<{yYK#MUU{-Sd0sG8sELK8CluNz87ZcKrrbVF*u>44Pw4^{ z1;yGqC}9tgkXeK%Lzc_+8u59T@mkS>Cvl!|Vn{2c$RrJTK*r^gfUzOS7s`lnrQ`16%_4y+pxQNzG_>$1^CBqS!QsahlwQ zMsnKCg4}51X_S^0h9uB;hUH_Gw?X8hOyoQl97?Io4>G=Ks5=s2^3Pkv+I2T0Vimff zs_JbeehN%V8xq9OR|J;=Yc9(Emd#?DHM>zq+j}_T%$U$_=C*zd?!B^>m^Vdnzi>M#JoK}?B zBU&WKjpT?mi~5`RM~3t{O`GCoy9Ozn*&xJYSaE|I;16X|$u<^NOsI4ELm|vMI#4)A zFiaX9Ww{05r(ubv=l9ei6x}9Eil3=zbxEp&SgW?^wI!NHe27>4#yDyCB#wj#8!DxW z+FU^bmvf@|4@?O9KQKWNSsD~yknmHZKN29NB|u2vfcTLfIdCD4{AfRFA|VEaM^Rlg zK`dZXRA>n87ai6ehRV8hBc!b8u_%5Z#c$-8>ndIIw&ds28FXMkg6BGq7H6zH<8qkY&6`!xLkW> z*YABsZ{}!vuo+MJecX4Y!o$lk`f@-M8J{T;!Sch?_hr>+V+xmM&@9RZXq~xcLGKX+s@xrlGdC6v0Qp{*AP>>_~xoy0+|6 zFQ2%3k3Ry-wr1RJ*L-x*u@j%%XQ-$G_E>wbNm|AqIX8+LHFQCJISi02gq$WHw{o@r zftI+e2k|8)R8}-e+5fN^#Kpw`=T+=@`56Tkt<_l0ZC*>;8RDD_`=FJRK%&1jSWMl_ z#J#g@=v-mgYy*2EC`jF+xAa@{qB;DJENc4VW7jO0aR-dSg)=sc8eP%a>*ALF6~|m{ zjg(6t;0-C!ZlbI}t14ebL^t*P zev!u3qkSSdJ<7tX63r&0GX7s_cMMpT_DQmwV_~;5i$nYlBts_dx7t_;ajqX^<{D1P z?Fz$fpst`~h9Z>kZ51jM1Y&N*Ay(TFF(kvNmrr7_&kKZ^$J6I{iF5?>XXuCq<#uQB zCJJ77-#MtffrJbRvdEhA@}^LlOa{`YpfG!}A^83EK-Ni7gP8lWf=1hE9CNi*B~kW* zScW77Z8dsx`m?nqa*e=)s1OVKBfbX%xjW~gA|29T{WVJ5)f6o!zKU41&pii#cxrv= zFPYwLuQ4cxxDP>RL=GZW(El49TOZ!dclDWM{*s7T0a@cKAN&6ydG|VdM#S^( zWEiW*jdwwxG=nyzj7_a7Mf!632SX>Z#s_sB+^Ml9A-S+Gf!O}JYsAFiJ#%zxm?r6h zA6;xQ$;~??p#@lMB@=I^Q|;($V1hfhjFoVu%D2u-B$^N!b9||0$1M$}`x3_=GylCWMhH|^QdwJz*8n%;h-s{z?;V2Ui zzkH8psNwseR?M~%On)$CQ|t}4K1K|cwbkI+BX zoIpp2yOPd_kNL}T6_X^luzD$`b@R4oK`f5f6k5lEdd zP1WYoz61a4F&uexk(BYgv~V>GsJU_&|8m-rJvMV2cY~AT97l~|R?Ot*%{JkXUErN) zx+UIyDCuMd!F`$Kvxv)3ywMy2q$g6|d-H5L@6^*q(LX6hQ|@~p(Pn3Q z*5hogfQaeoKWU?CO4%&IN%#D&@#Z##Tn3WYZ^W za5vxM*MPw}sDA?K=T$$pIWO%fc~@9aDDLyZbdsW6kB9zP1i@jnSpFFppVbAzQE(w6 zr9PIWGVAd4)F^Nf38@L3b&END<~1nKdm$CJ9wIZvi{o^qkNUxpR~qx#t*fsBYeED^ zK3Dn;f7CD*M5N!6=%6`toJa-Ax3r#+cx!oBJ#0Aqz#$Z<)bluNxDLA(^?Z|XNheo{ zLhb3)uZ|o|FcO}K3fN{Vk=u@l1+H;XBoHoNDOa=p-KE{$579j$H6LcCukxjyVs(m#;{yS#qV&~zn*l`9M&yw z({~TsAj98sZ<5L?_a*pK$hDgNw9VsLrvj4AS|Q0}olxDAMBm=eM>=l)VjYw9AUp5x zYC6if{T-eNED!g^-n`#1sCD5yA-9_EtDUXiV`*Nu`Jgm&&hSPzwxE)<%%}7vlYZN8 zV@TI?RTsZK;Tu`e7}Mn-RvYM{pXB5FJ)58!ABjItF&;!OUPm8G+P9*#&RZwQ-WE+u zmz}BRMeF*W|D`WvCj_>*J1_KitF6#92G!6=Ujfj|R*EF&Z;N;T;w^|)&Z+kvqk$q& zy(Z55FSeVOoqmpZ!Vf>Al?vXHE9~saB|7!8b=<&F**Gc;{H`-D)zIToROa;9tWTd8 zj!2mF>-E`6@=vx4-fm+ud>gYviXFc3MBIf?6%hQ6v&|*+CaBChevfqMnCGig909*V zWG=lOiL2r$*Xzl~gC*%Pca3R2k&NCJOc>J_m|52b9Ct<$SZUNgDyK%D=OY<eFK|-qcly34 z0tDfAZ+r%<;OUxJ0RsO6*o4$VXa(G1z?Aax(0`N+$~4o@S_p%7;s_RC)Jc+40*;9Yx%tsz+~=&Ild;S zvCF~#_1-%(aVlrCs&R5F?(weSXaPsYM8Homq#y&vnR&3s^mO{}x%L9;eD%?C5r zEmaT~C3f8=rUkYmJ5^j$fhgN{?pE=(@XYwtLgRkA^3JwUy+myNbjSPmj~|~}rh5Ng zv5$Jcd(D6@p`3n>b5S%69@nW&Q?N`(EB^p~_+O|Zvl=xWq*JL$oR^IEauR$?!Sk2T zkO%Tl81u4srC=f+)&M3ix}xl#<6rFi^95r%^QY45gM6BF&B)0d4Z8}Xyp=Dp9GJz7 z^+0EG0kj4#dE&}XD)fp`fm3n#%)3nK!P@jc-yMy0#E$+pk^P7>Vb8Mnv3fIcE_eOg zN*sK1*M0VzC1uz6M}RbiI&B`6gmMN=o7Q2q^`!!%wBKBl&#+(?yI|VH#TN;GQub54yECA6rZ&+GWYj8bS zr(>=(7n82%v6R)!u1(A$lWyy;Z@wLS-w6Xipt6uN)hZ(!5wUNh)hgo>#Kq?6tG(<^ zg|ruTbV2<~sfGZ+qd)pQ$iz-M@S<{p9-A^x*q%k=uuh(mF?;OtafUfL7V&jBt*wO&`V= zt9C-U8cs?S_RqoOk;Zu_rpaE$H}5VQ#AXG|P5(N@&BeTt`e*A9@MqFeKpyQY=cAO8 zRYs})X=}8i-m@7E9r~R=g94jSF?vBKm#HX>Gr(lV@17@C5E`Nz(0H`?&CEdeNvB;) zZg6yZDwT+7u!50fN&k<8Y2o35iq_S;niqHsGKc(zny!S!HN_myCHLcqK!-v{6N%I< zq3Ap`TrM3wj$r1si8a3;F0#SS^;iTx^P+wHMhEstPnV~)DVWk<#JCIf6%+TT^X+mq zOwQLYJe64ZVW~7y;=RwYiAYfBgG;}feV3KfczYurP{o9yh>`Dsmtcz>KnMcenM&X7u06!?xj2c}yyvExdNV`Bk8xsNp09^%a`F?9ZA%c5M>q zLDntzKiPh3eAkjM`B3MkGRGSsElBq~5ev@Oa!!3`FbM#|cXSn#v~Yi%q+r#zZ`?m$ zFcg*VLJ{`l@0!E5P`Zqp*SGofg+>aL>IyWcfvD@6iWShAV@JF!1CSJ7U;3FBXM1c> zD+G`onpE_B>hbcZ-H`$%X_1pD9@Mtql^rdLdyYqgQuuS=-UG}~*xHI|w%ZgD!tH#Ok z(YouV;l(!TUN{SOm|3g3n6%_<#S~H{DysXLMp^7vkEma`00QB}>g$!Zuvs6Ek8AP5*7$Js zV_9Nl?!m@XVBECs3L_X?w?yL<0OzmMC?t>Ii2+PsCZ;XddWmwp-ZSdDTAwPKt1VW9 zOL(cPNGV9hw)*PXMq~pznzpE<`z?t8zyohcs=`q zUg1T49RF=<^BG5ccr4h2H?8I-yV?~|kzwYXlf{PSyE%Y*W}(3SbwP>XB>&NOF&T8u zyGAK$z8`iH&;Yh4e^eksp=bE8b;D=#NF%me6lOC112xXPzx?d^l{M?lo8=j61p*OXq$LVGEEv~Agn1Uc!>xm=b~xEKnVXlL|7h-UKyoM;Dh)3s`l(j{xF zJooa93AFF;D0=9cziC4Sp8krQJ)O_Q%3&qrSPS@|5)&fJyX2<{w@;3xtH(1EMfrj?al( zS@qV0p1-lo5%D|&f~sY@dTRQv0IScj+75QIEs3c1tQ8NvL&9=C9(5~=bLtjONWz%z z;w1N^)-P3K?B}Y%i&|VxVv8zYNo}>F&YByTfjY}^N9(`4k7zoNBq|%hLBHq{8jx(1 zATt;4mM&yNXkUiXR`5Hf+ESXawVIM+TLZ<9&gL(2`A(uoN(2G%SY>YpHxYe*=t8L6 z-*18TwC^y^zN2U;V*rRFz}2U8{9q)`y>+xUnj?wghhsur*}H&y5e{)vBR>VU%s0;^ zUIQOpr!5A=uJNNx^tkmUa9%A2!KuzroRL;#X@JCKjiQT*D*@j37M`PboURw+R@pnI zdYiP7`f3~D=XtW%6NlxTqE{EuS2ML{6WBnVSFykr_5&IGi{<5H&BC_x0~tPZ{EzWU zA|vYte&htDmmtj_(+M=xoLIu9w_sBZ-X&kyQ9jOw)*M)uX(oUYl|bl_=LICS;cF`_=L_ zND)zmIFsXsmWNlfc)(5c_h6ihuc5-28E?2UM96M}LT45<+lu~)47Gi51;(0c1iq8i z$v^P`bXi+BT(@;q9D&AA?MwuoIxjd!O7cX^Th(7@ec5akZm?EnYh77dKgdmZpR(Ti z!iDd8S|nu@C+=Cn8nb3eX}0T%%0&+Smn$bjJDU_~s+YacW=cO39>p(g_knM*Am()o zxg9j00Skl5FjQX7OOJ6M7m)ws13ejK%|N1PZ$rN4v^B1UJ&HzrDypK+%quxY4&89f zWXgpYZK$CrBm=>3k!3k2$oFj|pW$0vqJh&F5rzIz&hpAMs*1tw3MZhn>w5AjuM5{BGNH=v1&neE3Q36|U3R-oN|y zYC}rqJW$nh$n>T1xB(4{sL-x_;k+-;f>86HCS#FZhb6e#SfOs(ETup} z!qx3Cz8&Ev19F#sIo*o%WJg(9beirN(uIz2g0V<8Rg77BrB7g3Mb9EXf=|CX4fXi5 zt;4Yacj-1%n%&7MnRrZgM;Z#jR3gzwx0vgaN!JYLE)7kOp#)It7-Tu(pf+DqV?MJ5 z*LW%&4p8Fgl@RP|4Y_}B#Q}BWfPbdB9!AYWES~uMDtV_*}*2a zF4Vh74&W|ti6iI5X-C9Cnru7?8Lgs)N&P^Ru~R3Pf4o|YNaXk^HS1ti`Z}6IRU8bW zB=a#GrZy8q17iRazJKg1|Mmm+jlMCzZ&z_4Kp$ zqOe$Ct*YFS{8!$;LGsbT(s&Zb>%DkkIx1F}VLA4#Ju?5kTh@vretlo#X+bGv_0e*9 zY=oh-hE`}CH}J=2uG2nr)PsV>rI(tS?nTl4G)06ZFHD{gvwc}|=>IV%i?d~UvD*sj z{n(w7Mm!iSJM2{QkuU-dCd$HULiSOMXQd)iQf79Os$8BLB3t|XrDmjdlMK5oH}fB| zm{H+)n9f%9*qnHLwP?bE{EV#pG&ZT4zM5LUqlOU*K4)$p!DeC0>Z6JVswabs1ctXYs(2O zu$qdJmDrk9ildTi_^Pw*k7fTKPeI1J_gY{)?3Jbp9 z(%o&h=3*{`Gz*U{A&cV^mWE!(#NBV!a8Pi7 z=NvJGz1a?fq%34JDozd_N9BvL%`lin;>J=VI{v>`2l7^0W_!O_8n0I|9U4YwNE&_R zCh##|Zxzq<;iuAm1qXNcFf(&CsdCH9%pPV8w00)$9$O7vn5^JWh4w*M+0PRHN)zya zK{bS++D2DB7DVv6puGfQ3CcaoH|+xteXawCS0H0RX)qrJU>YvAl1}G{uqETILUEvm z6Ge|of9_z8%s#vzuMB>dql3X4vJ6J-z5;<@&LL1RCR9s2{;Wl+&eR5riuz**7=m4n zCtbIVo?kMoU#iPZB+~ST6Rh9tSW1cYKMnsWo0}l3Iu}&ZZ7pt8iH*nN)7fO4^RGzQ zNPYH4{$7c;QPj+qC}eF(EzfY+KKI}1fp7q}_s+lnY;5hUAR+CgB03#v5g*>1oSI9h z>1H__svQ3|m6L8sicPTmyJqilr41Cj=61PFr5hE!=#BFVLCi?P&IQ>)zrVld z>pEGb-vm1yRw9tK=AWNZ^cZpsw4|Eycy>$Dnx@sm%3^7w$vrZA$LD;E{v^^Cln5h5 zc?Kw@0pXu}-PB(iHW&90lf&Wb%wafe==4S-w%>U8-%8+Fu!$2HnL1NdA(cN=n_;|R zm>`yqUk(ioVz7L$>hU;XY&Ak1_JVT%vtu<(FH`+R7sAlQ``%XEGkY7~NvSCbxeazg zZ91pKKMNY$EhQ00L|xUvz|6pM<=>7c;%|_*Jmi8IB%cp?dX?Vi@{+AIU-d(6CxjC-r2;1@)tF`ef zZ*aYd_~j&Br#TX}M>!v2z6A}(g>dKmq$5Nn7@q2&tsT;JM-BExvqZ6E(tXv43M9X$ z#qGsJg(H$)T3XCWV}gzBU7o|2`AD~bPllQKZ%iyxy7>FiyJpp z=4t(^b!U>m!;8dX56F2Z>5bWB=`L~MPpRKG*2@9|fA=g9V*zR%+3mQI|3b7$4*IR! ze4H89{13~Y;_k}zdc|hVbZ_z2xbeNF+ZS2tZhu!w6PPs)?13v2-CEI8vYtT?R6ZrII2nYl5LV zIk*~|GlEth7feJ%PQ@DmfPjwul8QQPZ2A(f5%aGCQvcx&SO14QC?kJzriJgqbkIi( zqyZ-$@{i~dK+Z}~KH?)k*htC);Uo1U*`noOm$9-g)CsDovqo7@iY;LjuT^;vWUn0j zx_3FlL-|ogQ&fMq(r&@ z>CGUS2ADF7i{JkuFL-v(1P z%)9YSCAN>`6rch)y^AdOC4e563!rcZrw2A(#=zSq2V#^*GKUCwaY6}LbkJwK#iCs1 zZuKA0fO-bYFY-tx9d?PXb5m7^XOrHXqfUJDoT3p)IteF|4i@Odtz&l+G~21fYkJZy zu<`STZbFxuYvF^-(@(Zu(s5Bs(NHJkWYa4ejLZYPOP3Bkq5q^pAbS@n#|k44Y?lUZ zC2pTrnO)sEBRIQoVYGn%96!Z<2i5cXoU9eXgj=I&DfVP}>&ZPu3%u$ZS|`MSr}=z% zx+iKG$+3>mpBEKavzJ}YE|LXg5r~SjD^A-moRTPFjP@vW5O#pU2(B~<#dl5K7%WS$ zxJO460|R*`jYEl+ur+24&TK+(jMM?s&c@@V$`uEbnN8n(3~(`Ntu2WjP7}IQiNz!%@(Rv13T2!)dDfX1``NPEM&N zbMOl5Ym<((6yX*nXh2cu`CaVi=}YL@wWqN75k-|)dMLPE2B1);qE!`rSx!|KhxNFZ zRr}0~8nRq*Ej1A_F*#1h5&15tK!M>fJOVj2kMh*wmx!OxYT5RC%^OnJp%QUz3Azd1 z!qbOaPYz&!X#XSWuT^iP)(}o>mDj&78bC^Z$j0gG<%j`b&4b(QFp((wbo6zklsyYg zpnwnYUrw97Ye^F~ar(a7hd)v6^|g7j9<LNVckoD>@z~U1T?iMh{z;m$moF<EsJo5)2~d$C9WP!W9}J%v3l49w9rD z-bV~4hj4LC)a%=-bJx{G&*{gQ*94b`$1rE(;2_IWI4t7wYf*R|-`-j+A7A}LXnXW? z>$s~5Pq8|Kk?EyTsu6-7?{h50H<)CNSAt1rX3DQ3N$3VQX^9rO7dOf27X0l4NBlD@uiA9zZ6jP_>ofJCCbM84Oqx=97UOwI2%F+PnS6j6{R$! z;byVj9Kce`oV7&z5EiJ625Fl$3pGTf{lvoIVCcyD{s$Fg)11K^EZ4?cf;32?2BV%3 zyyBHMzym?hAiI3z&RF9X=%KNu2U2O$127Z;Mpa24zo4+_<%hQl4g(CaSpHo`Poh{Y z_d;rPW#V}2jPxl<$sG+liR&m?00|?Z)yThYvr^`L`gO$YnvaT3xv1FJ^aZt7Q4?aW zjSn6Z5NT90$LsJnY>6sLCG;Ze9eeo1ZjoRz0ZD*57|KJ8sbNC;zly zxu141PcFxR_UfS?p*uMe;N?e^YX`@N$K#n?RrAgf`3P2Y^szJZ?}! zeogp52xVd&RsRIr?CHVTnL>C=^&;~eC&)YX5d=9+yA*HKU<9^`Wl$Y+5_K4_mVGq= z0#bs;OIQV@q2Qp);+M&XbnK#8qij+0nGf=F5T%rpg2kDcdC5tF<8hD-W+;Jd@ho_s z6J1kdUXLW;HJ(efP{t)kM6o51AzTHfHBy5!?FMDVgrfCMdsUSFrZZwc3#y>rC>cA` zeTxL-!js(hpVQJUAscl#?rpf~68}X;-Q8IF=JjMIxJahkYJv}S{z~$(iZY{$&$U)d zddWjz$y6%@i(GH=mBe{V^n%1W(=4+?438ViuzD8ucWY)Ve(SFbFAi!dYB`vbj@gg2 zS=}_F4wog;br4PFo7_vZ+?YCLw{=S-0EB&QHk}0Az$^SLL65N9C3t|{G7cM7x~Qwj z&Dz|G8x9an*sP`uWE3w&bB9R*F*336|3}nUM#ZtU&GroL5Znoppus(a!9Bq>IKc@P zoWS7jf#B}$4grD&cbDMqu6N#Z&RyT0wdP0vm^Hn7_m--9s#LV%Kl=NbsG1|2u`Swa4j0-+|E3BKJA6B zoqv`USW+Fy$Hy6rktbs?fTQ++)ui)o@*JD|CLM4iL|X9PYuqzsrh>N)#l*FHJR4w| z`d;wnJR?`!j{If+u+4FVI)aNKFCYd{R9xn0#7$B<1rRB}+eMD9Vs{9_2DF0ex-7a4 z69a*sW_WwVdI?5)_^Jj>kwlzG+^-hRg5#`r;mO|$+-mT^L&Nj65@s2i6pv&YHxj&xYf%dnYXb> z)B1?p65|ltL-D61ZoP>}P<#+dh9wQN*C`e3D>KbPRbt<)XI`Cd4F5x!Lj*A)+I@xm zMT6^(|Mo=;&B({^To*ewtU&bOJ3xK2#}HIWWTaR#Z)Z-D_XLj37 z=$PI0-a#YPO4&5g$9cu6Z)jy#{ahZDYwg9Wj7lD)Ph~}jJn=&}nSrs_unS_K(F;Kq zwXo`WgS&31$itTf2a1>_SW6TwRxwU+{3`4vdhW-RMNnVfJmbnvL_Njvsa@zwH_rzWncodC5ev<{F`q=fhztIpm41 zvH$b}v;_Ec5eu+s7XL~LsI@8|RriRniY=57i^f*1D$CeJ9D!Dl_`7jP-mn>5lTHDA{EdEXL6jsPgs{dT^d#E3wLAKTwzrkrQU4+YC? zGb;fdPZsy`f=Vjd*1LSAbqXld*GAdcb}2ZrS~)JaK1XZ*TcXhtp(bLf-EWe(yE#4P)1*+ zZNnlO^k6w_9;)hQ^`yq})gVT!0& z!R~qaM6!+y!m+fQGMy57y0_u~bWCQf**^O-hC@p}$iQKk-h}4P)#ZlDJM|D)cXp?c z#v~&!``ALLfWwyN=%Oe1Bp*b+FBW?E^TcVR>VnZpN+iNvf*_Y;0)eY{E9r!mC?xa! zJ~cB?=+sv)f{0gUq~#OZNp(uXTHRd%79FT5rHIaaX~6K! ztBl91w$`d9?;12uG=_pSY29ExVkN{_K_J($C&GypXku8-N-w)2lli$l{ zYwDjQX;VJT4O*JC9VfjOKV9(F);;QDj!<^Pjp+Ygfw}X_Rh1n+ciA(8VH+K}kTwm$ zV+U0gUGnk+0|CsXd;owJJ8*uh{Q9%7SRDsV^ov0U7z{H()Z*bTnv|7uw3aoe2G!>_ zv6OPfh1iJ0&(&9&gR?@j*;&DZxaANa0f7!7oyT{v0hPwk#$p*H8iHV6d02dl_@xa# zlH`wnJSLJqRj>$?0iHN~De|0vT2;6R3px{Hwq;LOts>y1W22pWwrXBMT?zHBnSM}( zfk!F^KBFc~czbL+VSfYx=qU9)SyeNWw>N-%88%Dak&A|Ip=rIImRpT&bWHp2JA`Tf z_4?d&s1I?Mt)jZPM9nJI$;QJ5W&i9%N54teWg?Yb^|k71PWvG~E}oM2CNz&7$)6dl zyCB{=c4PllXJ(v!(5-F4)v2@fuK{ImjfmKmuFe9=CMqMXv5r7){%^_94=m75Db$|I zPEnC8$S#hq1-7T@hYD>_eqVn+Kr<-hA04gI?NSsDOkef|TbP7n%6IEA~bf#v!4Shn8_7C}MfXAgNB0!?jO9?PWAmtJ)O%|kI0sW#SS<98C#ZiHp)y&C#r zRDR3_ybTs*+}{rW9bDK(4Sx4`dEque^RD`&qpZW}A02ET_Lw+hUom*8nC`O2f9{1}!U!#{@TlWV1wkr{>xfRlwYm(Da17L97X?k~ z^=jj;^Y+GS6kWWrGY(0Z#wh0Pw+d5r78T`IYNY_$fviq3LWAHuJgt$i5CnG|st)5? zW@OC>#Vq!SkXMQ{K;kq;?k1nEtf&O)z}H~)J2zmKAq64?c|cGsR`rv#qyGrg({{`jN**aL4BCKFjH1 zA`ZVG?|n%JbSy0po38H;{VTeNUhr7><*9CMi-jBHi21?e*TE7a$cyL=FlNT~QD0b; zb};5{${|?f>#=s&H~nWJrkt{{^SuR>`5PSf?ZSsTy%n9hfKm&smsZ?N1n84P+dPOT zHj_Ymi>$Fj8XFg>;AYDv@(N4_Io!OUbSnkr-ltz843)0G z=hbSMpGl7xaebfbO^uqd$xiN>fDVME`soG?eA^bP{|!k1vhgN0rdR%9hjd-^ia>{^ zjh$G5?|RtlX!Uv(1R46n^zcJ`s+aiwaRALlTqnL&z*PiKi7o zE^?9q(f5aENs|NyV|N(miGnaAz$VyD9bB&!tL4Yqy5PflMS<>E^z3jGVomEHNi(9M^Bv%hLwfs^Z$WPLW=(bBVn_Clq?Rvsu-W9>=WbP?%mP zWMa6EPCOlqQ#H4rIa$TS{p<@t9@=CqN=yvQrc#j?TeCyRkhj?F2 zWX;-=KDRv_MQrq!_d05TNUUbbhBl*-Um}WVf~h=+W8ZEV9=oV#4bhO;kDM5FAqJnu zjymX7w}UzkbZD-=h+{uigCbFuqhVW2_fsv%HW~?x4uF}_S~HVC5P#4&o#I~XWJUVg z4iS1&a@N-ib=jIZHPJ{R&AZAl!Z@DKwAVXR1_^CGjO9(d$J02>z8iexhr2oMb-6dO z)jZny`ir@`p4;sPOu`6hvt8s_Nd8ZA3q2(By#38~!uQ8f!dF0rOPJID0S=m{8OA3n zemL`^n4ilqQ$fUL>O3Dk0&n8|ujsGmo;S#^?H-O9iWxBwL>`t)H`XJ5GGZr<2$)F2 z!PE9Q4QnI2bmDW`>dY1*hmcQ?IFwk}{Xm5z%u^r}RY{j;N_G(7g_VrfUrO`o5z*%k z)l1O!9dO1In}=gNm`g|#A;*YLG#+(hgyYX)TjBj6uB2a--l)R{L}|B8B_uIrcJZ~k zrd_}1G8F)%I1#Zhm(lsGyiqWL()0w&%zh_NXl&R0jo)7Uu@b5Tmr@XrZdKNmwRu6PKkf9Ux&G)DK>Vd!(Wm?!eXRIl`{S<2?w^LcuXu< z!y4|Ndr#y1wx1D6k4|F`JOR7T?i6?%6+zwxjhgQQ^Pbw)pzzLxoor$k>*(nq)0=7r zZGdAzjWniNwEhdjALwUl#wcz@xG+&3uymDC#(Zb!92M6VffYueGs^%6LFnrRWUKvQ z!^{}$FU$zoG1>l9B*|P&En3yiEYViTu3AWNy}q6KVgUx4ENlP~{EQI_IzVO8Dos*D z7)wyT?}`ct$BO|G_>_;NmAY_**mMw330E)$+O}lYgBpd}_<*Swco)XKF z8CX(4d{}xEC^e1ymqq2DJDQio9O`B~@Vq$O#Q}E9vN4OS!WrIs-|fH_TVdT9;+?Cm zHy)Io8)5S)QJ>v4XqY>&yaOAT>?nBsB&7zkxB9;#ef_2e_d$AKf%$o&_c!twU{g-s zFqu&0!?mbU#xo(}=Z1#`m#r;rJ|p<)C^Q<{p(0FREa+gs3~ok(i>{OZ%bVh!Ev9;X z;{L6G0)<2XlYIr5*GOyLmk6#an9MXHoWJfUVFFRKqLJfE2On_-Dgb(I0Jn)sGlz`v z;J)9d_Hig2fm88TZ4F=2P-cXTcZuA@S*y&qZ2Db5Ja4G6kD9%O1ZYLpsX7pL+NM?T zf7G%*r&AL)XY4~h;cOeRqgK7pt9V8SPGNg%PZiw`8A3kICIi3a3L55Qw10q4AV!F& z=BJrw{TE7Ps_+ANsMCk25mJVxix}1M{hQ<}WmKApY(|2I?>N|a^l(Z^cBUc@K*;{Y z=z}ADwH2ti_lHo}K?$rO0hNID#VpAQx+(nno@U1& z8WeZF7lRZ+N|@SBR_3(%&teBC-Vmknzdd%DK>(I)fc_^-W#aQC|EI1vmxoGDVO729 zAmH^6R0D%se6w-@&>rdiSp61I9h#ZIQ+&U2bJdelLh>HrG_z`$^p%6uwZ;~+t)5R= zTsG!O>BDUf?=CSDW<7QJ@Qg&+&71R189rcldt|kVp$O{xy()vcSSX7%AW{sDQ_SUt zz3xYZ@%;6i&(nBWH`SgYa=gYzv{37HIvJ8w67832#fJ1C0^l=cCe?wo3^?gH&&AZG zk=<#2Lx$0#7Jb9H)HKI1BmH9j2YeFLm`=?#W(J@kOHI!8Brh>go|L&xa-5Q!`yKnWJ`(QzIFC>GLE{%w1 zoI^ZYqjWAW^(Aj=3NYAJmd}QDoWjKwY6B|o|0-&0W5vHUbGuC{IoHJ`hO8fLXsR_` z6|&nk9}QBl*uX&=x8|)YA)%;FV}GfT>KfXpe21$if`sc>@wDd!E?H}^wEgUiezKfj zs5Y7=vT;VP9t`KL`eX)j%gOg+e!)65iJuVs`pN;!o|s?4UzTP4gg#lp9oE-Pc>~e- z2$>bq;#B-Ix9;@~j2<&x>GLx%)$4GLg;X9M)Ap^{TbVSr=i)wQ#v0B6yT}NkWj;Fb zIXl~3Uxw{O0*!+tz1fkS-Z$Un&3=9O@CxHuR-s+07RxFL+o*0%S-TKs%Lg}F`!PJY z_;*dh`6*=vpY-Lm_Rx)DRJvd;ZXj3I}-M(CYmV zaYs#x>uwLPd-GW2i$!X5#pk$T{;S^V8jaN54E>~R0c>*qBgPEpP31w(OpLVzv(<-h z*vh_;`ybhp#N2Qk%K2j0Ef%;BN9e3BSy!J|KS^Wi4wbe)zm`U~ zzUzr3<-?deL(JUf03F+P{)EdNFK53gt!qO0cltDMI%k_Yzj0MK32&a<*FdxVc9D2! zCHr9UHD;+-cSTbaS3EXn+D0sK`g4Cf?Jq`Es3LAFPvlfCw!i%AyK_PJPyoBo%eIl3 znz&mmG2(>Wozl09Z<9D^bwa+=11}_hjqe?cZ2 z&j)6cXldGsTw_lCTBx_uKINAD+T7Qb@nLF_N-V{={9SrWyQV`k5zKg#-aWT+PMt0fV< zVO@s|eKz+;t4$(&4Ed!fHf#Bx{ac6oh9Oy7zeuVG&@DD{S5HPdb$u8tSwJM2tgZeq z+r{(uG>{<%-}cKB-u zDZLXWvsrlR!tcL&WL4Gus^~ktZR6Bj~z-x zT?d<(H_9%bvvMgCU}ehXN#?9Nqt9GxpWA0K$w$2&k1`N}Dc{bN;o~6hz&C0Y8WfpA z2i`=g8%X{C%TyT!p{J&B86&@%v$0x6iqa@A%xQkV-9(;$QfhIp*z|LnyV-M3tJ@~0 z=J?mk2^DY|x)oq^H}MRoOk>YGgq0a|hm|vR{&7kuvOQ1@CZ|Ea*#Fr0Eb*j8v4W-$ z&-Zd`J3i|3xx6?xzS_L*o?^LupLoDlf#`}A2LKkD=|Z9uab=M#EEAv&YlN0$OOOAX zZ?D@NXQCEP|2yq=^e~?OCgR^cA=T$?R5#u34$da-T`@S`s3_resq%$e zAvjFPcPTqR5zyIgr&bxUbA7BG^V8pw8fAK6Xga%KJi53wZD({$CRFvfc?kEQuAf$G z!*%6|j~2^(ZjW8mGH{*)5{6n7LoIhn!LG!iIv3bs9rc^}> z9uO6fL?=9@$*I<#nwrvpr6?t8=t8BV?+CBwEBmcLT~1l@7TpD2N!x$JCmglZRYnPX=6ZMU*!} zVt(rsOfA<6(jm>-+IqD-ggw~YJ(3TD0E$-bLz+tza#Zm)oj0q7dghk6W}Qc}=L#_}bzLmG)9!9)XPMhwEUV>*l?g30=_k64bn?@thAoIxe|7{c)Bcm?n1__Z0*f0K zF|N2(OGf5fQk-g6%}AdE)1usUKZ{Yx-BD!42+7QiMymk5{xVyKr5K5n9}35QV>k4+-akVZdwvxSecr-1l!Ip$_I#czL4%!O;CYaHoo31>GS;-= z@|y9KGZpEJ?^-?Ou50UWd9kKZ{_F24_;vsB&hpx}(z^%T6s6Xrn^oS65pU}KSgj~e zzN;uzFC31ZceHIgxNN%C6l}RGdQ&uIEtzc#c$1p9%%F+|Lt~G|e&Ir8TY~)@m60|u zd+D5m%^YI<=hsA}_U*XX7xMy5KN|-+9r-Yha%zigBI2{UP#qqrZ>AC}1_2(6igyAa zR1wIB1jlW`Ce1lA@;>nMn2%Jn7X@pV*uA?g{U}jn- zC!Iy6Byt|q!CO-y@og%&Bw%64xD$%iCw});ATf$xG7Y~GdL57ANR{znb!Obz z`d=LjRl$>foYG5AoV`v1+owMVS|2fj1gHvTKPbE%gHp3s)WIx|lLB|uq~SQk zw{O1S!%xEHd_D%yAvsHWP-ecn;SskpEi08s)kCMLPOhCeurn6nzP1niM4lp z+_w|^c=EZ%+EPW0fAp&r(I@L|k!i{hoc5%zD^EQWVRH^=Pt%r1AYdg$;gGo7Cz-tA zy&V22g^_&K`e{j z3@=qmNfPo0vvSJ&6;rYuC*CW`NxT>?mI5h6)zKsnvZ{2ZtMa{wDge#g>bV&iLS18c zpjf`IJF~0qIU3XxYJZ8+YdAjHi$=rA$9p@ILOmt-cpbQ6){SdgE9SSsh4O2E6EE^b z13uIl{)>1hAGkRq$H!mIFF>PL2V_@i&ZSKZG-o+ZR?Z-*0?V&vR~PQp^Ndf1+T8o3 zy3x_+A8wRoEKOfwE`9#Sh;0K6{C%O;4}EhRWkCv{x*-zzrk;J{$vitKg`)zTTT5Bo zdky@L8(m4&D|ZVgbmO=0?JR)R7bz5?laN`5%J{p+YRiR0>ee@0FNo#xPC>)~GHd zJ#;sOBe?Y5nyGAL6f_jR*5;x)@OZXnnsj+LZ8)7T^)bkWA#iJPQ)iD|u8^Sh2V-ES zY47D+i|_0kqG}D~rWag<_uJnvC_QBkrcpCo-}|mfSqK!URreuvxa852@XTxb0w(-J z))v8=MRV`#G)m-Zuun2C<`=Ze*oIK>!mFRt1gwA3Vq||Ssu_ZjLZpT3MCW0W8=qY(up-{sFSw=X7;x!BCQvS(ic&sH{vIDCo)egaI~w**H1 z)qZQ&OYN=PkiSpgHuvS=FY7#@-xnJg4jX8j|2@ey&g(zYu~dX5rMUdP|7zI%HVtm) zty3GW7)wru|HkIGpn02lGOuKm(bbvI$*4FIQQPJ!v%xa%cubruvD3Qm+gvUmS}>Oa zcBd=Sc{&{W8v-7(@y#poBzHTLa{-v3unm^oA|4@+X)w1nKMtdAeC@264fa~v98#=9_NZ31g}fvW*tipeH<5Jfyv{0zOuHQt1Ey>%epM{9 ziRQ?Zws5CVFJYq1)ysh`;0_-W=QaQBwdkInoAZa`ohz61ONVEhV|}Zz`6mg=$D+IA z>*ti}PYx4J%WVY0=ff9I^vo3B`{nv$!<6;HJ#G_QFe3L!RfZAh%(#+6?nM{f0qa#a zffA|FG=KT>4J~io5QE~Sso+9aeK=&T$6)E5u&a0I<~+O*n|QZal=t4_BK1Xc28#_m ziy6wa~!?M!0X5V97T%x!Am_oA){f$~A zl1!&;N-&+uRGS@q!!4!YrjqnYKUg_!3jHPg19mQp5mK?wB3sKZ|CMZvfp-i?ps@^B zUV_kA0D@<;6#~#4m-qYrE5=b>ELrHIw&!dOW)7i@O2|Nbc)Ge>)mD8xf8L!fZz5YR zTc9<$sqa6$^SDJVy4F@(sLGjqX*OFaiDmSW7$qdX4iH75bHy_EsC7ih!`tKbVY_!K zR4>aFcn2-iFuq?(mTCeDwdYfp^R((`9SOr{k`_d|V{17F-Nwak!brx!9(r5BC%Q0W zqTk6uh7bVqZI$U00O1|>$3dUWBp!R%q^k%rTG>NOa}R%$p*mNO(77ZBT}KbE6vWpqrl_>#WW~TKxw}R1@~dkZT{YuO7;_p zm(|r8O{Y)b42zy#L9A=uB_tvsDrf_=pTrt$E|%+gYOeEW|1<;m&>b^E(d<5fusdYH z4Lnq@J`*H93^jQEivn<6{5c$}dK-6l*;u4)d%C!87?*VDB6o>VqT{_}`{%4+xV zjnl&n*X^3vT$^^X$2u{j?rM`_)8_!O_I4~r>yoDTyqUF=u)-wQe?};|0}c;o;79B? zS5Xw#f%LUAcBDh&%r{_o(P}dxM@KFc3NC1K&bk;N9&m7n-&?msB2E(M_hC`^vB{oH z0fBA7i2((G9*3&KCSlnu@`|09h=fE;utCOnatIed8#gN|xCp8I-KVGqhh`uM747>m zK}8cK;dV0@l}L|_nrWXI!=((_LS_)aU?T?%6!>Gv){%c?6YyjMz`puaotFwj=HA9r zUyWnT>o;$Jb}NNTe8RXK$v&1_JXbp43SoCp>9beBK7esxsjRE=03Frp*K&a)Loa0v`X*(DTwKaup0953yE)o_W zhzy4V1r8^+7&;51=1)T)A4>H@Tuk;gb=L(y518~XHV}@<&3yg)P?6q1-vigu_-Ca zmR?h?t$0)n#9X_nMEWD-f+{A=I;jJ4aMEddl`!gG@YN(ODM3-0RxU(tIj=Ra(OBI+ zTHTiQXe+HuT5uo~E3zTk*yF>fjZz^8?M0SDqrCmvHF|7ToPBiaXH_6`eBV%A(;xri zvzo}{v;@~Kt1=hHTI$m&Jk0Wvt;7e}y*Zwn*~}Wm#xM4|`Gk#{QI)1~xjWAI-(m-7 z-2cH03b4(=2zEOu6$4DDzy*u5#E<|-X<0LDwR$$C@_`!y;EtPEaVYMdfIB3^g7oIS&QS5q3@+UeCVFz#X=uAJlX89QX=1~u~ejn4s_Jlm> z`Hgh#wIU7CyNB0Qb(fLwX)1mApX|PK`Bi|drlN?0prP3!CVB6l_?Q_GqjA0o&Es}K z0Drk#j#of*dN=@09ZHI~g@WMH6<5jp0L5-2`4V3!J>r4HSKwTm;Aj^v4$zsuXtd9) zT``Q#R@}9gEU7$VBgdfX;eq2wl&KA3$F@ljh=eq&z+4X&)Fd?WM63mg(Nr$=jgX#8 z$}X7{xN0$Z$+Vk(T5X-5=<`PewTVy zi*k{CzZvg0tQ#0DHUP<=nobro0YRe$wMI|GQ8THvo-;xg2bZEMIb{E|`J$ft z)>&neIxJeD{4mnTLgsiaJ!{#MWQa5(kH<(&yDp6=D*S_<5j-7%nNw3nbv8Rl&ez=a(%lJ#aLL zC|=0@0wje8%05wb!-#+b%u)V)1V-8|i(Uh6GRY?hB|& zUBokhCkrolm1wnMT^?6qJH93g>&EllF>41I{2>y`VS^NCWM*x600Zzc$e28t|JTP_ zv3m8Z?ngn^2G%&MpD$(=?nf(Mr)pFsm)yMV-;?vo9nE66*|IM-R-~9Z-xt66TVNmb zv^qRdPyE^y4nysviI*^=ga^pFm3(rWk3)u-Gqsd_LLu%4dXlcWbuIjmpoXOwG0Jd} zf)1HB52QB0tYHbYt=VD|;HoSakXBL$A23n$zRN4^YM$wcogb&M(E;MLf&diq^Blw` zq5@Pu1oY6!0jTN$iy#OHFKNn1LjeeiuiSB9sSe{q4lcfluj38|E3g2POtw;1Jb)TX zVq-CZfC=bLP1b#Q1N65Haadz?{*d?4T@QvLh*$U{z_o{6-D-&22F60H@MDFGoHLdC z;s=jB?jMlhAC7>I=!f=`8(}DePYs0~59rljI2$(Je?}OThjlURc#g9{*jZD!bc3B& zVX8T^$jSDgWqh;azLWB-=$m?~g7M|ylPSj)F#xbPH_f_#fCsQ07kt{7SP_7V_9@I> zAqD^{+VeM3^QRB`uad)3Ne-{_AZt|KL$9MU?q8qsb|4;lv|}{0uS7)z_3|B`46@cD z)wz}D&4lDs10qq!cpjgruFE17UuCl|rh2@#)-fN`dH#L)*H;-quPNeJ`?i6zFMY0~ zd-`W9C?hucY=H+c23Yz5wL6)?pf_T`M@ftu8FjOE3qc+2I|+;=!;buuHZqJtKQ&;Y z6nY|MYCr_7%KpXiGYbP%3#(d783cx!7Z+RpuWsq;mgy2D53Wd6)+>-tQ9ya+cK>^O zLW>1wpq_}2+gy&U=->AGc~G>yW`~y*+_aRV6HAfS))V-#*ndU-f-36j=UK*qIQdU=`pc ze+9k}J+x&8fFWh_RqcuJKp+L?LL?#pX{H$#L)UBDXj@t!l@u2J}Cjxyuxv;Ssl*spP& zGW!+&>+5m> z2uiWFjy7+-1s{<4ZbqgL1?ae+;tC)J=&fviH-fUi{3!FJ0V)NosDC8EqL*;tzyNf= zSP&f%y3%en4bUd3V)Mai#CYi_T#|ni{k==TTcaW-EJ{|W)N$0TVi+o8Ze1(+*W38*?He7~={{M&K$rKLhst1Mr!+RFpCJ)M3(9vjlJw^Oke zU)Y_D9jtvVv@L5>Sc<5jQ#D%*4McxMfD|&+c0fPoK48K&!CwYT`!ugl{obU6LU9VY z%5oD*h9kyipJ4|* z8&s)sboeRHP+De;a=fKV_u6Y)WmMB2XfKpOXxe22Wxmy>FTE|PSO5cV(KCMw!klv? z$Yb2zG1WJx0Wb)21|0zb54GXsMgaC-lzD!_QcoidW42W30l;WF8DB(E0#8*a2VYEF z1P?N0iq5N=YlTXJLps&0h9U;6GTeWA`xpc2MG3K*)6}#3#$+X24=+^P3*oO|(-x+gae#i}0hPyGu=6baK08Pw)pJ zyeW^XcG-dQcW4x$uVl{}$H|1`Lfu8RL{aYQKMK?Us-2%-HsfjtumJ4TnsN;g21r~C z|5*nC8Gss4EH+*KCOIlxjN2m>>DVq71t=Ij z4y&gySQA0*&lhDxMCw4E>M=zaQ6j)u;w*0c;})m^>Gp zxtr|*2h0hSH4p&+mzA-u0X|J=a9cnTaTyp$4|Up&$&JfO6aQ1jUFBkqMDh(AR-JhW zml3jkq5oSfN%jsncxyp1D#3s5ylM^_*bd}fCI>i^mp%9=vz zkI_{E%7}piQ_i6B4Q%H;&x`fJfo?XhsDYIqF@Ml=4gyQKzS&g#;OS6xlE;NV^`8mC z>mlgG^)$fUZ_7b&1t2WbGP@vD0GeZ!4Rb}4OpbPhhjtNs^!A>*E~x!$c<`Fit+kYS z!IQ_46hr9;kAam&|u8Dr>h}n^|x`P^eod_ zH|_xdHas4q@|!}axbtSc=UXuR4@iyI^k{?tEb&4~XA>I(7+LZAkpzKzm&yIcHm?|^ z0QZ6NCrHyi_^BmmdK?p;eyJ;&1k%K$`KQ1PU*HvXx3q|+tUOrHL*W$PNR%OSMmyNd zl$<#anvzedzrc^-s@m~zCCKj}oTR108P}e56=uS{&?X?JXDDG~pFp^H@aZS4 zqIVsnRmT6zJG!DVqK@8IN7$j|`HbA(sI9u@^`mBtJx>(F2xhXw*Re zic8H;_!Yct!wl~&hgaLZEh>~#OBd^tbr4jl&hv2Q7Y92q2tISLA`-^~P=m%UhR1>d zjJ1!y&hRm*)*(dd$9!gKd@Ee8H*P)4r~0u(LdxM8Cj z#3h#}4by>>FarQGLEvz9Ar#t452XN{EqhLBZhevwT8#p3QH`<+oP7HPYf2x4%Xaue z!+u(MEu0l%deIBfe~{{tHWiFET;8;%0uBBC4no4W8Mx^ztPa`lE9ri&t3-815mUC%-5Ho>2o!q_cKsyi zA&j_Fmykn#4aOeexapQbDF&zTlG@Asbl7qN^Gst~CY3Q!2pO*7d(*n|q@ zfhOz`v%o=?bEe21errYDNs_>eY43aKN5jht;2orNw*m0}vRLb(IZ$AYkK>gnMz&Z9 z&l>>l9RbfVY)15r(dCJ(Ev{!Y2-0&G0ibb(7)Buo$Y6NKJKRc-N2y0j+lGG9=*9br zJC^CQI=5PNCS*n!1-)6|EqWQxA8e= zp5>KTUAvj_&ytrQSBWY9D?`gDiqBoJKj^RW`wz;?ihlpn6bk`&U3vLMZ zkm~&e(Cr)}NdM^xO9UsWInUPl$J1j_XVlK-rN>rkHLLeSW9ajNFoU5vJ{XSw!c=78LJ!&+4k?Zz&0gismD7mSZvap`d_|yOq&h8)MF66 zm*r0{B1zpDZ}M|*PtZ1O*nTe!Vr}6>Pj_iP~=e* z!4ipFS_z?jtO^kc*mQ7%t6CE#Qw@Q+J0{k?yQd^Dz--p|btRMQw+DL|nrD$kM9szK zHQp=PVcG>(vd4aEEZNAi_(AbA9ELrjp9f(7d(%rxwO{8&ADue$)B8F`)dz=nFnxlr zyW#P#@B7y2^>na8ErVXZ4K2BJdhK~St|Ez&MrJ9icySta>*<}pEA?5$u~(UtfV(># z6#aSCj|4LzJx5(!H};u#cLjmq2Buj6Tt9h_>HYp%PyWNE!wIgOwDLhx$LimTS?G9J zP~`)IpVux3MQqA-f0*EfEcj6pBaj3&Q8}Re>viCa;(NuS?W+CD)*Exlvsg99<(X8D zqxO&~;jbq*9}jQgdS~Q=XZ5S&as(9g**apM7R+<1(1~aLf0jfO@(X-7!^Q_$(0+W+ z9dCyU##8t7v}qJCfrDl@9*rev5T%5+n^S>uL-1ew$0P(KQh&A}%7FlCdKy8mr&TkG zhc6^AwRx(m@TDV+1)X8?R=Z%p9Kk3J-M@-1Gnc9Z07of<;Hl96{)ct+{vX!y5q9I7 zr}XX=Fv1@urr?FiD5PMi6&f#}U>{g|g`}jkl&sVXi82f9xLU!3#)ByH4O=<_2Tn3# zIjf4@k|8^XhXgI0nS>y)h#)_aI2V@1g%F&#{tGLwgL-6G(s=!96=wbra1R0!ca*Fm zDr@F`M~w1PeEB`WO-&5~%4?vW8BgrBU+wd}8 zG8I&uji{ko8xIec9m=_39Rmh8`R+IWxeql&rxky_pxX1zANdV`Ydhmw1k_SAKuIDS zP@`oC17ja3p+I8EIT^+1_ie@SML51xpmKNhV?&8`Fqs>^1VHW3W$A+~!Bjo;cyoA+ zsGo8{KnIl0fg~88F$+ym8QoX$wFwOklX4m$K?? z#uZEM){l4Iim=MvN5+T__!lfL`%3K9!yH@v>V3ufDi^dwKd2SZ0I%BdK_iUqqKWFC z2|c=Mb-rTda^y+8o=#uz_^-_uJ9DAe1>5E1SeUj$?>x@bM(mRr*qOFO0(PT7p8z}qPh9rP?zp6ho@CQFn63Qa^I$KSVerjDDv(T`+x@#KY zjCrlg>RZ0ml7yO$je#H=b_-sL6c!~cpHk;&2;s@Enrf_19j!#fd(4Cw+tv17LNGFR z&T8NAwr1mO8aAfnttyCfv6+r33|=*&q0}-Otky>s!><3YDNfkTJfd%-W?xu(5?@Px zn$>%D8Vz`EIPd^~og_QP&B>v^1-JG~iZDFPm7Occ_DQ%0TOUd=db_ing)aIAi9Y9e zIA8oncs_OTb1qlm8;a=$rhGG#vi9XmM(-C*7Ytyz-}-F&ZbA)@WUTpVyE=QbuogXU zsc-cy9P&{@wdJxsnO$h0XrJ<@IjC5uod5{>YAk#)>?a61qljjSL?Gu!0~8Za>}OjH zir|c^_th?Se_L4nYHOMF?5F7%Uw;;t#k7yF)8K5S(bvgVyuU<@=Aylyn5|J2d~brE zJ;R~>z0cvXd>56FINmzA3mrGzDos;TlFRLu;aHd|A!xK6?o3!;_2s} zk3$J5RIn9Hw&U+-1TsWBML1hGnC%GWsk+s_M<}4tdAebz^nt%vzr0=FJH6nSUy}6& zvQt{J+*?aZt0Ej00BRfyr;Ijl^^qx~zIo5!yb29ZbXJMO=s3bNx)gFv;c_`N)ha~~ zivJV5m}iBl1qY9^e0^18N`L#g6=IuhNFnn|G^x^`Cn0KBQ@Oz;>39QbzG{8#;Q+#mseo#G#p zJy;;0_9a(M75+W?adv6b7U#w+*Qx4JRw209wm8&OtVN#-!MBLVp1WtGuYfbhZSr^B zOqn6Q+rE-ViYzmc>Gz0--6mt5ouBo;gj;}g4{|50Gm#|h>eY6*rJALseTj!ro~tf1Z}(>W;&_OLj!)GT6qxox=be+6(<$`5SoT-F(ZRJgokE*)mzYF<2P>S zOv$Q|3LQxidJv~dgjfF(?NLY^TlABOwb{qS*ldM`9xiGRZF@(GLx?-QeaXWCJrRWd zS;bVcjk2L(gYK8doc7hE@K(U?Wfj1p zBy2wQ`qT>m%I+f9MYKJb&xRfzQe2QR9P-_6(d}3>nL6sARxOCfEeO(U3-6!}raYLc z|3V=ElqKe~z1g>8nN(+Cq3dq$rN3M6_-D^XmmWFy->>H{yj`q28Na+5E}KV0K}#Ug ze%?;tVrcp?mS?^&OEH<016CC992veR)X%!b%#0ShV88y%if|>wVS}lo&|3kYyVhfN zf_oB33`d-SbJ7=QVbXAFcyiWmp%)2x=dh?3_Z;d!=CSiRvGeNg^ zoE;!xc^|HzGg@@~Fo0lB|7GIjc)^Kg-U``w#0GG=Q$jmE05Hu$F+BTp$16qHmXR=< zPM0SQ6fpou<95qN9+EH#{+CQik7;;e=U#rw`lkKVou-t zJHekW6(1~YTL|^66s$iU2=7)x7-knFB3BZV5+bTo? zmXtua9frWH4w&_>5Cp8w@cx(J9nD*Q^1yY)lhJP7=;}2B0QV92K%wFAsh3;+(4!~k zO=A6A^qGA8MaW(@aZgYGK-NyPySi2g*%*(wBi6 z1Td6pU2WCm<`r48>QE1Ps1451bg*)y@x9`_T1r`g_H6KcA~8n;-)-kmB@(sSNZREd z7A=J-D{%J+X=OGU`o;yp!si+X0UtHEOem$HhQWOZTO=dDbg4o@;B1T_Z*$%|3Rr!L z^(29|1-X5cIxBj|;das{q(Hdn-R`-etMT;w|A_kPsHnF0?=!>DHFU#JN=gXQFr=h3 z!VuD3g0#SZbSNmHbayuh0@6rIry$*^l+?WQz4yNBxBp<61#7X+!Ht_mr_q{Rr90TxOd19CVh$!ASrFV9&gTPCj@HmU$reO+fBJk zD*krNG6-{;I_s$^n$Z-&a5Su}R$BIShilg9fN9ks@}8u~s1yS85!yRdW!tp`e?ija zN#9!2G8z|3_Sz?P-_Iz#Snv$!jEIcNiDxuIeetL%gCViPJ?@8sUjPYJZzLV)Mu}tK zoPhnGkBtfH%<`uV(tSGyNI5B^-QTs%Ub^CGY;T;2Y3r|#Wy}*TpVv9)(5}o$T>@;D zHq8a|65->3*mqm{(#&W=cAwSXVQ$+}Vz0n0@1RfeXbkb*G2Z-bb7B#B*x|wS2JK0( zmN(8M@nY(;6rv;jx2zj-3t>^Vvuh&3S@)*mY?-#v=ABEa5zTr^w``$Tuljv%L@^YA zPi~G7Aa3Un2ufmj;Vd=&KC?h==+z%Vju}R+s%-JhIqyy$i==T~`Rn_uq#68&zh11y z_Iq#izvTlx@lSr`D)RHq1ANY0ebs>eD|!36@|5uG%P%GOFB=6-CEMe!4ws((V}&9E z3*N~`C(x>|F(Th|Rf5=RuCHr8{U=yEF|7X+{p9US@7mNP3D71Q;CMOStL_xVG6ELc z$E@#x0OoferYx>wFR_5AILd7fO3v_@Q2sUQPIoy05L7TwK0cHf!jWW7B(uJ|9fu>f zqbF18-GX188FHvy-aiZW>zEqYAK4gc($@Ie)38fwN;a@%iYbAx#p9($ng_DA$~-WK(4VE&@6nUT*wUV%M{OY=D_AT_`f8qaCcl!G z_mNZ<|AR#g{<$;+e?s-Roq_U8(CDFg%(^6VfdfNKpxedxHx-UGU-!pUtVvH7B-BQ) z^P_Jz{=5nNV8_|e+*y{ckmu?bbh!|DgYKe7ylv_S9_^q)p)`E7efv}ry?Lm}rxCFm zuilj(Q50&SAF%%MyqPJMUQd&|D~vuTMDg{`DH;0lra3$CZUnDy zyS(uQ@^sL0CpTp$&vER%nm35OrwVi8JT7<)yz4)+Vl&;+Emi|!W^D>pP(HV4Lv>q~ zCQVBk6uwogUx~hm-^a#LR4gOIM%IP5m^ES#%|5hx(3acFcYeO9&wL&vrcxQ*$CrLt z_gk#_`Ur0$_sx{Q-%f`N!WGmT^uJ`GU!BqovhA+%b&)Hm)HRb+OhXp5VEY;7wqe^z z0M~rfkjQrO!Oh&bDT(kaI+umLDr#Y2xwAr{DM=e>>=GLkNb_e8A^!CvM>nk&om`q# zNO1ilC;biP4G6fEoO#r!B*9XDaB#lV1A~*cj$KC>x%}tb0ka;<;&IA41RpeBHfu8U zxcglWCvWOO-yE6xz2mvd#r|?RME3MN@W~9DXRz%gWlDrjhW_WvO@2#1k`3?L1BeX0an^2BtZ1lW>R>@_cr2-NhD+1Ds zwL(KeEi;!eEEu!|Z^@PSyV)ZGXFK(RoP^qe$3*f+%sk-}0ys+Gq#LckNUCC8MJ8pVjV zqo7AyT2i15Eh*9O=+V*=Y7{&A^%05-$_tyVTpS=;c)~_$V4Xzqne*ErdY1de-v+1n z*AF`m2A-euW!)_CC`R%S%;re$PHJMQsppb->_o;F=zTp?5RT>E41h$NLG}407XO6< zLpS?-H%Dyd%kPLx!dj0lhW?7(-yTjh2Oa=O;Z2yOhl1SwD3et*>2x1d7W79{O&vxU zs;;}`QR|F#s)|dgI2?0vIA~P-q0+d!PQlMBM)*M7J}0w=oLi2d0Q|m%#Zu8lR)HVy z!9!ka`5Nz!vK;&{C`CankW-=q0cr+?saaLlViYhEWgVWfr9953q)nvWBaLYQISFwI zJkcgtIi$g;i9;vwZFjlJqMhWuA9ikFkfw!$J-VD(&v9!Kykk3FXnn zQIDimM+=(~B5x(EX-2d`U2>TEPG`Op7l|EyX03LlbsEY?ozVX4)p`i=&y~kU31WgQ z@tV@XEldWXLf`HdWWf{SJm%R4;;%=0Ptc!t^crNNzpA&h+s|r?__C?8VY5Ws`3rG% z{JZ~nm$TEE)W_wy>7~7sDt~wCoW<5c4p+>z2`f|yO_^}PV`hx5U=d5dn_!0#Mw8lA zNIii>g%-r}7*NrvMj(pNoikfvS00o9N~=5svnC(*tS<)0Bcd5Ihzey<#($}75uug0 z+ij@;&Dm#v&Nt#{X$7Ic3sHy$nUK`1v5`*hnNkt4Dwt1J1h&|1cHF)j+dV z1w8ide}rtx81AlMyIpwwgl-vD-f%Es+b9(|N1??%w||uZbCVhH9MEL+Qpr&9KWyY- z+Rg64jCY$$L-5>+e>7@bPp}#Uc$hrUhR`AKGhWV1WO7Ad9}zSrwck3je9Ggn7U;}& z*c;Td`^NUD$2WFMK~zYbm$#r7R6A&YKn}#bS4(tV&4$QoE0QaIE>dVTj59ZGpoD`I z2)vxIq0m~$0=GGhRfr-FPB_efax-B$_H1;w3|!mD@{zKj7M$NF81`Q7YyT_+nzNc& z53f>X4vU(3Zw)M0+9nbTVSxtMnmXiCKmE+ZDj(s{?`<^Hj?-?XWyzn0(5Y+bA551; z8E}_T2O(_2RQ?8A?XQ{3*6Y60kh}F!=T(HvhyIa2>yVZ@d$=%sQ!KCvDjb}ayq3JQ z&Q3-`|CA2YL!uLIq<0ocnC<>;!(qF^nSy))e^c8J^zMq3TWI`jm$#?mXeLMSZw_6$ zj74S6T(h=wQb@wel_hxkPa4{^F>)yi1v|`(30dM}1m3Gxr;1O&5E{xdM)_(0X1ma7 zP|!Li4@-aJGe|5fR+hw$y%`MQ;d!)jLKq5gh?;B3R*2@SCNn<^6MRtHr2v&LWLHRx z5rDCT87d2au--7Mgt6l5#7>Nb85R)0w3=dHC%+d+3wx#TgSCkt8iJpxuS+YUpFerJ-8y)eOYtr8d<_{RaZ=% zKZQO5o+T=ShBmM>G(mt>w%2#Zz<*1D?3KAV(4dMCXMEwA;4m;=_L)QbNW-)4?d@N8 zVGvS^@14lXB%@EPqm?fid!F7WljPvK0VIqQd!+W=uEEi_0M2jWb6VRTw=X_L<)oD) zzWFk22p04RSe&!cX10fi;bq2Og~q2(Bt-VVK@XrFHXc6C46ZMyKh{9N00 z>?+UR+9BZfqw+7AK$CaSs>Xp5r#2g+0Z%t*U#l+aRpZkz$3}xJ%1`HlO6CrfvpR#A z#BL6wJ!W7eRwMP>9anip{Y<<`EiSYgkqC>CX+dLbV>-ieC~@hW zG>TXr*XomEV)}4tzo4SSz*X6gG_cod=vlk^+^iK3E3rJK?We|u5xnG7FaRhEf8sI| z(6A~%L(rz6leW~X$`k@R-UmwJ9i!#)5v@E*JL4#m`RJbmR*}w&DU1sKV zK3{Mqqwd1l9a@NBp9n$0ja8Q^PqmA;&C4&Tfi4lCOCEUu&fx2M5?O7mlJVi6y91~y z$|wAG-T#W`9zB$vJOI$rdH}g-_kqSGWw5}$tTmJIM3tnSxJ5YL_^yCLVF)r^7;qOn z`b!D3@va>ySSFb@e{50BD0BSM?58MK6l*hy*zLZZZlqj;wn|F=Grity#wBi02-9GL7YL9%!Y@>?m&fF% zrK7FHu@8k6@ZviV(qWB|eqSLJgrE1#PZ#>6bjdZ$RUv_An@FGL*Rk@B0x%+aMndm zhS3rVQ-a6wB4W)2ghFHD9j&-yDoND(EE~#bBP^)PBEUh8eb!t{w@-D&4d=h}U*Zh=H6dT`|_Dwi7?DUi*7^!sH9=vp?d%%(w4Bfn81GUi0ofn*Tmu0C&=k?O`vo zxQ(D2sRM{r-ABBWW~OqrT?WBkp7*0>mp$kGgkq7J$umoQur~nh%7Ww^s!e-Z3N3<(G9-L-`T+q@1 z{|(aChziujgvyg?A^^+pX5=?z{EP#`>&Wd(qj1D!jVGd`IMNd98elO>`DMv%T8PvV zJcMF?jy7=b@1=#db+>ZVi;Ab~llxxyH+Wt(q;|XoN1)%=nf^CA7Y?1qqsI$3Txw}U zHtu-N>I?Y0{@d6=fBVEsoczjM_OAxme)p3B3cC^^=saebo}ji^rBz<`NHZ0?*Frf) zbS6d4hP_JV<8dbW0|D1l7?F=MiS=khD0TW1oevqRaoK*w>UAg#;pQW%r<0+03?EnQhq(Zw*?} zzkxcZ-8NVB0RgAt{;Xi2DNqJChrz6ClIuQ6&Um*RtoaX`#Sw& zg9123LC3@>pA@#rc|PMV;6hu)e)`sYKddwRtMr}8&zaZ3-wR#1X|(J>OmuD)4tw=W zPxC^fg%UE7y-YzQlR54$e9VgR6T#+iL7Nq;6Pze63<9HNtNB(W*nC(y1>%TT!VCY`jkjMq2fFBULjsT*gO{tV+QnH zSu_EP^~NX%56L_yfJF&uz%s_M>DZ2#pKt1>#jrH4X+&TckWZFyZ(W} zswDS4dqi1Y4r%C;BMy{{BTsLiqsLN5PrWKIdBR$je2OEdvQ*Y$udu1&2~RmCe{?vf zTo*hzlSAQyi=PFUeTJiVtzXMUu1)C(mSW$G8QXML_%=RCmDztNjC~lk(-Xs`q+em* z7h|B`3!TQBtz;>209GC2bHc70Y{}$G zfqm#YN5oK>y&)MG`UFs|dQ0{jYG#0Qqui(dd_UTjX4XaI>3>`ShGn z9Kx!(FaXEAcD5vuw;_~OG!K@c0C`Tsee{BxJB7v&#;blQ=`zT;+kn+=Y1AcI`4G>v z&X8_V&_w`>bY91mczUKs@E9bRLXw1=Ay{PXp853U8^tJ=9?&~R+o_r~n5Ky0zu+z7PVZe-9-YVruqOP|m90F5OWy(AkJF zfB6S%Lc0KNh$DK13?^3pE3xtzalz7N(kDIx%svh;m<$*m|$BIo4j zhT6JxgPOy_*Gpemq)h^%EWd=TL{wGt)Fwc|k}2GfIznH~&;Ad9F^DAPgxeQvz^5AQjSK(;yGT}$&L0~k{#R-MART%< z@P!R{Ww)@}BjVLJ{SeZ={&r7y$Qvw|3)Y%g3EKq>m zxb|mw7JpY1sDu2KGeQq=DP=BN8=!%SJ13@lgd_7g%YYpGkqAiKQSz zg775m+oEw;g*rCNwHnGUsqAVjhU?h$sT_u~Q` z!WH@WiJ!<#G|l0Ej$WswR3S;YCQ`VJa*0?rybRj_1bo6S~n*H;CPdb^t~{Gp$hSh z*bD(-8a|p*T?L6W%AqepIh0}8NI7C);*HUUlScn*^F|_ExcmhNv(oO?P%N9ob^aug}hW(HfQl!t%kVjAC8M5;*K zk-A}fQ0ic0K40~RKaRLe9(7-%e-R$1nD|4&ZFI$*<(R~%lt8=f`765VHw&QmSDA(Rd8&2%94=tO4B9+)gHEeC>Ob2@2fz~WD#9qL z+r{60A%Fk{M&IY^79ylP9SE$EzW#310O%Y2#h4B#lag=>?Sao>tx?h!Gxsf1wd`sFbf=BmJOz3__OOQ*+2 ze#aKf?e_D&m@^_+$tLXT!a|%Z0zgaovHh+!miyKn|GR7_1=DHuIY<99-J?K`lkot~ zlgt#myU#m53o5T(E-(m0Qlsrw<9`#p%=P4hQ68L=?92Krz1;c~B<131O=Yz^^{ zm3@5o?Uy_yxvXAH_5FkX1A8rCI$&?{7h}#TT;nYVIhbpBp&Igg?7M*i?cmXa0Dq!} zZw*-$Z$cf(;8jLXZB|VjAodQ;-zwwrQo+#YcK)OL3&g(juv^^>Ni5~2fbAs_9?cn2 zU`U+tAwX~G>A6JjNumRlzr+JSB(VBjyCRhE_;K#FN(7t$P>G-;!iGOSCvqbo5Hbm1 zmsVf7ISwXE{q`DlcYDYiE4H6Cej~KgQ6S;OjRyn;nD&xz6UoOqym3GBN(yk6EUJV4 z%6*}-HNsWzNBt1hK`kNwu&G`2bryw~H%QP>v-)8Ij0rre@`UzsC)M`ELdod)XSra$aKZhXTespIWk)4MMU%Ll`|P0h z1ivL3d>J2tpjrMWSV27lQ6!I8*D7g_5DYj4_u3xu9HDkfEXF)WTVFA1aIpL5V%0>pZA?K~oGu zkG*21%XOPw&hE%>9plVjf*BE{?Afl5_d_wo-8A=%_v}Qr{Tu;dJM18T;ayU<)Y2ia zWwky%$@#}&aQ9=I^5n^QP0!|HOyDZxx3nMqAOTT%76A+<{g4Pyu9`;MNPfux1OW$vO|^Z91`l%ja~%wP&p?~P zaHFY+U-rW%v=^ZqE3}M^?ZLT{PK2KN#`%WH@eSiK(cL8I5&{beAOd{s%!6$* z+Sq}=HX$yXPLI$c4fN8&{arI!3Wn+pr!P5^3aI{pl zg&r@yNP_@fsZfJs-flbM7-G`p12flxJ~d8cLn2MJUS$KE99ro@W@ViN7!RY57ER%A&mc&uRhEV&zThZ+7)7?*oYRu*5zrSg`vu0cL(W(y85g7B=0R`_5rZ+$>I20 za1l7?q67jL~hjffMn_&$$1^eEn?@}fe0C^WZBW!&r^X*0C*yFFsU>DfXOkHtwaSH2AhZWm{`Qjf=c_zzRF-4_juqd}YG9 z8bEBOY9aRWgIfw(5*H4&;{tynpVo^!cxXa`UWp?cNyV|Q-CMYHSJ2Yncsahinjcwo zBBdX4rAhPayoX-5Pd;a;e_1Sxt&g>Rx#;+u1ry?IP3!03T#5zHDTtuwM++yBHJZkJ zxWHr=LxJuqcG%EmpQ{J}kKE0+&pbm4IOMCn4bx)Lm-nmbC8p$rU&88-)3(JE=n(dp{P;ytf_+ zbJea0ynZI7$=EA*ADNm?=2m-(**l2hw`$%On^4R9E}4afI%R6={^r$HUT@=)ZSa@8 z)xdThXj7fnvX3Ss6_;>p4OnLa3TzXnA`JV3MRzG?y%Xt974P5qcC1U?N&a?xP>w$I z9M6mdTvh9+nS`0Dp##p8jB3A4K7L8XTsXqN&vTCE(6?LuvhCuzMxh6)cCA->gT+6B zKPD{u66=x$jOY|%0Z57IVeEV3WRebz1%DN}m-Zw9QI`v05dp6$4tSW#aI2jFK+oGN zQp&a*#q5{s(aF6n0=u|+{{DVk1kf%-TRXlu0muEi|8qIYFK+Gnx2&aR#uxNBqmT_x zfni2`D0#j`Wn^Ka9X+@NGF-b?8EZ#TB%LolwS^Z4PO06$Q#W11o=5+zg`fr=j4*2K zSU&V9+;!rkpyHmcZOl!2H7hpz=z1scWK^I0#b%9X#NB-(2GDLM3;yy8b?QqzRmMIl zI#_tmH(ZR7<<|5cy%{2%XGDs@zcpV;U8Zg?*yz8fh-JasD?11x+Rv zI)FXVIp;@jFiuFIVYS)!0u7#X8G6ClHEjDS2mttKdYPLz*cHDbJ`@vlx~u!aj=gJ{ zwKyRszi5z58&5^S{@B@Rx@{5H%2^9I46?xdvKAatA?&{DZGmlhCL`$+^g`XI&{>eR z0L^tUI6*bvQ3WRM5s5u#KKt1;0J2ncwY4p2)Q>j+9Y!4WrWnQqyCSBdR%+6Xe#@aS zT7DX31Q`r}qEG8V%R73V)CGOqaih=m5mX1%=_J-Ou9%~9Xxk~_S7iB`b^VHV`jON8 zhe31}k#*O>qKnKgnuqO2>F=2=7PICa^(n><$>-mRuG^Jt)1 z_1#8QM;2#a?3HTE5*=MG(~DH?X6p<{x}{&iu-UjMDXp+xpp{gPTPi6rDCt+qHMghH zm~gB+Vsh-*3-rGRxKj72g}{uwRM~)~42H!BuZREk{8EAM{FUY{+MStY1&a=jub(O^ zRu&u)G&_EJqGoj}_K@gEU`)aNmVWP>itu&pdqNvT6?cBWl-0!Fb8ujhW1Qj5$&gID z)hAlqS9|J9#BRaw@I-Yfq`I6BaB5_&e!Ze6wHiq-^7C2g{*Ln)o>WQTM9}Zsui4`7 z1wgzj`VQ<>kls}LEl0MioYB$VJ>CoI5br2Zl~uU7 z+eIHp)j>F6K{H5~b7Q@N*?*^QT9bFT2UaJg4&lr*ZrltOS9f&&xWGt5y&-GH?i_F6 zZX+Z_J2y%spfT|FYaDAI9)pvVziN!qE8BN%Uppke<|JMYNz3cww}ZwbX<>1LIIfSS z>=0T6Fq~ic#*fs^;dra|q!8OaOSGIDY`{h%3xX?>$6}~g_ge0vo#zLmjM=O3@~9+$ z5GC{Eia6e>6rs^9J{pKMdmI?Y+HRaMX~aU7Go>S$vOs|VtEK{1LqK5=!d;iz#sBv0 z&;N8UHvcy)(MI1IdQEa$%;YHEe+)#Q{-b!&{73nsC#RsOsH~zcucWMkn#`S}5uVX$ znN|(QFDt>5c4_kxk`Bg4*;@^7WkY)|0IxRT#G`JA&SG-Q3xLY$L1AOVL9w^xo zaIB`r+Pv1r<3Miy*dQjL(gwmCN5j(FF9q|GEZ z>5i+hH4PKaWzGAQN0A^r-D2mWP7gEmw)*)vpMHTTK?C2u0nGo(+4b~Os?G7=6iXoE zqbd|1>WCNw(+DRZox%HI1i}VljZbH+Qx9TR3>Qg1dYXxme%4nTb^RuBJkHAiFdFkt zKfHZcIvN7~*73Hj_~*c^1-A6r(1^je$wkKTXF)T`+-#$Q*TLxRe_NAE2kaLN7NzLA z12bZ^ScPbq8!LV){rj&c3cz5z?Ehzpx9$&9nMOHc=SGE4WEDVGv(m;_w;+zlF0+i) zcwsr_uUdco8YC$M!Vc%K;zbqkqt+%zTOS<Ju4Psuu-E(8(ZiU11 ze+P*~rlrro%O7G6`SBNREs$!w_dXZYA}P%K3<8E;5(ejCD_K1)zakLL4 ze=t=3SFxP1qqx0*n;lYy=D$vCw&j1z0@xR$-v}&Vqr4}k-leno5}G;)H2X!m$gyz9 zayIyhm^b9|f`%yEEee89R{2SgI;!y{I3|B?ok#JIxG`j~ zPc>)TX#rX|rgl!vV!S(GL{drhc#2H{6i=bSY^?K-MQCW&?q^TosaFq^dmeM-#qw4gB z2uBcR1Y%mcTCDuLO_aT+mJgOX^zr!Ib6mBN#v{#hKaz?8oC(lzh55e-HrYZ2(o&xi zH2m+O9aNrZ)oiGw4zm2+7c^E^9nLMtvrKl>RoCbEj_;ACJ{4jX_}wWE??goO9QeZ=h=#{4pLDV43)f%uYB&eFmR`@1@wZRxJ=gx|;d z*Px0wSwe@MCkI_6`^;$v7RvVRt&7%mYxYHIb0>#$`J6Iz9#_*j=_Sdg-9NK`sEA9C z2ABG=28nxBgkK9J<1#;Y^va32%HhFTKx2ABmp>h1*y3x^2#r@32u8h!N$-v9!E&$Z zGQy~k7NYrY*2_q(+~oJrk-mu6LB0gqiH8dt!A)`gMf&%H&y(j(2H_RTuDMIg2QM7X ztl^24z0$RvOf)4=;rf2l<4U$T(DocDH@&xgIB@J%ZmzuoCcd&jHS^aU>aCMfKLdo? zCpH`c{OftaV6nBsF{b@Ir0g>1{!uDlocB|FO8$B2shE-^Jiz{by?pK|DPCJ9o=W53 zb@Y?`k;ACek3_=R}!O>|MAVe z5AD(F+_=jvR0w5iQgi-YV;MKi_VJ5>L#?yrbk~Mxg}14Gk6yfMeR^p!rFh=S@glNy zA!wbu?kvHM`7iHO&)#+aAL%bu@(!F?v>GKvw*wR85(-yFP9LPUnB>!=MctX6Jz!eC z>EMx{AaD1*zP&P1WF<`i0q#B+>LA1R;8)tCT&SvQ9_omrIYNdU!B2}^pYt8a{#RNw*p{mR7o8;KD$!1=IpZ?K6!@egOo z51g?AD?9b4<33OlvDBYw1$e4mz*%nsFf}r^QTT}$lt+8flEXE8XjfUfV&o_L^&90f zl?JH>O|H=48z0rP_6+OW5%IUAm1h$LpFOk8P}jdm6Pd2R(9=o+L0mHp0~^?x4-{Gq zojjz@h|_rRkL|`DUegi}GcZ=8iSXEfmKZ1sZb)B^ftFB8)2-=%E>n=YT}GH!Rg1O% z(zucDQSE=kf(;!QJUc;1G^%#EBY7&es5w=2Z2n&R6qKB>b*Nadk68_F`0Kb%{}qG$ zha*w>ka<^sN%kIudD{1p;h`y}9K4Q4n%}J7P!?f%q+aC3 zbv>%3Z6I1USv!qp-BFR~Y;QSp_tb)DEmX5#@9SLMT{`SN7 zl>QWM5N(?Vy2?WkeONdfO%das`S4>qv-G{e8807wm}!h&ywmeO$8DuBW&zT z)b;j3t`7H0&4>Kw-!U;YRu<<2u)llG_h~)GIEj6?YnYU8wgM+6glW;>&pagg@7Gq zi{IYmKGp8{#B8pR@nISvgECUT@Y*tAiifB?_cG&D1tQHVc37-n5pK^PvSl+$PkJOf z_Xj;l8?%U5@Vq(2u%}-AaYKfLcuRK{foRLfpls_$kE=cxNvEr;MruS<35vD$rSw^h zTW?!GyDHK>VlsX|^qO*JX3F;EP4Z`kZTwiX26R=wsGhsO?H_Q~cn}&@+4#g%_lS77 z2R_^*qTjJ)qWi)y5zEhZYw{lq=p~l<3=C*7#&u?Dxd({;XoS{d=EZ;fSF{0tl-=2K z$)2kbL>C=6h1=6uOp!IGQgc~zh)&l6_Zh z!_5r@INh@L+G^3qM}no1UR8G3Qh;?CM}@@pO9jvb$-U^M=i(Cq7HmNe&zlz6671vo z!=zzj-U0mhPC-R8i;}?9=VUo9KTbMbi#fu;OBkh2whxBKqNQMmHj!BndwU67GkoEl z70*E#T$p3wN1l?7!wdiUKvKY`LyVhe>Xt5zQ}Fu6G3{~7Ua%6$l6YUsXAWfcU99QI zmp$TR0~yqhOLf6|j;~t}TNxh9$w?LW-u_+Y!+y(T{MsYXQ1UV1IZO7q|9U!E3Mcy- z=_2tW56FnHjed^9a!D1l6%xApUah8*&Hi`57=*>WaZ6#$tz=5(3&I_ zVf+kgfX_4?Rb4XC7(sL#uG@pR3K*M>9c~0$ECwP*jr@LsP%+(VYAQEBRW(E!6a!R1J&hyvJqM;0019K ztrXCKD;Rc6tENowo^PFfn{3+XVNBB+3_$)1}_DQ8itU~>^A-;ES!CUh4>X#eF z#u_8vsD1$ZY-GC6S9O;&&$QBR3bFaTf@+QZ&MH)$z`De&MF| zSi^t%ecg}s#$m|l5S~}i#mP!VT4YD2^&v5kq@!|<)VO=00H=ss86HBK>;#K`JoY@O zF!@@9KD3QBy`&L(G5qkyk^tjk=5(ZtQ=#U0vY#nJboYMO>W#OU&}UNvW06+0^ut1E zqWL12M3$F2--vB--S|%@(ljGDVDVAvL>UM`j-|24zuOXMl?t4u&Hs=wU4n0W#^aRP z=o|icxA2*@>-&|4ICTmP;I$*>4(H!!)M>tn*!YfqY?I!=ePkc|&`UF9l@JyB5tA(i zCUZ@WqWQrt6Xa5>SW4Y#IgnXnw`%Rclw_+Hr_f7Jm|5oZwIJ#UXb37TDB-&aZowN! zJ7S3@|5A-|7altYRTKjNT524WX-XAP&7{dFw9%j=TA?FTD+uNM`Ff&hixJEAt&KDl`{l&8++e1P3enkwA(>aZLD8a%>*-%sv)hBoXHW@I3^y3g=o4NHtlIU0`4i#mBbaC4 zygXygtPo-CQH&AB`cS#ruQQeW&se3oUGd1>e5}DIvUF5waw$7z_<-?XsPGmHC&Ikq zfi?rOdwzF%k%iw_Tcf25H~-*E!E^^owqT{fzu$XNSLsP37_H(P+n;e>ae_ z|4$f``+uVmw9E-utVb%q=uvnmG86{-D;gTg*s{QyxkMJ!i?RF|0)`hbwU)vL7vNRZz=*=p;u@Ikq)MKGB%P(j^V0o1H zOg^6lJiJ{HtxBSpZb1r|#8$AeLLoUiBJ0-h5PJeqIEMuP6KF*UpQ?1^q{{fJuXUbYIhz7!rsy)#OaN$LO% zuSst5U2QD`Rp0B?6RxEXPmj>FYeaY#CVCth8b0=%`-1=i6+#KY|3wU}89leEUWZ-S zcA~I=U8OFIT+J{3%oWdQ^BBh=n#b16Wa810dEgOp-))VKrL?cpG&4mk>f{2Ff%0oz%wY zW3&y9I79tH=Hpe}AkQj5a;7<)JN zs3^w1P<_nu7;3{}ECCIYMoYz+n36n$ZgI*Yyf2P6u!sw$l8?|`*Xpr?iF*tUJf6+; zmiKRa@+HY5O?<#7d})(qGQ7x4p2NT5JrX4(692K=wmchOV=}cqT4`Qc?(}%Z7!}^5 zL-}X+{72zKZeO~r;gxC8a;u7X3}}lLFXr@em4KvzVw?gPG^He0=qFN~i#a`O`z)3M z7pZ3+Rd44ykDq4_Th>leI^I~Fh5L%3%Fj|~u@OxZzOTmEU>&QGy9&%_| z4o0j?ToeZk(I+vuNnIkAKZzxI^lXJzh}r1Ex>+Z~f&~B_i`cRPD2&pV{XBRvO610h z;c#)tqV2;BgaZHwH?L`<*&hKK0^zpv-upZC7vah#IUHn z?{!wD2DmhawR>SW^Sce0_~nZGJsB@C!#bv z7T*83jmk+(uT>!CwQBvC@zIOsYu;XV>^Gw=Yg1^*Vy_`5^D;l6PrYjA^+vSU?Vrj3 zKdV>TpNL5nk32JbzS6H&=zC22CSF6(?eu1v$&+$pe6fl5Z++T@q%mgt;6_}z#aYXK z%n}njRqi`vOmCoN03OXf2p**@fH|qbt{-nRb8c3oLJggz+P4I0ce&Pi*lkQilf*|b z>NA7^?0-mMVT?(ADeo7U4@&rBVJVQaj1qvdXHxw$=uj?lnRP*t( z4i*c7K`aDlG(RL(PQe1vSdkHi6J{JG?3LJ^w3V%aN-o`4bH*gX^)gY%UIgEX-}~h>Hz%!06q*6p03e~YG?x)w)e+>E5LuXyE`VP zy<}|CESlanJvx&ma?)|?-KS!LfxHfq5!`<<&BeN*-_c7xc+*E-Nl@*oOL9s|GhR$W zTd?uN8ccQefjarmSedtU8%S<~W6@X%GzG?~au#v2pyBs^q<{2w3tFS`i3e;EbF5wT zEv7q4z#~Gbi5&z%T8DqNRi}COF{~i>^GmnC1dy*OoX*Dm;7D|`_#;cAL+t{WWV+nw zfUOUQFFdzMo|jK6Z^}QQRhZz4(HAIF(x&K*p`6iofS9SBFZSKZETc`LVmow%_EBi$VW!n||u{XfrpKFzn8 z+0Qxq?6daTYrUH)?vd!y+gR7jt)p-wwm}-97G8x-u@F6eulX=5r}S&f=f4RA*Pp!n zpV=4SnYi2h_yTQ<1Gyg|dmCsJlXwuaHpB8i@LA@i@tULM3(Ax3Q_5c=wTA>Vtx2dT zxktl@F#kGg=2go=n8#`w-igPQlluSV2d%;t4+RId zu(tgUtN5;$dEA+nyArZS8vYzZH<<6vSHiXBEE~KAJz(PZ&;ol^ogi$&-LAW zxVxmjY@y%ViM0znjnw4kzu_E5-dta}wSGD2>z;{%Bx)JYyAUG)@^J~L|GFe6B4`7$;E6{wgBv4k3WToX$+1tkRM#Hhu znCX!^l#A=&GNY(oj(bB(-4oc)4&;r=6Cs-E;}q%R7P~R>|KzA`U!r-14x(Ai7yI5N z=9aIob$r{DLEeYRIk%4L91ZR=xMe6l>J~47M}rYp?d2SxA(RLMB8FZT0k@n~On79^ zyy14;)icsuAJP2Y!dcv}Mj@`-&sTnUKan6+7#s;1U-TxtFcVU#BXkT1@%%6ec`%7@Hrexb28NJawK9sVaPS zQoNxif)>BIN1nDSzLDTm*-_#MZA1Ae3~KBL`0SHry>u$m- zuiw{DqIq4|w3Rj%EOSW9FWxOxN<^kfyp4?E1pk{l=3iuc8FAjk)}PD>&gN*Gb`{VA zH4aq`p}B*07vUjI0)hu#yC-$~<2ufVWrt5Yl*c!{_EKJfTMObd4gvo$`AN-FX7!%PQdC&4QG<8R#MCqq z@l&{jG_EJvhEw1d+2-k2@qa@LS_2J6Ys)CSBT|}oeHe=KqqR8M*jODK3NV11k5+&u zOq#&-l0_Tm`vnx?FJhlT&Ydlf&=-1G@tGa0ybwu9cMH#`cT1mNH1YOo2xRPQf`P-W z=8)~BW*70G07c`Zav)Gdvi}Sjz#%n$RmDJ5_FleVHNs55VxSnEt|78e^eTuB9Zk2WI zo610F&_@Es_q(@gZ3`8X&0ZQz91m?GXA#VEg5MmQ+L%k|kx)B6dd7&jZ@tU@y(Cn% z?wmVj2Bk9|?8f^33dS4Qr^(}eJVT6$CC;JxRng`ysIMpDOMP9wI*=&=)`gO%+w}u){yhI>F@EP2S>na& zQ*-RlWT7>AMn63elM~>ZGrxbk_;j==5{`2a#Qo)xa+j*LLC(7z>DjCGHutMO zIUzMJ!$D%8?@tb}S}e3Av!AEL80e<&nc=uB4f7Dgw6*Do zr^D*R?LU=!AUi`)WH6nWcgAM0x z8<%CB@EW%CMB{WL9@5c;{d=9Z&*Qt*Gu38i>(zhPlq2vAkeGDeKWeIW43Z><95KzHIlYQJYg-bMz)BIuIkYuUEA~51~-DKuTGUAgx|-t$v(jF3fLm1ax^)oEg@-& zn!#u;$s%$aG(LIPb+Y~D)}FbLTC+p$BHtP5i_$cXEVpqH&>&! z6d@!iH8E3FmZ6D0*(`a~l7$5zH8E{zp1KNurcey<+ZGu{al}g{qG<|VwA-Osm43D=MQ?1cwnUP5SVEg} z#9FqHoN3Ebq4ymq5Zx#I0{jHyiFJPsE6Ycp2qX|R zPl7YdjkqVFi2D}il>RY{IEe!VM=oWdefS`!UQ>E?%srizIg@haQr+s?((!psB$YvD zx6uOh@iAw;#;OzgXI~w@OX2nkcLJFWGqK|K=Cf`>F)OxT%%%RxXhTA!=p8H09rFS5 zUBKl18~fidp_G5taLvleBZ1TRXROnQ_BV4L=T8M|e~I5gD?DX-U-nLId*g)c6x;7t zWPfH%axd+Urdnl;N*9r;x*!vl(I48)OS}qQGl&3WEyAl})EDHV%fUr~pkvnao+;E{ zo08jv8H6nB3s-k{MLVu09>VV)P^pN=JO+dZ84p0VnH0)$Bl8kQ-LER=vO_gUCyBjg zcNJmH=fPkXB~YxQkXEuno1gl+VsqAQ z$Z98HZ&g+j=lqj#h{RL@*Tuuz2r11qrx_x7?MI)6rxq)4$n?(~RKKAVr7$GL6!z}N zU@r;zOosQ%zf`OaG6Wj}pP}Pj+vfFki<@y|6f=iap{px0C&=88k@uNFUqpJH>wi!H zxPgrhOnsZANj^?vYQk843WK9USH+5-`XUA6a5F9&}2$WH<56$jc8 zF``XmW?yFpMGe`SB}KSkrn@mtSEO5F8PowWaa*_(FuhFvuBPh|_GNCOipdg!!oR4n z>CTV^m?uN-2h6Ph+3q%!dOsScRw+H`-GvKvQ@O6_Hoy4NBOyFAfflW(Q1NlT6!{a8 zlD)esv>3`q1~lX@EduVMa2{GV{2VoBlGc6_(IUMR-cvKKn3-2ZjY4zAhxq3x&mhTW zHy3#a0f>m-v5%k%dqfCfwE9Q&Ym-*D2Z5nPlQtv#jgi)K2_CFq*Q510?v8Vd(&QMQ z5ctx@+E`}%NVx;tX*E4+I$XwxjKKoiPs2kWg27B!Mh^5LW^_oz+AG)N@E9QS1ftV7 za6_FSAWetVcF6tpCqhGvugfpK-qpn~M%m z=N}TN6CpIipqd@8^T^(CGC=_b|5Q*szp6xwE5<3%ubjV++!rtT6toLO0oG2uX2ZAN3HKjaWxu^5E9jElFg$LiAwvBmcJZU6R>fNQdg;|RSl-2}*+>q0 zKLjsfcjC*-pgn4mW3NWtlOf^U=_0uQl}|W-bMwvKuiLrdq`;LOG!abgQ$nRoMZV5l z)PjzV5;(DfVrPu>rrDBDkB{YsCRZY{dFV&Q^|UC06!eeW~r`uD&Li*jwmb{f0IwD zTR|{~Zelc(JDzcxiv4h)LA8{ckuZZM*tsJ&_w0DqY5=QHUZUgvkm5uXNF(JhRah)= zQhDfxZ%Ue^>2>q_t`@G2j^A4`JvKR71j7M&fcF-8kN3&pyAY?9mB9_}jfm`-wCyXZdr+QAK5pK+tD4aqdqiq|_`Nxn*%o z-ZwQ{D~3J%fvU&#b|&u%vcVa(wL`>qdSHl`qVOC0h9)0l9{4k_j0wR&1|Xwl&3LhC zJ(a{Hr2&jId6F~QKKKeHGHG+&G^pNWs)GRpSPOJUo0>9%%Vo9Cxlvq!@~9n15+Dof z7svOO=Fn&YK&1I?V^{sk=3^)`&39!llC#sGSrDagfQ;5LuVKxy5GPh$&q zzO=~y-Y^q(71qM76Hr^?pXc?}eovVKIbwdKKm;Ab^&YvGui(`y`#YQ=cJ_9)Q`*m} z0VvFXF_YEB(%N1PrR0sK4r3gwH1rHiCw$?rG z`rX{w=+>68_+NgD!W5AS?fY+%Iw%+s3RGG87rq`9xbU1}KmJovcRc-8y+2nrz`=o> zA|ttq`gZNDHy{14u-V(3UgZssb8kcvM)*GyBO+@&pGcK?% z5S-ngd^gjn6|da22aO1LK1#JQwiv8BhaOBjho1O%N;ld^;#d0jm^8;TT9wBOmQ>Mz zdjJ~As!FzZl%@9GGo;aa?{YOmK#~#y^SSd?^gmhEW(V~Av;}59&ks}d)Gu6g)x09p z_c(uZz;Qg85;hIwH8*cO@Wl2C>WeJB#_Y7Xlk=^+qg9Z7IyBLSzPuu=Fzd+(n;Y zW`zNxUC#S$8P?9{zdiy1L3==~xroc%M~-W%Z=3~dR?OPau`P~EDnz4ckv4Z%wook? zU}&pQ)%{gfdWv}Km3;-p?Fc(k*wQ{Dr|WtQ3m28cUAN3ko{tHoZ2RLkPpSdr}7o!YQJHZG_asHHLloEXPPI3M=+PZyb7-)ainF^#R z2^K!DVv{(8jmliyV{M4akG`4LFB?nfs&JS6q9uD&uwqk$%hqxI;t4qFH)>cMGedDo zMEeanAIoD!2H)jHwv{OP3%nRx3LpRwhpf7N9g4Yp)ELKl-1y~6`KRmhHW9s-`na*5 zj?019FzdhQCA5o@2PEM!1Uf3QmoMGo(Ca^A-qB9qreGpOVk?<~t3e>30+?p%p%XGyAPU3s(!*nw@{zkNK{$XA6*u9@wHm1s}f&(Be;M<~=K>2~+ z(S=^pey3U1oa%a+EH2Jx;J_D~&LBT^-z+T8*S+kwPfw?y+&~z^r)>mbi`zme#EY_*-R-!~oFd7t2%O6t?R{mk3y{X-|}_ZmS5 zt+JWU0ylC|8D=)kKj9T^7QPRzzjl$(a{ZNiuXWS1xP#!$t|<8{o^PleKNFD)jZWLQ zc=9<#ao&NK49L`$8qnk6lpHTiqm?9Lg_}*M6tpH;#(=OY{eeKjjLv8#`@XFt4BzgV z8)gD`FOKR%8{L>Qil?8%4N!UH_8+oZ^z-bh6p4TLUj0dX@VLG7HTwYux>mm2c-vz1 zhpbhV1h7>$q4XUCljE!TB@ znAbxj>|A(!m|5OCw%9s;t-}54%-(8x*NvlQf_<_G~{e-tg(H| z3{=b}_f!_WC9*6=_9HXF$r1%%1!EX}4XrdtkJLbb$mXe|?g-ebKnkQG(}EbpsH)O# z^kklVD5|MZ_5XNnW#i$g0&^bL#l}<0rge9dvOO2rD5aMFV>clF*Aw|i_7isV1NkR6 zh2#`4yAviTFHGW-2Pz05bYOJ{5%r@FYrsEZL!#7-&^&2 zHjJk7((ZZkI{TBvRKM|?7tCWZro{DX`oX3No~puyND7^BO_QI7_c6dQgK(c6ET_Si zm}j$a##(cL$W0B^t<3XteeS0;q7Pq?wh!!@o(z;$-md%3hI8%|Yc+OW#ga5gTsrZ` zmukQ;70=I$ZTRMMLs2&SYo@`N z4byVe=s8^n695qxf2Qx)fN^J{7JkE?;{dNbx)q)}d*%tK*l!qrP6s2=@N7Sdvqwdk z$#pb^6|bqrC#{8V&@|U~_4sRABV-2xE&^WszqoTp+>6b87H*xFKU7(K&BK`JqEm8) zTGBP`>3uO)L-g<+Yk`N)T8r-kQun+`;hVVnI|9j?XrE! z#mSESQw#1{&%cUWabL@n7BE?~wht?jsa26vGxfcS3=ED|WRmngdP+OvRe6cEWn{Fv z{%W}W@=anUkfLrmDhin)+JL6^lgEySN42l$K3l4+Hyo!N+INwuR5uF~v2lpXm!OvA zg}X$|7(`%p^iR=7Y9$^}m?c}*v@pAl)-Y3FB0X-I<|KWjQ$`AqvXl=EmQxw$#5cqm z28%SYg2Y-DlQW6M;IPBMC~x)!&qV&} z8Qf<@xrFs8yB7w{K%oGmKmbCX5ZWED7v=0Xtj*2 z`!IfMtJ7%a@?yrO84XzgKmKGm+$ANBpPZC;VJAa0-S&vMi>sHP{YFISjom>PwYhJP48f;#T78EPJgK9MZu!SZ`$btZ5NEb30K+j5Ei34&6 z0r+pUoR?v0Oqt}2aGe8+nxI9o-;vpKu*X|a7VnLYEe0E|Y@@{4>ngVSE$U}P;LmCl z(u}J}%^F<*Df&|tf~#XMLSS<@cpnhWI9LJ444p0UQ2D z0fU#BsxlJf&p#?Yn0k02{Y}BLJw0@eZ@zgE@hza^6EQz*#Bhz(cqKP&47|yiuqEfi!!X zP>vZuykKN-)a7{QoVKM`K0f@78Y_(Lx0*91V~gpDG_S1^!{a2CKV?(}WDw zkSizh8Nf4yymXy@`1M=lzZ)^JqU^T{e^8L|@uTuz=wQ$8#&Kg>Jr+j`6~C63n?u4e zCgtM63-gj~MW!Vxb?fgYJ0@(fB_qPm#jOsr^KUa%f8X4^=eK(wH5^p7Hk{U2`h#eO zb~~=<1V}W**Z&iUrD!=JvQb{#2guGm` z$s@;Yq(ZEpOt9An;};@2G1`2)D^p0GxC@qbvdm#*wX?=)ohg(!h6{!(8@mP}E0Pk_+@7wfon^gy-(mMZq`H`# zB6oo+*HV@%|8*Ow8v`hEP8*3#+Oce~&OJBhmklki9e?V%JUTSxytb2h>vel1&n=2n zfYy(Pnn=US5L(W&zP&Vh8sO8f+#W0-YSqYzmpO?^Md9fQUJ^d786YcH+13|Y!B!I92^-q~Hxhri!BN8JnCs#DpTgIh=QuAf=7+thd07CGCQM1w3(>Qz-IT9ZH z(q8q*QW?G_#@@7*AjMk6f!U!JwaOM9$?}amC+r`Hlxoun_M#dXR;YkK)&sX*++_V% zcU|CmQ>yS~%$`&1*&-WFF7w>l^w!prE5qF&iUEx4kA}H=4_%vqG$}~7lQ}Dm5h^m@ zlt3Lsk0tTBm8!rgTYhV!+b`;*Ms=NyMEz=p>Z`aSLrRlGpRVx+7k*+OBiuzZ=SZaY zk(?c@&X*vBAHA#BZsU=6b-g+t9mRgnlo?*0dHlQO-RJ-k#64ve>x+KUB)6Rv7Vl2r zeKdo_t<`v=AcA6R6VOAO$*lj$S_)=&xjy|H5`;uNmuSa-?EEnjfJ`k#HUg2RK(-#s zi1=%CI7E$adNM2-D5mfdn%ud*SXdYUylj5Kax@^zrD>BAV(x*O1WKW8Z^rm)5O+iI z7@~|f)Tn)jS*waF)x2teZb13Fk^AcB-Q$^T5Khl;JXho%5j0LX8Hk$_xV0W|57sk< zJ)&U?|J}wx_VKDSRm4EaGk4wMGjI26w(iCur~R2g|D}@%l-I+P>D8iu&$|Q{y+0jn z_<%`XDY1;#{D840PX*FBcUN*r{~MJ^BreK}E_mGUWO4L-?F7;wDk~~#O+uK+Bj7?< z=&mmTbMqie_6XwGcJOl(y)L%q+4Rjt`>c4(jIok0^FVGc_Sfz!G}$6;KvMKfO#;rR z|NCBR95@0;qol3QOS7z8y_6bIZBvJ7EW&>G=Q6}WO+LU>u}Dix2Lem>vg3`#1RCM+ zK%V~Z5mW$-hy1aSHabxc94*eNO4uslVeuN6wl7EQQmEP@Ig-eVN-=h@IloEQmDfpa zJ@wL#k)VKSlL0b<3L@HpJ?N{3{L&XlM0vrc%OSVX@OPGYIc%K&)~`SvgK^c30Um9Z zM%CK#wS})Uj*yCD_0DpNRe3NjxD!Q|GAZzd-Qw@43f-;Q9RzC#_9T{WYmLB!3*&c4 z1xPL)`lYt3ue=ekULoN>PPmMyO8kM!^Pq$BPzjNJ0MG?p@9PR#X%O+7?5F^DA7&U> zO-`w!iNNyam)ly9C_TWs;Z+cY(ot&AR6Cwco&qy2L;xjfUP!Opmb1bRggt0ZgPeSS zB27;6)gl2kDm_xIZxOO42ynX%oIidAvIUBXn-`m1@(9F0rRE+8uq{BWCGlJ?KKQZL z;S?6zkG1`{?C#UGz$P_Fp=^#(a3T$cHn0M)(47!0hcMuQIv0+*B@Ap;dwSo-H$Jwc z9)4-C2~6)my*PRo~11AuG>w}c%B%E0U7@ZlPWT$YHn-i zB_h(^x-SAijg;9qJu6qg>e`|QV11_#O>gr3rAZe<%?KbzeGqyLf7wxI*g59gO?@U} zhoIU<{x`mWxJRru+ubArkvc>(-Pj{19bUo+7>VlRsbXOUfGFu|wsUP9>K}<^`JNek zdNTO<@M=S*{N;OZz6v70MS-ZQ0q_W71mDG7;<%LoP8!5@|I-r+bBR!i9yXZuqXdxx z)25d`z0cjsdnj!89SmvD`pf_e(r~-K@FRgvb!eLBg!RPhAh^x=#M&XLBT*$FgF8sDGDx7oM z6CXyByZ}am5I~c79yYEh6q9hFUAcC?$d0f81GMMGuulM4B7zBH?wyr803w6XAmyx{6 zSH&q5gT4v3(B=Kz$uJrS&*;>73oIg0KpmE15FWxO!+!k|m)&%=Yl<7>0H zObEbGms{Xl86$y-PD6ag7KTikuwTtSj{rLGiFJzKt0KR3%kyt4IV_#Izf^LEck zqgwQmE7igjA2R#R1y0>58BM+>vA0du1vMFNlh}2%T9Vd06VXp4P050%Oi>zHZ_u@M z4Az$pq~Y=~fXtKZB`ahr09jRPDX4o;iV+qR2!R$B0|F4DUb(bJNi?Bq3YKL};4X0m zsD-n2tLBwsbL{-E0b1qgWrgtDQUKPrlQOSu-`k#p#|^1ffP=MxPe|+~LZi}`EALJ6 z`SC;k6b|o;&cC+qT=VMWxA@sMP{dC3kEBEP{uJD59}@5bVMv-&`<*i!(U2<#M0PRR zY2!6)Mh&)nf-(&E4U2DQ4Pq+h?t|Jy7jTY%>unLGc|M`* zGrkN7%@?41;JY(upyzllHeP>5kPbmFz{FjJna zDnAsM0o^A}bKZ&{l+!YO?kSt&a~1w^$A;0vuucbz!#Ct|#{-OF93XApF+oUpYBIe3 zD|ae)2g$EkG%lTcPr6sqbqe48uCAY}3X@tl(^_0?od6zd{2mtrg6iWa=iI&#F1h{A zWW(4B&QX=7;%a*YUDGt%VS7vEY-ec;=4kx)PKAskElNntK>qtnU&7chI}i)bF@l~+QwgIGPB&R~^se5A?lETY`0!3suD%!yo zr~V;b6?IYj``7#7Un-YgU}N;0AVWu_M3+L*y7~Xj%vaJ_Z3ovV@SO`dK~rwl=g&(9 zfo$;D#&=v{3Bt=SNaCKJf1dRc(toh{77gSVqBgvH*w#}*j*IZ!h?Vv(!Mvzq0G z<;Bc!`f-8+p!YKVYLJ2h;!aPMei1hCN8bSuN*^EU&oP|@zcPQ7ZM%7Kex7KDV1ohT z(KgmMU+Tnl8@)E|k!_OXit-im0ZDa4;tSNH_dmi39qm2m#OpKj(1CJ$e=W6LXKb8Q zEjmc#Fs|K69toK~Mg<#4F7|t3+xJ)a23%_9va-@rOoh~+-}|Wf)Sw<1wtwH`9VyWM zXLx%(nzu*hCYVQw5WdaOK83CJg;7uu`O<~E>I2KJ(d6Wqh0yHWPaOcVgW-n(B%ZV< z*f!$*d;T^lQ1YA5Cb}yF3ZXxLL!ZkAg+C9YRQmx>sKENF0IHEY2#hUW#doa0J6(Og z+Uc*dJkhUB=t@Y5VlO!CoK3*SyN=>U~1I6?1 z!mL7}wndJzQ8|B3s$IinL}p7tmmAD*t_V8Wx4xkrjMabyC|>=Gx=|sDQ~m59BWoL)nb+(w?Pzj|)=RW!OTXq;qdxMsS}2jWX~TH>^K{x@L2Zwk#g z7Mp-W;>j8_73aM!3v@7Cr_H7uKPAkcWc<1qk`?4Wdk%IwK6K)+>XNdEMx?0%us5KF z@L`H*l8+l2bkw~vHYyF@SgXE7@s17}@tKS0O;WzCx{q+a!p8&nY)a6bMF#h*dp7G_C>^-s|^r>Sa~AL?dTdxi7&WW zn|d^Vyv?WJl|$pnWRNlN!b0qgB({~cTxNf_K7PptskDzla5K%bKEmf!EuXfHNteq^ ztdY~n_=u{f*y@n#Nbr&w=Yx72S_juSA2vBAO3VKiQ+5P4v~gx*@dsupj3|3J@RWM< zr3Y!G_r4hb3R_Y`p8f7{vmuEpYNfVx|2;1lK!&~nHIAaj%9Qv{^PYBVATcOLB0#v`-#h%E5hs4;Ok%Ie} z0d6mph9KlyV|XC7?A0vy7*b9u&XzI@yv;$v@)skLX&8ln$0y$I++do{UEvaTS|L%% zT)|WR_`r}w2;OG?$`APT9unCHc5=QF>VNl`X?8_gP9fgHh>%kp7XM^=!9ARqFv1vN z(m~qbAa{7U_igKMq-r*;P(&W=A%QRx!a(XoG_gzBt43$xwuhPfGIUxJ3P;MbL=s@2;8V%hIMOfSW9usS3P2wV8p!7T@g zs^{z^9@0oo1g5#O8CngCpWz6vKcbzVk_(8#VA<4fqt`NMZo(<>-%N0;58xcSxwbu201A} zh25;_vX}wCKS3T=>yDdWU5_VnYZFsGFM9Tr(9Ui%FcG}bZ4v`RVjA4bI)AmSKrc3H ztQ+zAw4g-bR}WaG-(cPEd&J>Z!tT|ai>w@VI}KXC%SYC9cWgWj^V7FIp2B?9?nXi| zmP&y8EzxA{;5SQX_w_$Mm#UFdzN_}qbYkgcyUQP0!yrv9@fb= zgpdVjR8e#nF78mT(|RqoSg0tgnKW=l@9BS=a)-JEy*24*xo4uo1XjJ4?0Qybf{~s5 z=03*F-E0Np{C(oovy1MMVS)`c{Az@D2X+qr#6>vcS{R&0cYDk5USB9|_^G76`h+Ut z9u5|fq#3+Zj^~IUKKkD<$+l&nL}J`WFON^!d!OfFEqPNR7yIbj8QEz)tJ>Gg_BHoy z7zrukuMD9L=u~Mhrx8ZLs{8MC$a6ZBGn?=iD^Y8bz;iLQRDEFk?`0O<#K|5^WOdrJ z#%DjLHu6;WY7<39vXm8rAeKQ`Pc1o{iCftvp>HJkpTHiH8jiufohlPYqdw1H_hAHz zM#Q`s_|khj)T;YW5jY>;yf>yk_CZUp47I;4)wu3$$@`;42b5EzYW8;hN8UO6PNR7( zSj9W$?t9e}`v)u3V!-~=5^@RUY>DA6X5Q*yhH(_8Qss<~NyE?6MVIH;y+)Zeb!mD1 z-d7>4gjD7Ast*piLvv(c6zW+ifP%NL76FwLl*XRh1{?!(Lto{rEveSZ z>a@c5-+|F?E=D*I|IEomVzmkVm)fs?_#Ds2W?B*7X9PBhR{9I|p$z$gmJK66x}2aL zF|59FM)}0)7<`OSg>5%XRXF~X)qeF%g}C-O|6#YA)euwAu}ZBqB=>pmR}z}5|1VAzmLLyC?M+b8$g5i>GNto#i@gZehu z01e{ChZ$8BsfDfTgwv@Bk_S}k!jOjFz;Urt+lIRfhEixIYeIhTNtse3h!u)Snnix& zV8;K|T`XOY1RidJ7r|Rr_+Df!fjbjQZ~pyU0*{q>PEk8eH=blEz1`M+EQ6MNv;$^| z(=Tf|A569E@g1U258=`13$|cJAzWTLSU9D!Ahbx?|1jra^8f#>oZvo4V55@9kFPK&O8e=`1?sFAzD za&|rZ@C}%-%KAl721jB{9bYYDAh>qk;3^z3`t$s5P?V}JVrX1{qb9xXeE$F+Ejst7 z`Jy$Jy2`LKVIk1e5g`KbgBf|1aHv8v5tqc9)e@ABY+whBl$Se8@xVYi)&>-U{_Sa= zW3yL(&-27&L>-!xP2@G7IDTYe5v1RRNaEt7tFWG^?x)t z>DUIg=H09uJY_)m=poCRD1iEl$?D>A`~ z!)Tn&pJ1FPUc zs9*ws6nWg|>3uXRb)*EWq-tjE9A1bUtwio8s#$6^!*nPdV4vz|XdZx(c9zjAP(^-R9-Hr;r%B9GQv+vVQaYf(_|4!=^8T zS5SmwQXQqFp7n4A_eReM&LkgiA#g}O;LFa0<$<(I!+*st{tv&f|9|{K8}^rqyd`xh zd0?yz37DUW2~46>4K^-f{$B3AtdzREER-Hf0TsFzyrYG*NTbEv=IyW9eL6%{$40WM za|}!=Q0sR(9-`J&U-DPG90#?v_4uu&Sc2?zffs!z>f*zMOGY$_O1>36tXuKckchy( zU{)a;^g)de6f8QAu#k4iJ7wYk7hzhdjUFtY-%sq50WDBjUV+m17G}jFH-Z=>?OGURttaq`&BixoVFhQyVKfH zBjU%5RWa_Vx8Z{VeF$$u2yWqv@)_;g4kF?6-WI)8Fi-Arr`oT#bogX0nDvVs6<<-< z=ob7?yT4w*|KWgsI5rlH8*LL9)`TWss88yDL~3~gD>AAVWyB?-e=uUjT`+`S|bQ=8K6=t&*%_Ipp@kASG%)JZ|!j^q=doxUq z)hJ^w){&`gq4)ND@%3KEotkG^>lR_IV2BVZ9s|?S#-;wmaQn?>(=opX;rA0#RZ!;+ z{`B6-;%8@Xl4qB;fEc@T8#kjc^+pYW%b$PO?q58;uZV&MvhOecAz3R~qdtdn{m9Xu z^NF6o$-GjR3VZn{B(R+aL>a%MAiM~7%;5uiUXvpMhkdU?JU5aRc`(=809aA^&jPp5 zmcp>ICv;+30*6zAKZ6momB(ty;7DtH)%}KPTUwwWZi!dtr8{?Nck?olW=E`vhD|T$ z!(X%H5ApKs>rYJGvcyMSb;`zHsc!0|TQlCj%C&7PsM~(WpU>+)qhlgD&WrS3GGVH% zLRf9>E9J{i%Gy^k5nZ|Y&Ytn_4IFY8^6Y`FB0tStIo!-jTX~fdG9ioSV^%b5go9Sl z8n+jV!k|W*|3nRycB7Lr-@s}N#s^kwti6fT$(naocM%PY*nM;oLEG=`a`i#3aZyfx zbHEQC?+`k3>uOGt2SRZ3K$RUR6oBvA+SvTUY|2X1ij~8?&aOAuGFfq(V&~#Hu!}}8 z_ym0S79&8{!Tdu+uMln6M&GqlHB7oE&JX2780P3leyx$7?4Y12bA3E>D!;vvu^|!Y z&ZcARcF8Bbk4Z52R&0=&0%i38bYk}#?D1zF4HEK<381~NvcUVVWlj6aKs{Q#=6hAw zck{nyCRU2~I-nFHQ%bP!(u6{ai||=;7kpG%c_{=D8~cOlR`Q=fPDu8Th?ClUa>G$s zm6tPsnZLjY0?LhH?xE+|8F5KlKU)rY@^w1lup`Xnk)?o5f8WxTi2DmnH8UX?Ue?yfRO18Wt@FpfZ>Xd^sy|6w?d#txmFvf&Z zag*A7z*@q8W8rGU@)A_?W`>MmpX+pl@asg|=HpV&NLK|ZBO~KczAUqdxC#y&!8F1z z!bUGG;5*1vOs~F@!gAyCO2M~SgLN_6S)}}7b8>QWzl*XwIA5m8w6lME%pIsJMdg+E`2}ucQ z5SElwx=}zn6#ZzFPO~qfeLfyyf+uqoy`I2J~hqzE6cQ96GhNfo)?ePtQ5>bIu11rnid3%n*lpQm^o&_T3!v<}|aD`tzeKULD$`zx@PNFF*Kr$rB6mc8Olbfp?W%x!Fd) zbq{g?$ICZ=r16(eLq+UcHMJ#P=Wvy7tYE(CJ-z5M0Wj50wCTE3cH1tA>8j78Zx(O8 z$NOXJO`q1Wh7s$}bNKFq>lGum#y&RfM6qA3pRaj}NqI}1{rutH_SNgB#)2X1F5T)~ zj?Ja8tAy1A4wWs>|6a(O zw8K8-#kWj}0+`}}yt>)8Nxha4H}&Kv+FPaxFmeGY4>j$jlU{eKBRgRTMuy3*ylVdR zw*3;xL3TcW#3SNb+i?5<9~!om*~I8G9NzivNO&iqQ_8)Ansv1Nv(K``PMUbv6_wNB zsn?Iqq00r^ZHkPYB%7JI4o-Jm+<07dK1ifhJNJIN3Cp`!+`O>4H8}&{_pDl*g%7|i z@liuGw1>{7B%k;=WR6}LR=#8Le4rrrxjDNb`Jo~H)EM>$9^5x619t$@~8j632_-~RKAEbfa|NhW zT2uPFOTVYd#OY{pCuA@KHm~2GUHhc35m-@KRu|u;P0E^%GfxuF>Lrt+vPxwao+=eD7>TY5fJOKe4=_ro9O9As(sg~fIhcQ_J9VO}-@=Ow5 z+2OCBN?y+&e%oRT_2^rmM3>Xn0}~f}Ur{6L>o+;3N(kXEu7 zv!aife)W}OU!pTtKJ|sjo@^J(#qY%PS;y6(yt|3?*OK&Kv$K=jq}p$s&;2OzfjMW> z`asn`p*>8pAB;}n6jxoq3i~9lLxcy*HoAKFbxF0RtLpNEv$B6KIaKu}Wue?Ayl-46 zklmp7g}(Ta()ilWSYP&X3?_QrrPP-88}nTxVmWA)Z3UkyINjMcpip%Lqzso^J;S(iN`*+bZmr-C< zN~3Lmyz})yLU80qv>dlH<9>Gg%n`9BG;1c)%ID3B+^F{?f4|qWjQ@-V`1(b@eL4Ke z*1Imj;)VU@Q%@AnZ&FO1jiqS<`5~A1&zBt1RM~b4JKXooAKm{_TjJiiplTi- zL29yTHhnM)(Zn5{!osP~d*u`MMyA9+WO8;VI{{v;L_2quc`P++xTvcWTOg=#GtYys z;&05-i{Jrm1R;RXUPFVZg%>%pLx~g$$X80-iWpd4G>h!JSdcNHQV=z5PIC8CJ5a1G zWOZiEof({Ns1Gs2fVVAHH_#O9;Vv7~03@sO29WPyeH}o(gaQgCj^^)&fwcQ4`FI9s zmX^s7_`)S|)=JtKz*FP-^rAmq?+WGo3!C)HLj~VI#fr0W4iY7o1-{Ie3-Vvd} z1jakUJDNLk^co2Fozh)}^M!*kDREzfKa+(KJj9=6u!Q>&4qBOQ9-dTu%P*+lAAD&~ zE|^qz+h?+Z=;`&2l=ZsU>zs7H?-I{?d$8(|3z2%23UOxX{`@@yMot=KYZ#Fkx z3w?+g;ZlBmW$}!}#qIb**H|RwoV6CUEmuT#UuMrLsNr+DwodmZ3%7;wPj~H7w8H{~ zd~TxDha&>cY5N0SczaZrTGA=r*YZf`<<$L=WF#4o*gtH-Ce#BZBfBR#N`Y1Ci3rQZ zEG%FzOvZ#E$~27VN{xo_IQnJT`Mx6Uf&%&Ygh|+0XD$Xp1-Pj-=)fKgDVKZaOrodv zb{_TsK)E{5hN~W+=!oPFs4R(~n!YsR+2zwCBPe@J9{o6qfWb>hbnu2zj)U*wVqYzy z$uF@m@ruf8PX0+3dOm~ZEd4?>kUqdcNv^Myos9o2!US5qU7s|WTXj5azmo}*0sw2G zuvn-`P3!d@y}K9JabpcxpiC79hR)Hb}4q#Eq7m}+Z{C@2%zlA0O5Qlq>TyD?mZ-_)+?8)^ zR((@DuNBpKwn<8kPJn5f$OWXj%oMF*cn@>(V;H3JjNI@@$QDc>4^mU^^80ZB)F~NE z^>!H&CtH$s2juDjmZUI%uUrXi7B!w)m`83tjY6T|q*&SHKXVkUaOyMHwenwNp28YxIys9*UzKV1ysc7aoMvAqIv~_)q16pkz_4V}_hO zrp7W81}1He_2i#VHVyIV+pErhorck+~suVs&lmK-)U z8yaPQG{wW7VXwmd!Lpn=rSxn403}OQ#~45mBItm6F z8cx*yBQm%W0;N5zoZn4lxFcu{hY5e?abMV;-`{%^PL=SaNYQ$usN(cj*JeHz&9od(j12-aKAz&QUM#=ozSiCu#^F=#YOdN5TOp{L7Qe?SwcQ z-aI%|DSrNnT~i(t688F!J3~@p=5jbb6j`856qHkj%ZDJu1&@HSMFG?c5KAxuvtWj> z`-CY_6$PpRgUz{Ex_?4lv{aTx5X0tnf#0gW3eaU(a7B>o=95PXm6enr3=Aw3s_W4z zuRy0!QV_?xJ8b<(ok7`8_U_}BC+~i7mI8Q}YJLw*6Gz)J4>A7@rK0z4gu5resbV{xFH#P;fuA(^~F;=23|Z3ROK+x(#eC)}uyRC^Dh8EfTyhoN?EFI@ZL zz~QnH_%fLZk@45#8~J`c&0M}eYSAxN|G9SXDAuw7bMA;AIn=Tlp`u;@MVUdWt@&$_ z8o?aP{!uFCn*%Qm<<6HDwoP-Uj$l9@h`QU&#H<^T!9mvg2YYK9n$BQpyG`?{=H*?rccNgDK zJaEcqHIdY(ACWWHI3!CD)y4rW9zhfrf)ii|rV zNTHZ14 ziKqb9K?GC_1@9GLq6+rs13^jq!>rXS;xUEIR0R?PyP+#mKD)%>7^>C~3%rQI#+QKa z3{Yj#F9?OzF400Q&H};|%(`=Io#e@*%(`iajUCBq!?i{O5ba{Xgp80JD!5k6Q(6^56eOD0c&y zFwt_mKpqi9p3}Co(4uQ4hL?(otU3pW#Qv+b-|mfehtEMv=uvy-x8W}y(n5jG!6hOq zrBbc@3YB!tvUG7cyxwKS-e?EvS*L|GHsIL7^$8?8OAR9!_ggUW%E1Pp8JkAbozCDjhv9vr(|j3Z7W$uzYQXIhg$Lc@=`*9crf;6hEX4~9K-EJeyHMFf z=~y2xrzPIYMrT_j4k(y=KX|<7&q#ExY;D*t%gQ>Y$bQCJwL|5ON;c|_;z`#y>JmL? zOifKgt^*_9A!2|#HNa*vSS|m`3;0A+&pq?;tJQ`yn3$1#<4n`$O$V0k} zRY*!qF`&ppo~)3vxny8w&ZU@K!<5nNy0%o%=4FAYbjIwuMRxbiXVT=@kGE>%uu#A# z@Cu#qE58)LUuwQZMRs82qzkHc_!Ij?DLU=;w zK;^p^_L<)FyxW!p<>7utGVYSx>eM;&5{ylqoRLZFIdFE|BB|THdzkDMQ(UU5Qy6j2 zJ}BV_Pv-`w#(jQEX{+I1MD`-T&jP?G%NgF#Qpk<_5mCAXYUnLku_);wUJ?zc$Ar!m zMZh;(9r*?YK*9=e8#1Rb4%Std)&XiOHGUp^gZVIczsfg74?1%lbq=%oF#9m8tO!x;?lOSj5iWF4Wdo%{Dp}&3}cQjyzA*Y)b3FN|B$>(_0@5J`)B5U z7Vq;gs-3eIexPSo=m$k_E!^RoCEzqhp9}(E=fE@;23P|XZ%QAvZ3!Wc$I)x7C)FT` zf7SeaCvPuhf!NVVyHjB`aY--NGeu`WVj|Mz(y{8+5!X2&)wU*9XW@2F*E76|S@wzL zOfUfRZ^?RQXjBk}ngNAXd48cUKh{@mkhJ-2c{-L*J^cq zcL2Z{`&u0y45cjDB!@T+#`KlfV!1xVFHo z-bR;DmW7^-^{m<7&I-3GF(G7b9O5kR!4nFl93si{34Pb+R4{`Kd;J;R!(uwkc*B8IUuHbz8jnt!Sf&_>~pQI*!NEL_zrA3DZj;&6e5Di(^nTl z9G&7q&g$vXwlBGr8nrr7zndQBz%3kiN0AbGaa4Iu2;ioo3Bi~4T3>5 z`FlTr5)dSGUtgHZg#bnblSn5QEr-9A08-Gt>Px1OsPtj%7AEphfm>mDVJp_NpFd(i z$1JvaI&$tyKF&6x7^$(=xUe@aeli#un7|gFk>Ay#8pQ-=Y~bydz9{y|JUIX(VxjBu zrcb~H!6wL9`3{k=EHO07&W-0S^ssS4w`TWYM`f>PEweJ{ki^UQ(F-Uxz+nZD$Tp@1 zPV%oO=okTXxUvcQ&bIye2zy42-0gMDS)4>ujk-Uf4LP*6A-!@^MKgaP3*^fGLly?; zJ0Wa@@4_f|r+O!a-sVuc)40>Rvs09ll~++xLL(MbcT8v`BiS{lJR>vx1gs{4Pq1d$ z&PMR?RbNg2PFSD+79M-#U_)$Ra=YH?=Ya3cS!Ew5MWslte@q`|-w9c4@*SuBv|XQ9kB#7JjjH?(Z8O#VDe}>S zNXjRafB_WPAOPr0Rl7S90E}xXN88u`US!nFQ#q)!y2!G}dz-tww0c2_N<&PUHAsNG zYyZ9Ej?KwCM=ry900cCHyYnr7FkNLo@`(U2fhPv*b;i$Jtci@;!6g+Yv>m{p<;gFt z1oNHhtJ{M@ia4y`?^G9uZaC~)_!}0T&s^Jr>(L`a4GprUP?M}Ia5D!g!o1>Di!~)r zz3>CKwpH8Ndjz-|nYhs&%QnNZnq@4I;bsppcMQJF5zC0ZyD{Na{y_JUS#ingHamD~ z=4KScO@3!?%aW8`Vp$}tLpp`>Y=RPjll5?xl0z z^2|;-lJIz!5OKRD6v3PALuVl{NOzAt!k;RS^F}+t{Ev=^8hQAT+^{876s?x4?gI+W zV|s%OESJ?TNZwe%hN9jmt&HDd-$kGUbS==*kb5bMQ~#BzS@8$_RAf4oORB)GrsCY8`q{n5QR zF+q$qoUT-Z5rE)YQ2DnTV+`LGRN3qsXAY6vRd)R=d%ZsfAHwT^ye3y2Ddx_vo&8pf zdaS?m#GN!(LF=9FR|6^%L|`e2%B!%ZxSC`P+)AC|ce{V8g;ytjP>#skQwP6)ECpA^_sCjH4VllnIkbzjSW|H^xL zE%v8fpjg@a@^zJWW6pPNj zOJlcvF%7=PH|A7i0`0X_y6pO*_pbbY!e;`^q&}BQ>>RAkaR>UpSL~iT`}TOV{t+bs zUo@u)2@Op=^$X9g3(zY+4@LcVYgB-1KE@Ai01Gww*ob}`a5Lfr_ALy}8bjA#NIpE% z;WUwByUsox|MDyXno|1tvpw2KmYnyvPCx5%===p*4Ckp)(l45oU;&wu zxzT>=Z&0UXoLp)2E7_fbu6Clx3RQZ(I%gihei%~c z$ZRUPh)sm1@EEKAWLWW^krBNxI%CZL9a0-J8#us(G9A^69>hr7W0`+LBK(ulw-^eHOz-sXAzl-YST4`gpS>Pm zzX862MYR_pBF!gkT;cmmCfN-EI9YL6n(+M?Q^s&(Trjmti0!_ULEG)9HVW8?)BWnP zmqRvyjSRqIyc)|5JURc22O$co&_%Ob+(e5xp(x&GR>8My)E0+txZ}QMawq`lIRvYj z3bmYmD3YnxlfqT$xKsOWl*IAp@44c;*7p3!YPp^7`KN>w^B>1fT@s(gV?N1{wpqr2~mZ%NCn$e*8-rF6rzgKj82;muu_dscF<}n*&}c7>h+K)>_!Yq;>$hyGWiAM6`m z$5LJ~#(yW2WT1cYq_jx|1msjrXWna)i%jZw6o_-ft(v~qUp$7ZF2%mrSN!l<)B6)N zx8J#kGL@nd*8e5HZb6(7wK$dICRqmvvSU|ZaaI<&A2HY5IQu%^>IZdT?lQWFu8tq zPaZ=5maU%o`HOMmKk@(=N?U&WbU)~tKw!5<5=|rZGB6L;a!2iN4p1?-8 z@Y6v|ZMCzm36p8g)9sfMy!LG9#;V@JJy38_?>5w2Y@AasL&4DN_d7nio!hmh9ff;( z>5*vm^xEP1u$@VY6P7`Vt!#td`_|NkkH2>#(%Ic96$YLgkH7>qHy~Hx4Pq$^w_a0D z{sURo#BSlYjJ9>%7I*)|94}9RlB99Dv7zN3dB#D-*(cz4_V!- z{j)fZwq1x@WH;jISI3K+Hh)V&QK=!?lP;kHgN$2F2vA~zkUg=vlY0k7@+$5!2pQOK z&Ow<6OfB4aXZT6^#AH_ZSY$);#IDF-3{gRQm73bH_Z}(y$mQ**AOw@8J{cr!R5KAP zOs5cT5CGutsNkn_5yz_``V0x~uhV0VD~75RaG;V2VdFH)0&IsRcDgK-k7Xu$7XsZ6fz^xN`tH8kg+nWG`N zrb&Bx<<_MLb(V~+QOPR;V%Y&Xnl>${{kQr63>}{T^5xRbUV9YTTARuf9f~7-Gi~C^ni2~yO?KF$%fl^yZoR-Iiuxg>-w&VntYnjUaQI|P3W9J9-phXPcD^8 zk8ohXS;k|N06nazps%}p8-xnVW(pNg>r@n&lyNj)Jdv~QCI~14>UX7-xMpW(PZO=< z8Voyx$LzNX{c}^u&10>q9{{neW3@H{5G=CSbevcyg<&jR5qC|qNq-Z*Xuz!I+M6;d zw=wY&Ew8fxmZM_Fch~8zRUFj)acIBh-azh8>_7;Kyti z&&FM^U&$|3c9%m2x&60pc+@+dU{|}tjfsq)&0_q9H#jl^S!xuvpV?vg_f8=hIWWw0 zfYbv@&!5W^pH{1FdDvGP@kiW=!5==U=L+_)5xftJd|%CEzBu__YC=G{_`Zj6Nt59Q z3dgDE520m(!Fi52%%8B-;3l7)Qh6RvZB|Q%i0|VQ22zZ486A+$)P%V3f%gUjfPt`E zPUKJ^C+h)f3dZd55Q(yIF#a2wSbqTsRCYlHP?bUdRvJDvR8%3~FucD&As3-lBqB^j z{Ustecx!MBNOv>LC(&WI1n~D7q?hPl>VcGUU(iuOI7e+O3^d3Sb05`R7?qSolxf>2 z#~O1cBP`6#C+hP6wEx=-+6b?n*dXk61MBacyBzgUq@NDg=_M7=ErQ-?NOxmIZx=vU z$2p~JvHkxN?~y<0USKl3q=S) zR6oMCa%8Eb@KEbd?myvN>TY24{5(}Mv zno0wmN=3~IiyFb62y-LOg?Tantpf5H^Mo;dhTysR>xPkm#JfNhJe#gnj+*J8F2xG% z%G6bUWm!64(R=Qa53zt%;r&M(|C5E^SUjX#W2!8YIv|mHX!2Cz`3$uicr=5hQxN0H z+Q-v^PF6cbQ=PDgeCbl!NBKQ(g0$pWQ=B6g;P63BnU~M0KDKj}u!q6k7(V-H9@vPO zYN1fhe!H;VoydcLuk9JI1`}8?7a3PDfl#afG8OZA8Np)(s60y^$;$vWnuiFI01OsP z8TNCtOr@Y`e_<-12k4Cfky=EOQ7JFDlp;P@>7s2>>Y--FIT}s?Q2n%~(j(2ZoB~(Z zn0X-rY+K1*#`PcWLG!m?Gq(W%w6`yytC52PCqmng(xCwkQuK!vP0@hd;oOnkQQTqO zf$qTQ@0bys5hY~|#2rSQc@`iv=1ty9yJ>PRMa? zxf^v=np|GW8ptFPy158sjvW*~vplHm#*$O3zy1E9krpDZB2L!*)rB{U;CVGR3gKxMl+V8iw7aadbU?fM26G0FHUTI6afT9r8w1MJhu=l1WHmzBK zFk~&sYp5A1TQJKii6B-eq<|O|5=V}dxWqwlf=9L5Lr0ucu*t;5)@Ft09chc(HT|6 z(IcQQ%y6iZl~A;KOH?9JR;pCrVa8$L=h(K>?>j61B5(? zK2&UX)h=$Ja=K0w48muIZ&dA6LB48kY%p@eo?l5tVb5d{fd(0b43bsvBtp05;xJSKmMQ{zz#f)=d^sa!1tTGHZRTAbeJh zj{$CKzzv|Pj_Sry$85B+$dR0PF3ls9L0SeW@YHRVU8eTWHO(omfGlR`42@jC z0&d0K)gJwJ5p<&C-dwCG;9oN8r$ZZw`y0-vrCUMedBRU9U$TJaM&mdiv;t&K1ia1>Fj zT=?8MROx~Z8_3w<+N~vkDv7QpNpCebw_xlya+(mP3#U!RiB-VkAj=bfw4f{TU~QAo zRRt8+!2VPYU0q8_sOuE}_M@V~;qGr)&U+qnC$k6Jl|Cya<~p~Rcs0rliE|-ZX662?jH{xxn1t|wE**kz!AyCm_2ol4`5~AqX=A`yg{ng}34eNah zjuIjS1+KcXKE4O_BuT{PoCe7-96@sB;ejYXK@o7y7N-Mv2|VxTGM2*!fQf& zueP7@N-M(r`-4SZw#3z!Bj^T%5zXF+{e8{k7vR=Gz<27IuN#(@@b_f05;%8^ETt2c z&^_EQU;`(~A#`b>`YDBi{k0;J*sX<^3((03>JNkI9nzhYhIZzUA`hr{D{yk*|4N&LsmuI%-p@Fjb|-LxQki zBiux=0eB(?Bwg8t*MS`tmI{`|&+EZ3um`UOENId6X1s*q56U8u@9vHnDQqDeI0Le3 zcp4=4;Zc@}n!Ri^N^lfbgPS>D0B%lA$rXg#h^+}ZwY@Gke54mQyqBN;KRPdo3`S$+@e|M}?b z_u+K>)6A%DiJRRYbBFL5j+G!z|0Q4Z-(=d57a&bt^|6IuFck(kAgAKy2`dE7F&v!t z*@nZSBnJb5umxjQ4o=kuu_$ZCYkRATR(L^r8I*$LeM(fk-p{|smsR~m7Q_|;GpD7U zfjgpLBiFA{G4{JHi0{^z@kWRn5A_jeUJiEQvdUczc`|wC1x^~+K%OrCZHD_&;ecO` z8uWIfvY5Z)7K4CIR>m*kt}m>LZE;0aCM#>nyST9`ZT&A>5?US;L$E`c-PtL1F|zX0 z<^jF+s__veZ>WvXX<5~E_M!B3>2+Cg%C_>kU1|qgr>w9<+oGf!ysV2aW}@8&Oh(u#X>UEeT$tUa-|PjNqrN#|2Z$PR{c)}63QI6sdObJ(9?go6Kqe6jq=#_3P&9jZ=T z&Zosrc5<2zdz8~}7dOlH(gR;gT$Kn>jrbxE_fu||moLZUxPE(8-p|kb?rgYq`m-gO zJ=H`=X3W#je$zl+=0Q5=1zc$zyB#YPSgGIeC4!v-{`0lmVg*im28Z5tn>J~ocxn3u z)bzcS9GD)p>cWJG8za&a5^|hiPR<4-IH{h|ko^8JvI2>g`*03T5 z1oy*NPFC==6h#o~fqJ>gY+*FJnzR6<2Hpz;!Dj%Y6-7-52uoJOUMPGIOD-rwxw7_! z#R8iQJLmW?%y8H`z)VJmffcNPaFl;N(*Z)65?BhV=0%L=O<%~8mC#?*52WfpctEpf zW)6g~$qvqu)bUKzCZQ2`uOxWz6}DAC@b`K91%Xv*+iDngYsQn#T62fQ`=ZL<9-NY| zC)c8r(mxN@;rzpTwQTjcU(FernGrr7Uq;!j(`vp?`Z|7^OT7Q#_m^9J`-SLWb;_rn z>R5(!Pfv=E?LYGM1VKzSn(nI=;>-=YABJJ(XgqAtsWVfuMK(q_A$L2{31#;llt`PdOnkHcR(|;j}=#Pux1Q94mrbyFvH)y#WM{iUZDa_r7iJ!&N~Y zo(kjnUHQlb@k(vta`0yd_xhp+KMfM@ts~u;ETg+v6_udiR?~GVHq3;#GK}RPnh1qL z|Cc;?N!QDTYmWKIGnNfoW@g$xN!V9n%ujz@Rj*6fL2qi=&-#6jYIF75Ol*-LZiBU4 zn6yL}Q7VqeV+(w1Ih^#Cc#c-yy+<*aTM^rPwiOGP+9$PuQ4RfmTxQA4qRd1cxZI9I zzEsQ97AGsRA9dI}MNn(|`gJ9Pd|VL)9*;s!OQ%d8e=cEx)A z^)l+3K&O{GJop#36^)sHjRC$&-W_`D*TQ9OJ*}aLxcZxi%p1o}aK^4hEN zaS?ahx2>~ZHF0rfXn%6tLQ6T1VES-gFm$Xhuv~hW(f8K&Bi`g$$*{UKan~waEK31> z?9!?kv`Mc_NR~Ak_>s`-zN-@oB)qrIqm~b#VmHw@)j}Ew25Fhe@RMudg5%6=;9`+R zm@vvmW$^(tWjX^|l{Gwk0cv@T96=yifpYwEep`~%`CvyTBqkdaIQA@17nz2~FPyQN zDpwJZaFRbq_CDa|;Sm+Y1(E9N^ji?unAHsC<#D#ydYyf~M_2H9U8>4bulyl_mXddN4E!4<4 zkXUt}>O0>AFySb(zy$G=g_Toi-r9w4D?X1`v>Xnrf`eq5!W768=jErgH4gA9^K@aW zau>g-X$_PcZJtdu7l&%IjquJ8J2u37b(dRnrHwz);K@(D~PyHyAR{-m^H`zq>-ZWzAWR{OT|tYGEZ zQIk_a5oVx%&(9#75IfS6d-NkyRI9@;mGJz*7BxDvP_V2POdb#VA=V6Lng<~7L;J|E zJbRO^kix>vbSvFu*%AsaeW_^Z(%-ae@Oy5wO?~PerEE1f?pt|U^!zghM3=j-`(Y)Zuw_Y)bU-!3BIj6cfCq} z=rKK?RGE>Y(NVk=rrM*4vBwL`XriLh($A=9S3{enGyIxSgnz}XIB?hID>!| z*}ISF5$QpMdq_|iBDM8yBkFx975ti4nq{iiLc-u0S!{CX3WQTqK$EtbH&gjN3X6xy zjJjz>PcYF+Az6m$14EG2eTCwid*7w9u6OWYI>nm0#xnC^dOFi3MZpLvJpxChnuA^z z$Tu=t01N%o18P1Pglo6n1`3A<)qL!4lK#Bdb;jq^yo4s>M;_$X{1yP3J$uf`rDavQ zlO@RiJ%wL&nWiHT>pt}=SA&~XhOKPu-gI=`@$}HQ@6n~$Po%f&-%9(w$FwhHcKyw8 zV>3N(B1cF|^*p`UYS=@ZVg0hpX>pTxtmxYa;j0OmIvyIWL=njtCN)ct%*)m+i9(ph zoM^C~ZuJ~zQ_&!SL{%n3GU3KX&Yp;5VG)#r zm>H@bz@9dJ;+b#%!eB@bb`_NsHlU~(fL8O&RH|_o*p!bn(5{3Gel6s*AePtF)s(+y z5JsM1tE#Q;*k7-V_s>u3%!qC+T9MwJ>T#ixXiW`6%To}L?lKg`NIUuQ>EXw<*brrV zp7H(Ew@n9VYkgb&fr35!KyP_k^ZzbL&a|&tt4pW(K!xk(&ydxn9ozE2z10?%lvyIm zjO_9Z#o2caF}_bveZB0;hQcEe%-qYE979h7-Q41R3RIMbe0&PT@RTW^Te4v(m^_-< zk;>6??{vsPK@%?VY-mDCAvX2tdOY7li^^&RHlQCh*Pr1|;lqPWcq~UPUi*(h^Q!qK z3kiA?r&umuXevjFe-|XvRzw&C(##17Mo}s0sTn<0@@LhyhTswd74+LGmu|8UtnQHL zAD`r3ez@irc%@GaDyjhoO>YiVSSH5in>Gj$w=LP^SPFSgp+%mIgr*7(&^0_{aPler z51Bie1Wf;1kNt7`iDiB4kPnPZj^opQZviFO+r8)5a8q_I<)5B-R187CP78h%KyN%w=FHW{4@*&iOORR;|ariCvFJZBm3}oUU!evCl$W?P15t{KIS2&Rb23eZ=~B+H7)xVRRHL;)!!S>c2A={=Uo~GH zdombpo)JCO(0eDRZ6z~>>F~bX?i~A}(-*={qERZb1@;Jpk$!T|sJZ-XddI~sea%^_ zJ99-}2FP~jIKn@I#S;P57cDr3^bXT2kVHzKlklcr|2_Ya`Lby zr3PK^w^<=WFV=Iu!~V1w6R6qV`Ll^Y4%Hj8bg9}t3dQZDGpGx#(&g6~&j0DDc4GPq zs{P=tB!5SCT>hhDf5q?kgUPC*jfWrayfEl>W4fC2MZDts24~lrG=a`HwvS@k22v$Y znYD5+bi+CJtAE|MLsYwcl~KF?bdUG;aZ>`wEF_W=<_b8Q z`Ufe-yHsc}=5MJqqK)MbKf>Y0C}l)xWfEwi!vR4Rb3Gq#C>c>h*#!;*P@cObGT~o1 zWP?~Qr_`i1j|6lhR~NG^bOK22gZ{7CXm_>qsu9HrV!d@kLIn_;enFdzcO7xh9K5JS{_nn*{fee?7LT3Y&%@4e4 zgC4S?@S%XCNHnMbf$ORmHPK?>>NIfF5 z(ZhA|i>@R*7{9AnnlEzoIRyK5Znj&m3>=aDork7>|CnTEp@X^Kx8v>Vo%P0FcL%nY zC+DXjVIlW_cMr^{W7bcHf1bMi+`#kH+_#$k&NDIoVx^#1*77a|`w-18gTS)HwduRC z24fr2^-{Ib=CS2Fs8?Jv2`d z27n>9g`@h8HE$lcp{>-+bJK6r3`z!t)a1m@7icN!iY%)9o<{- zc2$ru&_5{k}Rskd{UQdB(;I zgqns&puDl3Mmvu8Z+s)%V44Ug2h$s_L$A(Y5zTXx7%qc?#0D*sTYR=Jrk7T*@y^K5_WDLYfbwBPZ*UtEYS#AR|^?7Dx z|81*P>l>Ni-SHOhi>$tF*^tiMQ}u8fH1X6d_WR)0{6~>TaBd+}G)TIiw`SEhj&XhE zmNZ5=S=HlXwO8`q?WElweI_<1R#|*3<$er101XcxgjJ+c@|V8^Uf=j<78TjFl@G1hN5+U!B6u*! zlv4+c4eh2enjB9YtZZ|ZtU?VaqLAdg{UNJu#T*7_76F#D2Eozl<+Eg9!zGFSDK^uO zW|gTeXe=*dO!}3zoAn+ajk6DK-QS6;f0nXA0L#36fkq)Jc+!*_$+vm^k?)YE!?XPW zNJca@G)*Uj`!zWFL-pUjbF7H<+mi@B<66~NlXh}%egy-{qff_yN*gyD7_T#@cXw{V z`l}DWK5=pG$Ml|;Bm`&$lq{Q;jVWca9J{;8dibgi%Emww8Amkwlp+=}k56o{2W=G# z-G5XrF0pY3^c@?-od@x;4+@P4EEP1GiEz#dPf-)Gr`9wNgB0axkcLIT$yQ040ub#P z5bbzGuNmbp&qhdtipvo#le%eDtgxjd&RZp3Y**iR)~79)85kM?14O_Qy(-s>OQOr3HSoGS@4{A7+}}ZT7T5 zVzK07L=T8g1kwi_d>KrY;s<=akFtj`x z#}&sFrhgA3)4iz=D|;&oP5aBnUtJ#OY#4A=vN$SUas$5wX^6fky#`H@e=6SjQX0PA zc$IMrpG4E^{^TDedFb^ejHr-Q*PtU(#8|E^dC=r`|6uS}r=9sSB})N{Z9~*K^Q#3s zbyNi2>~%$+lQ?Gh3i?d$9b#m;ZE?HHPa1SD^?Vt{TNiv1%zV4Q^QnMnfzeF$TE5qC zjCVboKO2+kA$kINpS#C-P;q^Bjxp#29wmPKTY&}#yz(LAcWiw@a)~y7l(i+(^b{S< zxAKxCQlD~IrRVAsSPTDz;G=8ROOL3Pn(D<{P8(@aU|V^07^BZ5~u6!4pP53Ew z`-PGL`uq^&z*ZUgkmrfiuv$T=ctGiyhGpyW>*Y`7+T-%nXgxZ)SWUJIEXSq~h|(}` z0zQm%90Y5TmT^!1Z=^o)NUvyT!JLRmJ}p>OJ^lIcAh5I9^LSvFJM(Q1EcB=F&&P=o z>X=_0_H}#(9-V6n<4h=2>SfoM1N7^fwo>xVP`3QuCWu2$ISi9nL1&h1@1f{6njuyS zX~sgKDBLh$zE#8^>E$AS+!??uns_QEW=4mzd{1Wi5fX)lW5U3|&^(`sMOr5P-E3Gg^k zA+{J*)PA(^ZI>7Dcc&k4E@6gi7fs-&~xY?27X>Zzvqgzkd0-$%ex3>c!TgLh!}sxIYq({V}MQ=g1=7 zZ0f&~7uJ*FoHC2WwTlN8cj1fP<#`wH?asmI{d8?=WxL_!ZL-fu`U5U`+}LJJjLCFI zpwjrAn~q-0<0#>QzI31^WDU+6~`(^)NhJMj^k`YK_zKvi7r@ zo1?R2itp6NYhJHGv~VC%*sj~+>zx5)%xVOTAeIpZl;P4;qqFmZWb=dHlZW*l>EnhJ z%=zt|vUU3cMay9Ep=T-{`5Ku^%cM`9M{x2iJC5ra>+Ppn1Q8}2Kfs<2L*@SgI->r6 zIpaNaIZO!!za^K0(mwTGHDuo@DJwz;mry`kKggj&OSoRa&~ipQ9~nl*Lv;4Js~r2N zJdr8Zfmu0@`LB$X#=zQplj~4Q7@s!{{`)6zaBI)12HGe5T}^|}Eu9vo-QRY{#$;VO z=ZFZlp^H{bk};lc{dH{5Wqtvzi~9_8(`|zW zNA9}G=+sC}oIkpjq+(RNGv+cQycSaWieYZeyEvs8!QJwX4Ioq{f4ncT-ykr;%=76IL*9 zro0zb7Y-itZ@EXDZYUSpiRJ$mas=fdy59W&ArT(bbHHrRkfW_Md0Tp*{7-HGksQz| zJaP)SvkD5+`U-O9S#utll&JCjekmwV67HqAGswVjerJ9FeSj)v=x@#t9f zwOC6Xbf(>Wy*~JjMV>2P+W6zq zk{mFoXmii7=hePn_a&8RkzQ3+EQW8`13^Dao$(?sNU3@S<1d+cm-t2n#a|0b8~>NZ z6AC@7d!EEx`Z+5=Yda()+-CT$oAhAB%{Na8(P`8<|`%&w_-Th z`u$r;ipPxy*H!$)u3j=X9+uOIxetBD{TSGNqVbJtbIS}2zl&ehU2$AxFuR|eQWe7^ zux~eaE^Qe6QtJIJX2T%UNNBWmpDAjR3&7J9c&=rSeo~j$W|tje^QlWZNDIrNa(os; zUb1{AOITscMeTMvR&nB39)>hXPpRv(bA^FUvq2a!LH2XEX_uC2-s#v6-Ud_ZVvm*R zue<Ul-)BLOJ_5c4fH|VSo_|cFe9ICx<29^*1@_OmakWkym$8r$+?5>{wHJm4F%B0_8PC9)~3K@5#IY|s6;S&H=8c-NL*4O zsevUP_K4t6e5;9A99#zd4GU;45v{~<`>~NnN~6vPzfb} ze^4CT^)uUvU!6J?H>T{ytZb!hdJ{CCU;x#w{9`q;-V6Itf>tU%Jk>)7)ht34l=lI| zITh^znkr5TY0IyAbsO}Q`sdlG;@v-1u}g2yx-Ph z#s~@~!p4Q>JiheG#) z0VVH4RVHX4ZuNUlns&w)3#ogTQqZA(1@0~smDhLpebuY$V9lSi2>+q9ajVvDu`4#nScbq~#MloJ{FrP&xgnzQ`YSlB^amt0-fPX!mjIX?$KUhA}maz`Kx(f%G%#|3suV zjm^|sA_MZ+j3Jc@5Py5>bQtvX-SWUySR$_9q;L2kR4QK=X62Fn4v0}o3cMxFh$Mj; z!&kxf`@EI7#3>+IB!fC6aF5$!-58;bMkw+XxVTA(HA*8E9G%IZ>l9IXB-U+tB{3eY zx*$JHF2R%BTCc)QP(!r$##$>`VaYauSx5o-IA`XLjN9%*l|)d>+wB++>FbJHO0n<} zzdzqU-8f(IE*y8`81I-J4qUJE3%KGo`_yqoKl%`3us3ZcIoP%+jcHeN@$yyUx73uq zZB70!b7H}9UA&>;;YD9w7=?)(zPT!R;_SM-yZN&Nu4S=`~&0vZhw^^zSU&MA#|^$Vc#ob zkv&p{Z{t0EvyMe~V|!QntMyBukuiN$cG4>7W##&awgFit@7n%Npj8g)F5r^!L1<6s z`1&My(V)yCfIu&Y@m)&Zp=ssup+K}5gr9}OQ~9zE8~z6q=k1cBE7 z@y)Cx_F(VI!MX(5!K&3Li{EztH(kM-sN#gEObm~gHJTqR0QdR5$P`Tdl=J^w1kBN! zb@7eFnW_25>Wj+upJJ|^5@9x!W7Ryd4T4^V}DlHGDcU5y3n_6P2kk586h4CU9(UqDIJO4w1qgf6XDi9<2IxK=ZT zQIQ8t##wHB9V7^`Vq>He%mhjJE`5TONz?XC&_l{bnY<$nI3W37Z%U|CSyiJWL-#-Z zt!KrD*IGLmjqOzf6=cgQWRF0D0FlKth#qM&X;x%Ht3}X~{&VotO=RkK>VwXp4Sc$^ zh*&8mnn^AaxH!`(jBh0XeFzN|^ufgX-R&}7CH~#p zT~A-Z{SVW1!ChTr^h@4)J%dGWV7e-^r-k`2q~d;PpES~6BAw?A|6u6)^8iNNd$7-g zqDuvk1vVg}6Ek!ldhvj!v8Sxif7g~KUqn}7OtqMW)3it?`Pyh*mhLT!5x>c+SIP%b z0KDByY!{w%BXrT%2Y#Lbb0o*nL_-j($UNiKF_Fr9E%zzsz5}C7ft-bkEg@ouZSmus zVcyT_X>6Y?%L=h7Tqrpk7j_QTb)r065uhq$n11~#J%}ZMGn6JV^Jz@-CrENm+fQ1Q z7rD@Ej{Z@rs=ELl>ug4&+Tl|o91yVKJxo|Ku?yDR?iQngz&4yqR(|IKnlzk=d?xdO z&6|AVs}Up&Z}WSVkAL=u5K2IwCB~#!E#$r=#r1h1-=M=vnCxNE-T$gN^(x4-^~h(P zCdMY5^%Fb$-6XyXaUJJ48vfWW>d6 z|AfHr_$om%o0sI6Ylm2mg_*aqxX#~3G$A8t{=VX%L2?xRh zEr^_uNAyiq)0InD&|cR3znA)uDUY-5!saPa4DR^udSCz64S&w;3;#xsqu}Qg3U+dU zlk=;VAMVyOn%!h?zIsj5lT`WxO;-VyAP5_J0b z3%aY3RWFq|ZyYA>ChT`RMtACrb=A#lU~*a^LUik)IjfA%^Oj?4Va zet{C$)PWT@6@3f|$V{^I{kQlGkwpxAyt%CRBGjxv^Acir30?BPd(N7E^{an<6dOp; znW>Y*Fg#+w!0lds^j=&NO`Y3Je&?arcXsWVvemoKNZ4??x1<%K)Nn>sPD;7Gsi=Su zj;5;5fO3Jf`}0gEZ5HgFi(YsyqsDwgZ7~S1dmndxOg5mhU=RP6J>{t=&Uwgmw(kAzQE+< z@G?vMn9x;J%uluY?LDcD=ELhD>u+Ghe(VUAt?;bXXl(r4)7gh4Q=F>X^x5Uf{C2<#Z(WT{5BI zX2q|Z_%O7r_T0}iO7&mn*+d0gOT>uMMy(BcP10BA1B7P8@6n=#X-4(%1`lMhLSH-|K6L`?&_b zr)}_v78HdviI2$!w*E##!_TqD@dyS$rbVsj#GikG=-yt-iz@igA_=qSXsGZ35Sh79 zYE$Pyvweso(9>JtQUM^EhFkj9Edo?T%?8@SxVCwdzzE4#zi9u1xNL>)b`g#dg>u?| zI>N5F4?_5mrGLLcS>pKUO!0z{e~e_H)TyVQgE_@Mj7lWLrB)1b$j05Wm- zktWaMUxLGqv3S$m`$VVx_7jzdd1Evu#IJuE0#9|tL`@@ely3h%pz!Yh>|5Kvd9ZN_ znlKn@TT8^6)nu%)baPzMHVI{TrxulX_&1K;jt&6dXj_h_X9I8;r-vv-i5M!yOwF{! zQjBK`^hmTAZPR%&EA7H{?uQ5TsNAsw>8F3ZKXFM*OJ8-(YaJD!q_)rJKMRLP0aV&w zDNND$Onnd^Px7!PWJ2~h^#M~(Tz+Jrp$E!IEP9`rjXVi(|E|EZ4=w)MuR}lCQvT^v zdkvEWM*UTr3KAIXbzu4F(-OuAvO3mboA8U)&3^EsPmqzAnB4HmUsWk4f9Y} z1logR&I8>x1bnvcJt%YM6I3kxVd-KW5i^d{7h+Jyk1;I4$81C$hNR?}F?F?u7wj?E0D6@eQVe4$x z++efJ1f42;$NZKZ2^#a}JG;G46r%m|)lSD=DxWxf@uXBE7;a8SCJH5)suIg!5f0X= z!mN&84`qiC5aiddb3k;!XS1u%DpX2(VL$nC^K4iZT^6{LmZr3vK01 zONU_~Wz>2DuAaL)!nHk69sd@74?d9g(`!zUTuBv&pwqxvcmURa;bwp%$X<1g>XZn0 z$&B0biHeX+^r@!^9`Le5kqDfumcDtBMaA3w+)3#N3Cw*Ix}@9quOAmOlRTvmFnVDs zrhI$*U9f|f*Cn>PeW@mrb3XuQK^|F=wtbxM_3qM!qbhKsu&{Ott=;FY`1qUj!KCI1 zGLlB8;QQ&WD-^j3nz06-n6H{urDRr>13$2BWvH~Jh{wXiN<^#$&;1}0#YC&`t{E

_}tpJx&)Mtps6cnOM(Dla9GzQrlRtuo;}T$2Nv6v zFXItET|yg(V?3<<(6p=;oVr}$@Oq@Gg$Viqw7kDQ9g>8QNjFk2b>#4aulf|^Xb@6Z zuj{Avktqu-4teBv#d8hAM13E>_9q1H-z}BvouiNjIb0vGaDA=9J8Qqb@F|V3hr9Q# z9Pj$QVnZL$;qvH>)#LjBuG_x^13v$1$9pE8vd2e7=Q;x?GG~JMn<-6j8UEboD;FBo z2|Zp_>4_1~Qn5D>4^5Na%*>KRGXtejH6F@PHP-6upQQkm3SIe}{FUm*P2s1`KWvgN z-h4COdX+EkjmcRq_5HT{&wAW^rnn=Q<_94%Gvj3Yg#k_8YTVL=_@QUfByW*Fohg2U zW7st;9;>HuM)Y`A^;TyD^T>7Tep`gPfp6A}3zl&pE*JP-u;TyA%y2+X zxujLm6cg6bw`*e=!dG+Z8oONXpSZU<#C|sXbqg@%7fh+m!u_B zZkwG$4=PA0^wX-kesuz!cqpVa8Tj9w6;wJ%!GJ^jyzXlfwzYto!Hsf+sC3yBVai%f=p-D& zP*(#L-~~0xj!2)UZpi3O!n*oajTH## z^Rx`}I1Wbx_bDg?q{g7oq%0S(0sIl75u~|A9~O8I$}a)N3FHEDPXBkD07H-2^87EOX#bl16~jjNk3S}qS;6hyBB`~mDWUF)M&3S?zF^q-Bo2}HJU zgkb$7mcPd8#$}7&nwzfrVQ$u=X^Mfc;V@hO7^2nZNPwsYr#MwLTY$XK(swY7KtV@E zsN7`b-}TfPpTMZWBU7q@@ekd#3*M3++3N^%9qryMF&at8r`|J*fAB|*LYy3qi3HMk zlL*itW_VgqMHVyjeCm63nlBOIUxaK)R_Te1zDEHNIO9SFZ-_j&55XS?Is&tD(GSFF z2l}GK%n0O_>u~*2`n?{7LQ)v%$pwv6&~)UC`#_Ru^M>TyW)is=GQy)Me!?6=>PplT z-fv=X*$8ZVs%$z$4>>xJ1)x(4>>+XQmj04j5&AGm(v*)xI`rbiemTi zB#DNOKeC~E_`MiZFg-a>f$w-w0Ia~d6(1gvCKj2jEtEFZDO`a?~h zMgwJ6BLK$2$_K_W=^NzwI?k7+R&#dk-zWPYKsLMHLl{iO(Kc)FT?H{e z{9)JwTuFNfdb)PEM??R8&QQaNFO$fi^=?IoS^K@8s<<+je==(r&mkt9y_Tu^t*!#s zK(@)k1lps@hWnlLqxw+c`Rq4uT)C1R$upU$iPTsRiRcBKFBiG7$X)h|YT%R83i-i2 zV9?pwMZE|11M;KCD@re{CCuMO>G(K2tkYWSq-mvl*=DVlK3z677jUzn)zyYr@rTVV za*Cy}U0t+zJ{DGbHU5dtn@{RRY2)L zAzuXk*RVdAI-c%->vI`k(b>!Kc)fp1bMoXxb>2&KaL60y`lNu%RPISp{n;~a3narx zL9_wgp^6CCY)jj>amiUtEz<>=dfS|BP5zL`jV4>)2V z!%pm`)|wg?$^3_B*&!-C;3+E3^>+{4JUNhi>it*T>1Co?xwSnlQe69X>^Jsd!tP%K z=E!}b*`L4kY;3_rOxeSs*U|>m#wc&UVLKd~_(8=<=+)zz?FdqopGdM>hc)p4Tc&xD zCGHyvSoYEV4LY0_81O7nyP<>~z;T5!g$01?ZC+V0Ve_?SOyg@8*Z~NIrw7#=djLJu zbnJ(Qj2e*Re|(o-lw74vZGF3Zz&#rxi~Hf{$i-j7lc++pOirI>ny;szTm2qPfdGse zj=$ds_CYD|z+myN!RtQ?lw8zl(X~dETx5A((tz+}4qVe2$=z*&{za zghU!;RJ3_ebdBbZ0JeZ-@S>0|K731;d$#N+(}GpRM-TeK3T9@Y2Xi_4zMw@7MAe@9 zy5=Z64TE)drQIdM#SbWKCr!C`KzFK6f%s<_B+%#Uxf^;gEMOkoLret^s3D{iD8hpv zwlTWo@*xO4s9`HM(jZeT36YP0L3X;=8xWQ?@RLRnzX$|?GTH33;AFs1UMsAYgftwu zOp8SU4S4Y<|1C^1qJ;w2z7(;MPoMz9KPO+(s5+D*)B&l;?%CFZx&I>ww2%Ydkg#!( zv7e|FKqdGAwn(1yHs&7<%0H$ta_RMRL;3K#@BUfu5(S7KqlJ7 z^1-ud9F^-r$?GhkY^h{Mv)lRVb@BY&JS^(H zMXyl_0Qlj5=#XFv2gk}nPF)v=6g9|NVSxY?!S|XZ?Et`}Wxf-w8h`~6_Jv}1XXSKx z9kBXjP1}B?ygAAP0skv50O0?yw*SB>jG%7eZ@#dnc$I(El#q~=mVk~V<%4oK8D2S{ zKazruE7gDwEQP}Pu80$mou*NCtVsik8$W9F950gXm}cASu;$zmO2BaY8bNL;G=aPY zL<|!lG?4&MB?B$sYJ^HQi+m&KLNEz?pAKCg|5%MXr=`!#i25KR!vtUUfX=t)i9XqC zXP)1ShEF&5hjeVTqxCmsKBumZwuUKWvTwf3*qTEx^p8LUlgfxLZAf`oFzb))$s@hb zd1~%wpg-mV{i^tY+F6mGAU-iJ)>v{vb#6loMFLE^t7g|25XuZ6Dxj$ifF+`=OVmMw zI2{Vw`W+Cevyt1{4f53A^Dgci^#bTFS99L5cGxnadwk<;;tCzZj=wDM(I?{tMU_( zAUR!Uz#ssoO5OrcwtWL9RB`w<+UlRfdJIOWR^$#jFe!Ru?IOs(1Bm`ZJhVJ572S63=iBNSBJn~c!|@R{`(j#M=74(*(mjRd}Q(b z&=v99MqGY;qjM=p#I-f&CNuE;nTx&s0)8=_L1035*V8OAn2}ne%A5pueVaGA-nx_Q zUHKURR^NB!pnVHU%u+BXu6~NBWCm=f?7!ApN({Et8?}y3?>~AEjwA$ZGlreAs0ux7 ze|y;byd-;*AN%UgKWt79_ZTa>FG&+G5KlGl5_tbb7Zj>ibEjFqq=1e7kt~?wz1@mw za+!?#;bUBjFhIp9GM@$l{DQ7^SKmR2r(2V?*4QuzqqcWxT!w&pp6L!4Q5)R5$;pWZ zlp*mMs8<7Oi3Fro#ghPf9Ami(TN4PX%W=T60QHn>8x?3n_2sjEWeijk&*IXIl8w$@ z)gZYf7+LM3p!u*MC+~)l&T+!-FCKeZR>2 zW4ox;#4EKkwr@24sdr7*>+gFGN{Bv`9cBgW;Msj6wVSyKpcN9*o7j>3?O<7+%!WHh z7Xr5Zq5am)l@yqD??o?ic#5Qk_tkGN&INHiV}_la2Y4x%(AFbEPhhll5tftJG+STZ zUgmG5e+{w9KTD_0ObPVXI`Ar1F0nv|p_}*5#JkVF%IuAdIiJ^)ZyCJ)l$7_q2bA=n z0v;1EHzH9!1cy=B z{V->*!jX<02+p%1(5r!t414u|cJ=SrHtuseDtY!@=Cz2zmNm@~gh||L18(6zz}yHH zNOgGqH^FlUkHhDW`x=9V;_ZBngdzX(;)!eI#_9DM<##-u#X=5-LdI|%8^K$d9qG__ zuG;R~*9&;jh;P1ycjgz94u(!xYo7^L3I18871vouC}|enH7M!$Id0gw{8Jk%pSiTw zN{?I!(h^}i)>Mk8t;hxf&s#F&d?ZPbTTA&g4anCkm5F0Vti1a@C?Bv)ZYgTBTb`Vu=HU@(y)BgEmXk#6tb^(;h5aciyDs$aE09CdT@3VHLA3Ir_qVUnowgKSsJ4Kg=iG7&-fY4#kx96t-@5p2+pph6303C^0Yi zjYW`(cjRJQm0>|+DW03p-$-CG;6Z&}B@@5k)e9kb>W(NYeVm_?8q&qSJg{HOfCx&p z2Q@Q(J4!N6`nJd&&@?{aNZ|D{VyqX*^?Z6euEYcbmSMbg!Xsp3qG8H6kW`Z+<~Bjf z)t0BhqY0m6)cUenYR<~&xC5W3O+x@P{KFEy1`7*BV0vHqHm-co3Z8?nlAy1=#o5YA z%S+*^(PJ0%&omA&l&X{lg`o&pe4}{$^2*PM@pW@Wk6b*fsww5`gmMI$GD`2@A&Z@7 zO-mc-CeVb`v#Ooye@9m$PH^(}gt7U{WAOOJkC!RCCXcQ$43(TO>aXrWJ4dM^!rck+ zWFFJ)>*b4AuQn{DITIDK8;&v{%4xX`|AA}*2|Ruqwoe?{Ki?Yl%2bGqzk-pGBgj4) zo;W(?Y|p)k#xCV;fBp`Hq7l&s=;KqVNh3~i2a<&#<<-w^9o@(mwlHVd`Yf@*)*fiU z7t_5(Fl7VDA@yMCv7!}W|1ixcw;!2^`W_9DP(ps&Im`uobdx59)sJXOZ%g&;XC&Cp zIVm9)#OqVEr4B0tzUfHX{=CRzbx1Un^04S5ItM9n%FK6fm_xIr7yoQ!v=_u(h)c6j zElEN`85z=Qq3>26PX8a=-?ZE!Xk$NH^6$H?586xK7Zl8ES(#`VMZn z{IMls!w%bP%iiAAyvn6yL|Yf#>AaDdXuJU3@j2= z@#;4x5d;Muo|Lq`8e9$6l}WKDSQ=EIS{1`^(}cwqGuO{W_}sBB$Uh80kVNMnvMjO7 zQz&2+{-|`K`JTT9jLd4j=_0wUOUT-I!ohVP@t&Tid+9A;Q*K zt9Zj&F8gf+G8k0Yq4lew{}L~SCNy-MT?P+Y&8}+rwL+;JLr&*cRi7^ToOjft+?};G zabR=@MKOOv$3jl>0h(YiHt1?7;m*u6aDcrtCl6>g2Q@IKcnO9$IWaP+)S-*px|;~M zYi{CZOWMhCmR>USw)e2?8tXx}*vDZ3Sf|!4VntMUOlz|YEf#- z8t(kofloWP|!klU*B!6p5WR(%W!gI8A4FJjmMjr?Bm!A!?yywhhgfldZ z-@EX%yOOO*r`JAYgwT?eIgVgGulsCo+}yw4*k;eBocQpqx&I$pf>Vu*gQaZ^m8(m2 z_T1zP6!RQ8mR)kFsjIhiWJce1z64!&Gc+M^wc-Sv-&251e1>{-AeFR*46dN+ll%Yt z3G@MnCq)sL`GPeXc;)}(#ycd`!*SgurTZ7r8cvzZDXTA zc414j{15X1U6^H?4ZoAB7;mcup%cV1jynww;Y-iT+`J%w=eB`8?jbhfN{)mLH{?!)vO4UKS%GJkm{z#%uG)Y&O%w1LxGOu+q7POO_%a_@`%=&V8ibq}2Nw(?Q3OmR z4`_Go@t}wyLa+)56LPhPu|Q{1)-@SaKMLrt0xZt+BPVJ~J5y2!51HTLAErzRJIz4u zg?C2`BRDw5aPqWrZ-Mg?nBlUz?jJV9X#5w0^D~o1|V9I#4g@ z4rwsFr3*Om2A*kLv3m3Y)c^&+G+wse=wGTso>xqlw+j^qU;BrF?Fq-nbBf0akMwGr zYYZS!XM~zA>hgX+(kTCf=Vvh1r}AITvH?A?U{~^-OLA&FI$C{Kj;<_0ZLJUuJyA;M ztaF1N)Hb8{BTdYM>yNyuzIn%UB$u3Y3ef>g_EWkBtLZ!1=rz)`_o*C?IclIHb={Wk z98uz^bgYRL|8*{3;iFJP_cA$bTxpD{BWdw8w?wqn`bw3huBboqH}4~&@Ai)FG5B@o zF7U2A=ejz}t3%@>$Ux(nQE+LHAE(V?W3wJJ=ilw^?eAW`x$*mR!80JaR5Zut2sk%9 z8sy%Z^pj}|KRS5W(sYiu){cmXc0V$9izPE$^xs(ilbn$2qrQX@Akw*%ja_q!Ga`0i z`ZRwr5$+a@n2Zv`ns`P4?h;MKt5v-K&Kv}wg&zXH`V6PlW7dx0`UlqcByiy0J~&`} z+odDeSrVGS9;)UFnoKA;JttU>;t|DNtM3{|o|A;a>};oovUX5CM=LaKQ7BG#*tdLEZcL{TBm|S(p!}1SU=B zn9wU6;B(m7r@|efAZ0YRI-kK7pFckzz9`OMG2X?tT>EOueTy@(`#aniKoQkB6f&IE z9^nduxjdYU#xaBiXM8R7SBv$}P2R0MOfD=r_p<4gdYU)Fk4fQj8RVYz#0^nlWHeVm zMKhh>f?z@r>_Y(WM#paGKauW;m^oIWd2Z;k7oIf}wDWYMSM$S}jf?WqVXyG%+{Q{2 z^kRSQhjAUoH$(HevQbAgf+W8;6zdrT#P)9_8O6q4GzUYsGsL4AI7vWo#fPM(tpcv9 zz&Ol;H|Xi$VDaAva;$7%y@q>Y_j&G0@hDZ30jS{tApVGvH09-+GUxfH&n>@sk|iLY zzh#C6J1dr0sTfN_*o?9JVGk4@3kzEv z7jH1;`*r8zh5Kfn-A3ZVPemzR4eRAMCf!9DN|tge-!cDeI^{m*K(qHH8TCC0s%LqZ z>w0^5aWr$&lKb1QdsSq`k?pG@g#(*y^uVB&&EfQl zs%Mj|I3+rO^&RNZT^ywTR?3|5(VVGOi%Ra3kY8@#gCP=xnIg*ASsWE66p+i{$Q8T} zC3I&`%#KWHFuK9}5<30lc+W28|HeTklkqwq!T>ASOzJ)#gU_m;zNV{dtc7xybXsN{ z^uc!hu(8k0XzZS;nn1QK4H6-r=#?fNt^#f>w0kvX;wf}D{||R(hd@VOWK-_=w?A^qdjUdBLk`_4E#2#K`&(WGB)PD;kqoc$} zUM4Di(O%jtNi9RMsqcY27+`%PmxZVEjRV0@Mn@&-nV{l$DPX=PR__(UnqH~zz8hC$ z34&H5`6IbR#cJT*-GE7mjUVXB@O4yyU#})bew_ zB^aB>syd=>MU)xrjztUd33b(2 zN|+{JQ%f|Q_~L3KF^0vyhQ09|`-@Dbdw5R-kMM$+zvadHd1}zho}Pnlqb@%Tie}$-58M_^ud1gP?^fjOSdEO3 zS-PQi3v@fB5~_~et?bg0PAa8R<6#( zP6)^8>)C~)*EVIBA46F3XDGZzl>cr$ZbxoUf0>o(W8t{Ktyb05do;(26%~!Q(_^@g zd7<7sy9VX79z`<@LMoHb@1Do zVfX2q7T&Xe4k#bYc{s|t^B?hn$`wZK&n+R1uN;Yu3U?XB{Ip(4uY^<<)thb?EkeoE z<%Gcz2Jl;~Oq|l^nRD{JV=X#Y;-+BBM2ad0m>1z5X@fSJ#$z zP3}`edV3d79CWdr*~@xRA%mPiwJ;H8A8EPD0`7~=&jK0Tg}ITtRq}=IA7UGvsHwSK zanPU}YhCsRV)QpSt=fP{y!xeoa-QpzBX(QoC#LB?^^f16O3z;=EB%c!X;yG$s<(pD^;^_90^YNuj&G$+q-;8l?&@&({h_i*VfybRgn}?|;FRbv z6D=A+@^3e_-$g_rMX~W17#yMiI=^fYWzv~sc5(U@L-VLE{1BPI@uCj4Oq0tnH+3JV z>&u+oEG;!a@&bGnAY>_$8YlloCMGpq(B}jA6^I=gU6kxJ8iI{wb*v?*nV} z$JkD(S=Nj!RJxIn*UWXXII6s$!7OR7DF4Zh(0T^_9}SK3;xy>(rj7%kKflUH26beP0TB$$4iFluq( zH(<RA5mu+7022(>lt)#3GVK$!QCOj-7Pr52|Bnt z1b26LcL?qlBuH=w9{kLH_de_EAG7-B^s`#)uDVK-5n7n}4SMQFpc84+bEJB5dye7S z$~=R6urz(l17(0~H+EtP%`XN!*!$R)0-I8@|1A-Ej7gZ$h#=SRi{6buvlGDjqCpGUIgc5l@3?o(86>rVTz-Q0lP`mAPH? zK)gEbz{n4AU0vx_?E)Ae-dCp@hs0-&x_x;7zN#i>LW49o7$M&R2&F`-KmvD?ia)3B8(?%S1(oG2a$aZ`hpiZ5Op8_vgPLktRurr6k%w z`*qbi12Nd#7XLJT1aUFp#DK=UfI##Gjg;;K(>|n# zT`g!dKU`n+{=sn-yT0C}*=@C>@ao+^4R?=}R?aKMKO!>B;8h2&kqq_ggreBtp104_kB zTH+2)jHa5`xPR)BFF`jLirfyd!qZ(XtjSOqBXYcM;b#{^b6Tu9XEzdNGDOe`TsAHy z)-dugS_b9WsPr-DO2G})DPs)I51d$G8wxCO(VX5(jYUPf|@*l=mQn&0X&g9~%q&oQ}N$8o^AIl2gD!53a=s z>q?2rZ-OJIj2jsWO%SJ-fWFVO`VOTf$_=P4TX&WR=tf&W(Bo>SvIgy=NIc{O8J*}Lh3GhWQv3HTDvFaKOYG$#STMDz=H+u7!(OY9>ZU9~_GZ2r{mMEm6i47DsSSbYnFtt#T*F&L*%diw8lwo00f~~;P(a3O0 zjq~dC`1#F@mCqr47n%0b3TJ+y_B34LaFM$$7zs7VKDOv$Fk6@WJzh(3KqYW3Z?OS=-ta^#-}VroKT8Ole-^))zs%@6w~f4#Qvm3*{U zF8NKik7u+DJsn+K`P08-cQB@iZfUz_uN}TOSE?I}gX4Z|zy4m*llW%Qn_rGL{nCC- z$(np8|62H%JF(E}2)2~`7>YV-Zo>eS1iHoP$0B@!NcEksXb8lp6Mzl@AE9ZzeDf zeB-4fW?BsM6k1LR+N5Nq)%6gvD;m8E{^*@b3A%q7Bzu!6tGH1uv zB|lG|-Zr;29muA=uJFF`ZKQ4x5Az7xPcc`oPaRiPI)9q5It_PPbrdh3bs974{u{R* z*+JpDeA?5B0wbBgRvpLDAPD-zzhcE6+sWndw9bqNOg&;&e{SAr_2J87$KQnHd|0!9I? zr$9&mF)$!#KL@p@4!}WyB@U$n2XBUiOr{-gU(XIMsAAG(lH^RokHPrB#KeXI3!xg^ z^})WQVZkGvx2%IvpSJU;@H`5;t79$_FMd_bj!GenoPjEJUH*3m06=V)<43I?n|Ag+ zud%Jx)k$HL3v?1jEzl_@1P%-iQ)2l3g zxhBD_=R`&c9*8HI%g1hTVHK)P2j6uxtY$c+vRk$og(&Y#sd;4mBg$OVVlXS{&{QYfom=7@oj{Vk2~ zaSf`hVqTotd=w>Q_u4bjPO=i`m-C3mLE?c%q;eh|VmFDolXr1=in`2y@`myM$s3T5 z6F`!IvK$fU9TkGaBzY%sy z%I2-lNB1t&8YsE$PVWY)Xaeoew**0#zdMYwWlUva`bo9D$kCb@H@h&3@%P4YUuU0n z__5o~fcSR5X8{FDiqT!`r4pgwo$!io16XV-SQukTN%VdK4Qzn_Yc{dWmv~B#Kqj(E zEXo!<-s+PN2*4qsG%_|Qcz3ARYLu)fT`ux~Gk_SGH8G&^@K;jpi?Ay+Tpv1;G(|>B zexY@FgEGBXxH1&GEJ~tkJy`*wG!=Oj!}2PHvMnqZK{n1NK{NVn!G|dAsERp6fMF!; zSZVXS=rQ_VhjNuP&le9x>iz-W*{x^Z5n4a)2SV?zp~AFLlV=5ur>>*y;__FIh%REf zI2!`Yno_tdsJdw@TX9dBf6p}ZXpa#+-`ijOwe*oF<7b!B-r0!E`)bUw!iDSWAM)F~ zj`U_2TeUhKRJ1a0%_W&Om9}63QjOWvcJnSe9P^R~)X6APRvWS3pOMQnu#PZnLDa}f zMBBV%3E!(Uk=V1z$V#*~QL%vJ8KP#gd1N`eo|fKT#2&1hy6nbQ5o{a{%*?8dUSM`@ z>HhhV7$!RitQ!##c~iAMmO2F!mp=*4(v1QkTs<$-|q*25R*fWLeY{`(a*?W)3ss(`fYn@EE65i6pOO4)A2BwVXAS&GjhukWNDO3Yhhmh77p6oU%c5>_5g zs}-UkLRSzwVjo$aT`84Z0tz7Sx}ESh$__U&ELfD7b$W1?zhW_iT#o+Q#sscwJvb<1 zj)R7iMp7|aK|49#3ND&Si>Jl+PyM!tRU*4>50iHQJRm2s7!3D*DW+qbP^yV2S@w?l z11jnzzSir#h?w+3#^?937q5HKW_VI5mWdFzs$_>#!4erN)MQ3Qqe_S0zq1r{5l8=b z*IaYMRomluJ)~~0Gr#NwiT%=Qhxd2;dZ!3lUkXXl{PXRPZYeD_HPKDDzv|;|c6-&S zIu+^$;9apz|D8z z!{&rW!{W&{A+YER`O(pTOnJpk;b2iDer%SfuM+B*7nq>4gT?w8qNH;LOwC~rxZnUt zFtFGG&4_GxRCochm_KHave z{~&j_Mn^5${5r=_uKD%JBm7`meIoubaRmfxl`?3 ztib*Inwiep@mTDS#)nk-jm{QXcTIf8Twsq^3RB2Eyglk)oAUCeqBnS@SYW`tBJ!4q z``c`8&+{bT|N6mt`b+>?fNPxzf|LIy!peXBb2{6SaXQ=qp~8R$cw{Vg`JT=-TLZcq zzN(+AY&;72FwO{0^?Xl}faE}@cAWVxsERySR$TSYA5t z`oz-QuC(jR-7$F@Vey`RBqVvPEw%M_GKI`KO+if;s9EVna#oMrZW7I}P{8MyLc>Xt zqn%C`De%D-Bp}v6i1rWdnBS|K*O#3pr)8Z~7)t6~cgu8* z{6wSPk{&&us3)uuUJCbwfQ+K<{G!X_ss?qX!fP~(@hG22Erz=B;~A`&*7cEhPy`* zbg9(xz|>#TKnE&uTzcH%@dKL~C}5cRV#}9jrf3)T^~4^t%KMEvN1Ak|nQtH+&9Z4l zMjSj|d7ZN}L&EG|hz5<*f?KzyTA#0c|o0#t*b6tHql`RY+<`Q}h>~6V+PZZ0yTY#|;%&xF*>zX`%AMTYZ>Y z6D2O%lS{t3paPnD_G-Q@T0jk_&R1R2hDi{B<{xYJZ5jnyHA}Y`i+yBmKQs?L-fl&8 zgbA8=g49SCPq+Ec3Y-eoMg%vJBuKozs){ctl(?c*9~DGze1G_x{pxvo^Ja^mH;0rj zjKS$kkRf`Gf=8x%FM&;4PGCdCu^9Nt2V?EN1_!|+R5EphFV zfTi5UAq=y%UtM+j(u=G&i4ao!|JD?YS5;@g5BST_#ur7*J2%Ed9$je<2N0AQ%%Mvj zzfE(rWdbNiH?>cjjZLlKPX?-$(;5kec~{_@&HUY*E5BF*p)EDNE+|xZaedZFalg$7 z`Cgd9&unz(lcB(qkbQZ3La%VevJy`dv{@V17AgT_dN(c3lM(v&o32*;G}!R%`4BfR zKntIn=ld>Z)IjOMGjYq$L;#h)L#eF_dee6P#MEr|{s2fYVEj4nvka~0jhhG5Bl4g7 zv#Xx1i(}!8K>kkm<#*SWvc`rPEZ2dnZ$rP^;|9RPMl*g&>{wV`qT;CM1k*SE#z~XE zW+mz_+l3g`#7OS#Kb%2N9dlm36nxG&sI8fdQrK%o1oX&ryCR;$GxJMo+i_>`E&j8& z9(JEnGioPt@;ICm0ZdYW;3>|^|J=w+> z=^S2(CU`aM>inzGf#m(MR!*bK0VvK^ckX^%@f+y$5gdP{by5pcqaMI0wt>RC>QLus z>$|)Psn_{uvwj(ia9?`1wCZJ^iSSzQa3p-TQ!0JwfjdlYGOKJ}&D1f&r0hpqu=!XP z8McU&lqOtmw*{zgMQ2``M|f%a-RFy9IYZ+Y>1~&GAG0F{gHN@8ijl;@ks8y} zMV$U_-H%I!#UEXLag(643ZAaaQ2sDmSz>~An^#+pe+I>5Tf9GSj{v5)CtfyT0iC+s z@l-t?jOD+RHooL(T<&`|*eI00_c(h)c+|bl>)g94!u^Z&zH$0F_{1B9)1!x_dUwsR zkPDYl$qV5$2*&}lrLKM9w{8Ih0vUiV5P3h83Ip)`f@yu0E4stgHW*?2;SAWsSBKCF z1T@;W*T(!CQU)v+a=VNO`+n`y^|0dr^qmu zIfU2h=qw%gJ6??#_}R`oVpTeHHtA|xEhu#UEN*vlz~0jAJi7|~mOH0~SAwzoTta_8 zw!t}L@1(ns``!n>YyWmBC}8`Q!F^6WZ~xAw?m)w1%F0Eo9#9_PlZl-u4%nXn}E_3oU;?T)${9g!a2n$C%Dmp|@P1voY3i=7dCgW)DJ`p&bUW+mRmg3M^XLMDs34m!gI{yxj^ zgKMX2qmX>7Zou=gARtYk9}eUIssldXF3l$Vn|IkMIl^#`8SJWFK|e1}MV9abTo!}Z0W-Geb~0|9arRg5r{pXatb!U!pJb~b_!zF?dtW;*%a3>k zv8hFqG{?*H$Nwl8$^R#P7(=cuk#`scav4bpDJ2OT*0>!$%m~%>vWWPNl$btjrA<6!(*D9@wLfX}WGN&u zS`SZhjJV+F_>0l;)9<*>f}lem^}!3$3f@mu_Nxa>VDokbq4dWYGg$=~Qb(Oo%hj}jI1NR#OahR~KpWGUqjPKsrR+S2xnRX+o2XE~A%D*!Q=;0`&m*yH8j#-Z$l$ar*KrCQCMg>DHzbPKm+>9@T+L5Ys4?b!@Ci+Z|L*b1DAuq_@t7ZC z?iX0=q_R08slTv3tbZb6F%9|i;Xz|y``}c@hSdXcl*;umWbbnM#taC!^?HO_mV1*) zZtQhW7#7|9Lpma~`&S8LaEIKBGse zGB<_k4{=g@D@&r-JM*QIXrJyk?*7EG{_TFRwdt`1wdkGzb8Ya#nkS%ns)=V;uJtxJ zX0Jb*nbUS(7n&vy1dw%*W={|it* z`A+`Bw^(zo2EFs$R(`_s;jx3{K3lQ$+dU+OK~9yFHCth29vgPt`52?yxG42qs5{m~ zJbsVu=2$(kT!Gpxb6*=Bupd~Qpt^Y{5-QQmZ*QyL}k+-H?@jl!oJ0aVytGjdv zh0v$hw3OsDh2@ewQ-FjCCZkZIfaizKqFRN-kFjnUaI2okh>s*(t8$lZq5N zps}m4s3KB|TGE7uh?|P66#$4Ax9HCRqk|HMmwj?&U0WS$V=4JsWc%c-ruOWH>DoaBy1e<8uT4YvB}JO!*N`$@ zt(We=VDR`?>=^p5xeqx<)L{)Oq#9@IMfuoVU}R<7UaKE9H7F6^Hm>N z0J#JhFC!GY*djcYST|mb9WW1|6lIDg;5cc}EksIC!4~v0P1mg&A7fq{d1LEilTzA} z=bkM-^$+4f9a&N>th{=XuvRlha4a0G?Kl>#lK64WserZn_f8qzoa;&klaok&=gd!Z z;G|kC)9PO_Ypln=t!Kp6ET>sF4D+{xKh1&<&w0&*P!Z))qpCuwJ1$)68!YdNWFgO<;sg~RPzVxWHz!g7B$&oW;x(LV?I7{0=Sv5j zAp!)PlRiQsftY#YcwoH!AH!AWSS|%+F_s+RoA^Q>thd7Ge?FbN#6y8M+2HTr+YxMqm7Kv*AI>4A?d}t=Q zM43>oHfqiyfTmt2J8!k}MsSgdC+tktXgO*KR6?sH= zcCQaDIM8V(1xv_&VYNj>#hMII9y;gYcYNE<g3a z-*<6{uTt`GXr}$~`xE;JNo)5gJYfz$Ct=%&!& zOcz4#r-ljIxV_aLdABC2CsL&#i+)@MrGnCRQZBwe&YDaOVT|0E&Uaq~zz#eBy(p&^ zde_8DG_(3`+^3wa8(&>R5+qn>u=UN;CLdUk2QZ~ziG`_Rk z)!p|YIPTx{y@J!Tb4rXlKO5(vD||_T=y^#}zb|~C!(aYn=Ng3M9q%jLNNNN~BrS(Y zW9oXIEgc?Dw45W{7J8#*PvM>33eR=1P0cfML{OQq{iM(UOglrxrBbdm9Rk~|!cOae zTCBFzq6yRcUEF~7d_JF=>`lP!eV_gL9NR*?+8fUNX1Ys;{^#AW7}VdU`J_MYpn`N5 zEvF-%?rSDJAm3@V$9p+1?2t)!byM(@*zt~*f_+2q6FiFhjzpX~3)<(=!8KeKG$LN{ z@1=yBkaxUK1B2>)LvW%CJy1SQCSI$fRuW$bATE}FHjpLSn-Mur?p|@vTbz;6)`*VB zPrw{B$H_3>{mo95NlEwWY(Ynf$~1YZID$6kt$sGqb-{bv1S}oCc^z-tS1;!=da<F2MbPQ@=%J`Z$P*!JnCRJ|{yJ7GMA{W+6H-yUk*PgS{+iuZpK`9YyUCAwYdzv#*U z>E{fqjw1_T-MY$q7zn5&2_$hC?H%6-Pq?kz@Phy#rR!lb`PL{$J2D(-#N^ls!Ha$} zDpg}P?da_*n7U9`T<%Z>R4_8+Wg!YcM1{_YpPy#kzE!$2GtZgWz z`C~rgxS#mhVE^N}YHE&%4^eFPG7f~atf2oDiRL97{_2B&l?s0tcc4OclCvE7E0i;U zfFxP;lRS8fa+_z{J)Hl)d7zxC9^=$m4ku8W8Jd z;rb%`WY{%}u}o`8v?XM$SLQ=T+)kzB+^8yTUCN^(Wz{8G12wS#hPLPHkUE-TiJhos zoVh@V(kC7+P%-&7k_-TlipP@hwz|Og@jGEa{e+1pn-R6xwv5*O|3MGW-#jcsj~YZ5 znX9fd1^})As<-C38mmt%wJCQ^rH_Aq!WwRKj78CYu7C?c8^V$lN zg8rCYphiC)4`b{^nZymFdbv?Cb_GM@R_01tVq5Yr6>kRFOF80NxgtJM6g$MBXn zg(}GTR(2ZVYafG#3sLs5OwksM^nA(l?>rkMDAACH{PxzMK77SDekiQ|j})?czhpN( zvGUX+1Slx_bT718eR^+^SxuUdQAm9Ku>BS(_WV3&v{4Pt^oYu%BDrWLn==Y-d z`_G9gKGTR_NN9HBJyazBki+$SC?bMK#WxE_T;`o7yN9!FID)e61kPVP4C^s|p{4}j zNm>|U^iR=%Gqv%o(lFhz$DU|z$2fpN*dQrPUsf(3is?1JjWP7XEL*i)WWS_FeN;(g zz;raO8gU;N@s_M)T|rwbeTcXmqpHqodhz0MsN(jZ$Z6c;m9X%A)(l*ZjZ&NBY21A4 zDvDSocLdf6Dc85OopkqC2ce~0?)%Ieh>kKLRdrRR%JN51dol@w4|=Q(s%dkUSP|oX z6AkI+KS_@`_S*$|6+h3NJ+&Bdz&l(Au_2zzFrB8*)7SHnTol{SU6v8TwcXqR^1U$( zFrY{MyszW~8TE?;F$ttn9+cb7gJ>l^(AucVZ_bjNZ0cyN|7Um1W@FlA<4fg$glH%} z;3`F{#2=3_FyPg!JA=s*YfUp^TV*6dG!N4u6fFnLZ%=_<1lcL5MgC=C&^M+RsZ{O2{O_tK(5Y^Jx83E&iQ}=Cp(R-Vi zAS*o7NsmM8uMdB3I<7+|tqAYeSNrQ}^=f}#GGdt#`NDCTn)lv|^V#2? z$7U%n>`pAmTCqRdhPxs32L3=g@Q{R8U-RZ_iXnIH18wgnBw2)u(DLCY%-?|a0Ftk8 zyfA4bXD+d*gq>vndm4B$wgoBWucsU|ebfRgJP*z8tuFHrP=^V*xXro}D^*u;xcqc+ zAif!%S5P3t;YAfi-A7KCYVMulg5kiIeW|O2g~bj$;$X2tC5Og)`soh^6h&ZS6hVRg zjB&N%-$D=wr+oiWa79I-oSZhtyWh=dGkq=JA}`^Qdjt+}bOl`+oun8@wgb=}?o-ft zbGGe#p-(+jIPx3IHsBiL8SSm#oat{FUEcbUL^U-@cHmY*`J+1m!D3m7ljuLw$jtvK zCnk_X>anZ(My@9#d4Wv9croQ)pZX+n_WW|>c)kFC_0*}wIbEPX@ z1-&z9cm-6u;67MMJ2Bhwv~Qbj&Tu|kZ0LpBoX&K;-zc)y6+4Fp6DhW+t4ySn+OeBtaN|KM*c z9PRT{ww7ymqt7r~#Y1lErBL$V1CdcOMbY==MekFjH4DnjD_qo9lfNC1bg)eftl!-G z*Sd<~2E-H17gq54(RQ}29^{M5#H;x|y*`K0*;9A)wAB`6ewd)tGr63hXhMyYM(7D| zNoL8g*?A&$3u1xnNY@BJxZ4&BL&aJ9b^u1Wf_SC0oBlVE2hy6%y#AR}zWJ}+6fZ7< zDzz(T{egh$h?S5Y#e6@u;Br}15v5tzVHH0vGiUWL>N`tL?($#x+Ui%Nah_1lSO_4` zEO?jIz%Lree1_X|2z#jUrM{v-f&F|>L}{}i(kADR>m|NivLqY2PI4L+IgDF+1xbK( zL{{boOhsq8l$$rs923c6cvm1$qV}$ViLwEinIS|27EF%XkAOKS+h3-mL1mw;I|i#* zle5HA640FLxt~KG42ni^BCp^_#K~vrK%g?-nT+D%kwU4|=9~q8f6800L-~YFCK^SM znFq9^iAOJ^lt))2cOx!fo%h0EqR6nQ*41mXC#UcLMu=#?_ z5aul=Ov_F3z*sQ%Ocu;9B{znHR|_tc!MBL z;E{db7md3;yX;T(46crUPxqXCpSV90*@-=G@UOx;=PC*Tz>i87L$}3BTocwz3USUPAsg47VQAQUkQXkSB{@^V?{R3H?y?Yr8 zK&FR52=mpJa3T?8iJe%ENN0Xz?NNpIHARpjs|vMS+chpV86!as#ZrC@QBIdf`~#hd zHi9wIGHV)8uJ4!YC?2A|j4V<@XdP}CGW|FMc2&FfamR3j^c96E`^nML&bW%C)RIZY z^Fb^;MwPa4q&1YGp4&RrZm$@0>qy#{`jN-mCwL`@F<%4#9?yeMFMTsweYG^8KH_Rq zgmu3Z;GkV{_&4z12QzCXpeWV8*h9YE-rS1r|7%5)hG(XgI(1x}Jw#iukRDI$79vWl zpH>+rqLFsZ1|=O=qN{B#a?BKA&e|a$7(hz^c!-%vKhowC7e@AB;uu&*lT8v`qG%eC zIyyPLezUcgixM1?0L+e7EsG4KD_AMlf(T381H+GKSb-s_natCpccgMx+)QVj-5ftz zM`r|o(Bc9C5J?VjD#r-5uLMS6bBSJ#_$Yk_`EG-3;KXHlU1Uprfi?v2Ydj!an622F zac?L~;j~$j^pTIy1yL+8ep-OdRz*xwxnDKvj3O_OZ5@w))w6svdikh&hO@y@Mcg<^ zPfhD#r_8SUgLNq0apm$H2eS3$Ar7()qWqCMyeO3Uz!(fpTKpU+JTMP{6zqziQvuoo z0YfFRT7dB1>qWx>uz?Yfy5;D>zSWj^_TZvu{U9t`*f@*?egAcjD14+Ur}Di&V3`h zmK9@mmHmqJ1nzU{0jN%N9Y}_-bj|ezH}}UysjeJQR2G{|ZM~WteW>p%rX;#qatj-r zsD9h7^oPh>wfI;HbgFu)U|4cIdg2n(lwd4f5LTI&DPRT&q*^s)7L^q~F*hv>X~4i^ zbcik{1*@eQFM$fmjOSJnjCJ9m+0jq6%g8lRl&T_2ma&8t+@_^oMP|i~P5h?3Ea!(s z=wJihA+pDOd_AhsYc<4o0f~HeDF$35@ESK9frF>eu09Q=BIf=(pvgnyfEke-xAT09 z{iP_H3}bj+c282ID*b+mCTy8LsYI8+sv$|xBiR+{s9GJr$f=YpaI0>4R7kvxB$Ogm zx80H)jn**zv;;CuHmD|xO=5_9cY?wJj819{0~+$_q0rsK3KVD=5TPV%u-TwKF>*+v zCIE{3W6~KCvSVC|Q^vw)$1q_rKHULCmKC9p=wPA3ctD~btspE$dT8)5Ad@BaOl zuekG=y>i)ef9HNyxWwCAY(!s|1ht6jNrft8SQ=>Q_r*Fk)&)@&eV*&Vo4U<9qOaG7 zM*Ojxgd26k^G(m%_2XNYuFt5I0rM8u8X_pre~+5Z6yv%f2nL@HB*lpsgzr?_LS2`} zRv)a58VwuFg9XHlA4@dA8Pb50lw_*2?lXzS&`bL;j>puOTxf^(L$Z$S15i?#3jo4n z2KTcu#r4t#5RoS|AdBnZtYR1%+m!_~kOjhRR74h(<%uy79DJ3o#MUSbXYcV^QZN1M zs7%D9ZP&tys z>RN7Ps$@8zgD<=0Kq|J9ez3{76!@-b?pi!JFAOG%sSbG{BZ?pHTVrWP!siWJqwEyR zEgFmajdFT&Do}lZyER`|ljtfPnKFQ)Oq&xpoDpdnVa={9#ayi`1`y6vS}(dnQwWk= z9r$gT$!UE}`jlvF0-62*0GFc3PGy;TfkE+yTbUnde+Luu{2S#U3xF6)eSvx-tGSAH zpRU>W*@K76B}!|oECK;R$hvWxy)yA*g~ZK^TZ(?I>cy#gI#f(yv*+y*8M zpQD4T$Kz0c%|i+3pAB^P2$D4O>L>eF{GHexX<`f<7>4?-n0%4#`-lP(h#4Kv+`M)` z7K2sJb7LT;bUZG9`Fj_cM&VNYmRIP{?|lQ;J-JWy+VrDvZXYxR7Ffgv2q z6on8v872Xc-^Zby7|}QOsnpzp`dV2%EjZE+W&nf{%@|293d4QuO2>v7sS;h(C#t%t z2rHfj6JKT#k1T5mln5k;Q6n?yA9G+c1=jJvh(Qgls*0KGU(6?0h=s?n_hWwe2(688 zpB@^bjls?iVdq5I&r=VPs->gvdN&F^dA=0VsgXf#bFwEm804EYq{M(Zw$-0XBi?6|VWRFciIXCt-s8C#$hG%X z@HzP)C=G}sWQ4GmLshmF7H;*|a8zl~cYcq5uOQK0|!~BZsLUqkeF_>W;9e=8tJu0#Q{d!2LlPQzvbolzZ!6V(MMvH64EUJ%ctcWkx z#YBUccEcw+93!pq?a*&bT)T;;YOLBaFQ_}&nhY;NJLsdB^6q3fEyFwq5Ih+|1tRBC zE|LH|wF_Xk#ApTf(TKufC<6)mt8t@{nBn^2?Cii zOV@?l17|H%Tp0r89d*y-w9<1r?d*eC-JQvGi-)90hP zkaM5=q*a|Vuaf)ojf?lN?LOG@0gYzE`N%`zdtDXF{Ywq*X>sOwo6=S8)}kGCPywHs zI*a-pEM^jiQAAtN&idOBe(BLkF?rfwfpA%Lfbgv%UUt+aeXr3IrE)QdDg^mhGnTLR=mMt3jWnQ-F3 zyzSb%a!>ltnu~{b9)IyWFK0mB!0Tz$Id+E((f`>rPiJ`0yn`M)EI!KhTDs314xg?U zX5Jf|Ez3M~o-U8}l3v|v_}698ccyg2dZRv$DI8;se(>ZSz)go5t(ffPdYvpgI8aPb zaTf^2Kh?A0SWv20ln2YSV^*ohq^4iscYC!m^{^pY8tl4dloQA*!!X1XBc0N#Eh=mO z&@Z8xh4)0KQZm608c##t8%Urf3^Ksmi|pTtRFvfT8r)PwkI$Yjw}dBNXY0LUDM}Tk z2%RWN4)6ec%F2@(z#$W8TI#b28iWB#*F&BvfdtD(@t9Ko${b*L?Ef91$rnhE24oMT zM_Yju>759Yiy?Vuf+!tqkfv3JcXmidhVlKQl(?#r;=5QOyi&0`R!mt1P&g~bFcdN| zh8X<2bw+(GpB<^}JII*+EcX<6)8sHeSmZ9CkuGJ-{5#e2Y^!J_LP;~?)XT)*ewb@j zdVddn6Dc9cM5A??ctczB?~3+G_5Jhiv#TVy_Y^jbR@*aN$2)awSv=D#Oy!sw@!BED zoTzZ%943jI{=7eQ^$XRs@&y z_+R{tmfM!4cP4HAKKAz8s4LIJlgVXh`@@jU^Pkw4vPRa!#&aQ3_%B9DFPMDUxfx!s z%ZNkeDnSPg1pz|i|t$5OmoaoQ2>?B|++N6sq^?KCCjO0E)xRFa)&lg* zZTCE_(pSjGg?(gvgDbXS{&&iVej{@3TK&lX#pc@X&hG^hCv5hsk=z@{ABMMC4IMIcp7Fda5fKC{4JaJb1KyXinWCBBJmI3tpe{P$Fa` zps$pZh}cKDp#hP^fiwa~%^Y37-Iu&I_QCTLb7+6(w3>&X&ue99gaZG*=#T8xPCf7Gou2IY z$$ozCc}F$FExhg~M^U$>fM z%<_8JH^!OI#sJxe7uD{EiMv~aJ->6)2faM9*VnMkN8fK@6{nrseM>A|2>Axa^)aQ? zSoNDm6ru_{Von|a&q}xbfD7-VQ5=W8w)?erPjj$B@RBi+RGP#QrWLVR|nIzGh zE0pO+kEO-#vL_e4(rp{k*6RD^xUt)});iwKe#llFe8tCA00MFZ>>I+K#M04Cd)EtA z>im`6cid$V*Ic#3znDC5UiDOGZ2#}x29Qpv4nmk-8B%F?sBP8D#XsvLQq+Iz*^2qZ z`g5W;=aTQHY0L2C?}1t7#D?@)4sG(}MlQ4YWi+pMmWuj;>YtWB*ERZzgQ$AbZgIZf z2NqClU4?M7sXrd~HhVPmNllY2_Xxpai)dXU|2lWsUpk!5Z3U_qZ-dW(huzP78zHDc zG(UAd-Ew5(vTnYbeLi|w>2QBDbw|;N@H%DDP21hil#)onbT|Jr^XaQ%?o-kg){_*b>@#J0+CkS; zMBdGvt$#0!rrmz~yR1Je^XTR^cbDzwt>lafIi=k59@dpU-;#3a?fB^!^j^jk%6QE< z32zxZ!#q#QBiSV^BwVQvJ%}l>Xm$2Z}<8%GS zYyT&u1Bxh$&;Gp%`P-*23sqD3SG1YhlNA$>4qKOdC9PBeyFvzu*HA^YsLNalB;c&t z4y3WZ|3}nYK()1XUBidq?ry;;R@^06i%W5Lcc*Be6lifR?(R;p0;NcCcPquU#howr z-sk_{%@~9MgPde#@3YpPd#*XBd^9D2vt7Tyz(l=J^M~}d8b&Dnd1fub-Aqbmsk@ff z0=@6*hDL^rI9zAC)tfH6!Q;Ey%pvhVTw<}}93Bt3E-9?~z*2S{b)JfZDKle4u+-Va zk_8U@4CNW|n)hjo)JryBjo7MUYf`uSJ(1qEPivsChxeSz zUQLcC)A;z@&d@pGFxN@v-ik#%IU$#ln4Y)z!s?3kC(ES3VD$Zi80AHyG&zu|w#x&( zM#oj=V@C-(f7_|TA(EH$5B)lWOE166zk4lbQ=HLc`#Voh8h>DnZ|9+X%X;UK(eZ9+ z`X7@sqA6z2nPZM0%x=yyM&;crqCS-*mMfgj9*7_H%yRnhyPn&cX4rWW5ZW+*<$p8U zZDW=b5E~eDf7ceHR#Yy+#q3QF<%7Iz$ z81`dlH|n!N_H?o)b<+Wkd-p;{YMuB#Crudjec{vNyyO1Tn$PbG&tDjETu&t5uD)4- z{#}Y{m^rf7d#|Z-a|1Kq4`3hbPBou=ZsWUHwNHH#S@F+Yi)m*5JhmsgB9eF}`YP8W zc2Mw3MR+>;7h!B_>Gc_Lb_N4#Q38X)@Z${Uf?N6U*yyzYS1MXOvH&B?hI|?EZ`$^K z@pddDnvN0H)8_VDM1)`;4C_PJ0d z*|`%K%w8+C3AYp`?(fDna&GF9Y%DcJ4afy$G?Of@`4191PT|v!T7%`mEX51`9b=>F z{5VCPa?SpnLXPf?B1yx++)d+mH!lrc1cSf%P5!db);^9+oZtLD`$a4+;#2~=Q6+_; zv^qFhqg}v^(Z4%)F>k!-TelJM@PGb>jMuU{(GoM{{%??=ye_;G?A?0@cOzWqqfsCJ zt`8qCx$}CuJOu`)Q`PX7uJfPNw!I!bcWq0NUp%?9)NhJT$}gf>;@X;^q$9T>7yJ2+ zMSNGOM}7YSbwFsR&dh7WMmVoP@3Aur=!O!`I+L}nk-i-H*dQg%tmt@e0CgWHl%02E zChOgP?eBC|ej6!!!B2C^ArSFvPYvJ8e|o+Q#IB)$V>&!ep_QN(bH?Sm?k%^NYy}QdUMiys1u~w?UCS#EKy5g81mIbSw zd}j=!xX$b1H0s^{oMsQEhxWF|3I(37@cmB^Nl08^kS1g9rc+9|%|*q~Xx3act~B=w zbIl=Ag}D2Qy#A2KBUz>8K*{!dc^S;D^=%iI!$Xr~xz5%?uh)L9&9p@d;hL`}EzU%Q zz}6UVe4k4qX=qLrH9G`n(cGnMgPAAW!HD3C_=Y>8-M;#Q0^HP7?A@wY zct^&vZ1dLo@vf1P(GNrYcLZYHNB#|69ZTdTm3ZgP;D`umE~_%J*`ed$1yA&`jxRzO z;IVX3p3DzRJe(*uGr76e%C(g}KM(Y3Zo-APD%s9w2=3+)+1?smGoADgl*Xr=WL?a& zM-j7`c$P+7Cccc>T)&ztut|fl6XEmqBnOM0VdW>RyDz~0gt}C3?#R$RVXx4bv89@B zxnEuKy8IPI zzmV-SDtmgXT3IzV%5ly1j_z7GE95Zidg^9TyG*gsBlGezRC)2j>G4j`Stel z3ku%j+6LBDZ0@Pq;bCh@J9cbbL~G{m2K99#CzL;#Xm_;62xHh^4sTybfczS*qZ?*u z23X#~@eA>Z^~E!quv$WuPLW%-(yqq$@{crYN6OZSU;pj5GM>LM{^J*P?Gn}X{qp#F zGt(*{5Cm-d{YKj6d4^|lwW!kO!-;zA2C#&U-i+iu3tpc~zj^j^W*nMjj>o;M!93O;!`G-5f4-3E$JOe2!kbULpu4KH>!`N17euJR zd><~3hI32*u+Xgtviazw7*JLb-BUH&9F{yOzudigeDHzMLmxwb8^gS6B+~HT9DlL? zRisw(93k!4eUD!EkCaI(>1J9&DMnHC0Z$o5#Ma$G=GusegjApqGf$j*`iXdO>fv`3 z2O}TkGofInVA>@Y9c+N$%N@@r(ez*j_iRpW3}>**qX}IZ;w_whF#zCD!*f5opUCgL zbz({VJiT*|zBf2w=7KluWF?g6Fr47PVFMZ^lg%{yfz4T!0VC;L#{Nbf6?);B9?I=7 z?Lh9lG%-sXk60#-;29hLN4QRJZSwiT#02l5+WBOvD}%U=!Wn~Z#+~?m!c9&b2loPw z_w!84Uf|mSM+|^$1o4)2HjEK5bdiInHO>2H;7YpGCOKew7?JU?-TZ}Pkj~TK;-I>D z=)W=~FL+mlZrb(I?Q!>RjQD3nzpMMs=5ga+d@Ky5r~cR+6&2~EJSTtZ=`sJ?kvKo~ zxl9|)W7iNAx;{C}X1)igBAdX%i1iGif#Ip~Wrej+y|n1pv|%#Nf?|Qj)LbXg^RO7p z2D@=;FE!agJ=NfnufH&*wtJN5)9A#{78vL17{L3hU1)lBb-{;sTsAW1&OK7}pSWy@ z#c)*HA{gx+Fx+r2B`<0E5q57jjxYvpk?>&L&xI%xrpib)O))M_RgdhS>6$I(BMk8& z`fPIlYhe-lKZL>pmLIo`n{mhmUW8zXgb3`rIIMR?81^U&vvcKx{VXG=do;JfCN5aC z(zNLWJy>Vk#hZC?X@e*sAmTm z{@&3fA~XZ7s4_XS$c}buMZZ3g)7NMN<>i5LAUn8~9PVcEMRR zh9N8SGbVqPc}GLbf#hBM^$gP*QD&M9ONVFd3fR~*&R~|%O=kqUgtbjsF=ez zp({1XXOoPx9P!_ZT}-Mb4a9W(nQTO%N!OM}*wAZAARa|lB%Y1u?0*z1r=yqs7itrS zvDOE_N{O!1E4SK-lAB=SEBHJqT*Jl|mO<*Gj0%`5b^fL#XNI)3IV}{akK6FO+JU%Ze|>Ol|OaAJJR@MGNa)#b{v4K)l#W4M%LD8#~kKDuT^M*^^<&gVMAt4g4V} zJ8K5hF72xtQ!4on>AoS)H`?94SV~F7#o;q#KNel!16K+Z6cEe5t|Bc0mhb4zn_Fj; zLi-Swzr`=5+sTt1!^}_h*d7DNuzF0V<`10pPfL5xr!;h&{G4z@KF$8!ZioYb<#6K?YrC;4+GqUmOh zLMm3OPgGW%&5B04r7$5A)L+`2{ifhet zR1yM{j+0+Kjr9+%y`wxH`hZC#cz|EAG0m@+O{Q#%YDZiQx_DCF%`~Cp{Dsi? z{;rrm>KQCd+N-u+F43=pPjTnV% zSr-%q+uS!jA-hu>TK*dde8IMcp6k>cD0#yELj^_!)iFDCF6Dz;!`EQ6rsD6@`Q zFfo8oT{4n|+@;krOYytN@GyfYC|S8TH5CQF;tlB2LHHTn+qTM8i7@1n#5c%2Q8aSD zD`WmT?g}A8_X#FrE-1a3{o~Vk^FE{kg4LuVg%g)ytyMP^?yD$;CF!#q;+0(0%`)J8A6eVY)~w5#Pn_lS8o1o>1Rt z20ru_2cf(=?XSiD4peBBua$_|_c=jC@z0JIZ7qSq5X`Xke0sSqGD;%_HsAAD#3h|6 zJ(mJc3*POgH?>tT}NVA9=GD}^I$}~I$w9aMll=iT%4}})u`GyN1S$9JGs3py?iR-1nz=ry7zB^+F(V}*7<~;ge zem+_z%~Ox-(kA)S7fq>gHnJ@u3O3TBF~0KkgV`VsR85S_!G{#$%5Wg4rT0S&;#2sK z?6*Flrg?)PJc|4JbWl@hB%GQW&&ZFaCbAFUT$qi6dUlIeC0ZZSdS&$`skzkK^d63u z?{C9YKBsDDfRT-VEOiQT?b6+UHbgGz9*Tnpmqy~BO1tL3!(&YzN^a+W=|RPL%ei?e z0&wE|SL4XFxW7oY`>$$F9HF$%>p4|lG2-T^(L`P!Zts!g(jMs|C(m|+MH~dcSD#I-0(&ES(LO;e6fgvp zS$_}B&5Vr=jyC0!+8_6NW6ZH*6dWDq?EJZRA!Sus>IC&Y*ue8j_5t58{S`Zp-oaSx zG2WH5o`Yu}kBdVU({ft_&Qt`^cmqk;`2ZPoTNemRqEr1!-uc51Z%&ER0@u`V27X)y z{Tx3n=3^oC;zucJ+JBP?)OEnxr!q;P{M5VtTC8Rw0$zj>|MzHx!tl#4eKH4fY6N$j zv*5Sc7XA3{Q^$f{joC{W8A3ruD$!i6Sua0}VPZ+{Vieq9V|)^K*JOrBC;-dMyFE^x zw+LZs#r%z!k^nu9ntQ;j@W}If;oW9-tH0!P>m<4ECe2mWTNtY>yQjQSdm9T871|pr zcuDSjhod<@@VurlW~g8iewvKsk+XWB^)f@T1N1n7Zpd!AcZoytH20X=kcR)P(8NTNYkQI5R(iGe(WWKJa;TT}`JKs-xqiGP49ykr)$4Rt>D9Jf|_ zswX5OCRQq1GWE^)>H5Al2Lj;g3&*tSK!sdY&fP050#nwlF7PHEzU+Aq5(HU)dQc%4 z{oe^7PRhcs6UwIQrzP**(}ADYRhV2=Egw#_&@JKq{Khu%%GZ+pbDP)u8@=7)wfn&9 zciednn5TMZp~oTt9!BS^A87#^D00u<{XwGX+*fjJ$KgeM(R<%IJ$V2JG6iJu*!yR$mDqeg)B!h}_S~sanV<-803K@V?t3l zsM-($p%}+Ar_&{rRqJux=kFmLKfVO&Ix-wVGC&0)NbCUhm_2n%gP_-qqck6@3Si`-rmf)!m(7aA1MU zps-CI11JK*dr%_1yZ)6;Y{UV;iQx3s96u0&+%(ovm!3r}zy+u=z^(gdU-D@i{$Mn6 zqp_}~5-o7E%}A#4{YrHxI+oia&gxe*eCs$RD7oXARfXT~zzWu}A22DHP1kubFU_ z$5&s4uN?R)m>{6Ym9Z`P)2Gxr=p#Z6YcujJyRM}&0@LS*09pW=YR=O%A@(kEc1DrC zrk{Wy+LY(!D_SBPK!7vjN#F*LknCNPQ>^(J=eu!eoCXB0?)e(CMTcm2&EU0*_L{xh zN>neQSfk+D918s?*jQ3|YFqX@?~_lflLsOq@bM!E3mB3E-#dQ5T#v3i%=f!t{c% zY$_-Gqb03Lf6E5Z&6wQoF?a_wi5W3Dlto@&VW`Uv0^)*JtYC#eA5}7ep(9nt7&;kS#K72BL|3)qtKNC>XoC{`a zrrA{}i6#Zbz6lbkbo$p8@dD&cAwzM!lt%ZWf068A1bHYN{ z1=%ca@;tO@LO~Fi10dJ@@@yiGtc>?YaB{Xe-k(MzectvedP2;#DS z?XSuQ{rZIjJ$+v|#}*q2Jt`xZ==@XB;Q+xGC|%EPJ%oU%5x{=xg9qYgu4SQK)ePX| z<6auLw>_>1)TR?3|4X}%*BPR%Zd{iyfBnD2bFQC?_1X2xVdMwmOU8n5Bqjya<<_Ek z6(OP9un6h#{W3G#(~U>{CDYmj!oynqyYSmR%2JIRWxF7ccz1wK?ZNlO1}9FN{|r;$ z(f2j;cTV!c-XOQ$N*IiULwiKwz|%#GX7*#ya!XFrti5x~=X9{~`FzJ9{MWGA@Gu5P z;7QLe_-L{0P4HV78lJwEEI*pIv~OO<_wI?|qOx@dEg1ng9e0OOdC-h9RI@2z(lYBp z);8jbeeYmFgaAEAl_ka6|3IN(fNuScZ9Og0#}#jyCQ~zfVQzj{-^ahm1JL94f5-!@ zCIqNv+o{N2Bw$}^FOn~!Fj|B#3~*3+F@;HIkiPJJb8y-vBabUnwhK*&?&q(I*;Jb+ zaz>^e^HVl3Ts>K(%g7`5_v%*Hi^Y!mwBF7yMl*D21R6wvIx06)^opWU7vB?$z!Ef$ zh5PbgIspBb<`>iV)-PVt8+}AGkC%5Q z)}Kz!ubRj5g9SJUJ`PNFgBL|$uY{at)d1C@*fSkW(B`be+Osh zhZigU{Ik-0E$u?sCu&qt!GZ9xh)^Q~H;j;_!lXbfam_7T7^n%joor%I9wO&I!j&7u zi2#Bh+A0x6rlkHSunExnd8R=^ZLvR{IN!BOkR6kqH-~7GUkx6don5e<{Jc3hp0Pe= zwk>O7m-_>3(~mO1!R0Qw?3ag0O^?tB`)B|F98_tMh5-t?J9$nT>-Y&~ChJ-g#HR5z z&C$MuT^|6;{JJZAr3gompj-EbOWk(b@m7VJwlmz{$=%5RDJ0RK{avd~8M8#Za%cOu zir{+dCkMB6hS&9cC%%;y`{;%pB+#43um&PDtVJ0i@A4?}#NHpB*M( z$_{EJcCftw?mw3U2HRWFfK9+L+fNhrk>zAMZ4upvBqFK#J6#gtM$8My_ql4;9#qyK z0D^uZv~U31wVewx>Lx~*MTqs2KD2d_?@JsUP@?dGLy!k76!P;h>v!v*0Yq-___4ciJ_!Iu3&9fJf(4uS_Kj815gQ)W||gflFeC^1mn*#sR3ziR2HR zb4{}uEjW<%`Q&QmB8O&O76v@P1mQ0fa^r60ABmKozV~JP8?p80FSK`$8Xc{Qp#Vx~ z9_f;C@YgT!1>d5K)-M+gVNLId!wb2}DW+d(@#LjyRkJo(pptR;_sMQ<^$c6fA|ri@ z|=qQX}Tp>Om@lh9E&1%cK1PrA>rCpE3b ze|;JYEOMY&O+YWR;3(j*+z_zC40Zp#Adok{_;B;kwSsz=oDAXk;L+}qp)Vo75^z{J z+Eg%cm_$4#RQ9$5;bd#E$@KsL6ENfKlatpzaL)j*Ym( zUunY-wg>=&9nb|`MjbAupV~*RekIu$kzNU)wcjPNLWe2hbirch0y&$uj z7}sk`zWOLbG1R0v^#MuSTq(*OYKgmm2E98w8#m;zE7{60ho1DH+&(kX(M6T&up(VyN6{yGg)jPM7mlBM7M zPt09!hmTIDO#L~hd-Oz5+F?DGb&7gO2cQ*a4OQ?{ej|+qcS0Sf9nK3lzjx?-{?7b4 zFXR&WjH=r4VJvfIe3+H0bryrdd~Om`rzD2&6(Z#q+ExN7{pH4Ug3OoM*;Ey^t&N3)7`0_!H9|I>}ZC7NJbw#pJx&dO$C$S8tjqbCYdRs*wklDzF~zT2EBO;?tC zZ!zHjt#SyV0q@cj(L9@iZI#vBIx9?2(y1rx{)6@m2~9A+f$OLFxbmM;I1SXa<7<Jmh&4tkJKK>0Z~qSr8F8sw3tG9!Dt9KuW+M#x!rYykt}KlESt&qQSy1y zs&4+;IV)il%6aC#$|#$HM-S2zd3&zDV4sf$Jo{C<#@@?K?%RgSCf2XK*~^P7+MVY8 zKn*~td@dOLgCF1EiVzb&4pjQle!z+9xK@UP?eVK3jt+DoqLsEETDe{(xar`a77wQg zP$!yXI2gM6^j|z7)99}GXD(v?XSp>nmicglh0~T?AouY!4l${bA~(2)Kih)QDC9V^ zJ$wHHw%M^ttX?LF84;Ld(JAaUGv8IqTGm2@P2}0hzwg42*s`TYu|1t;2tWNmw&Xwf zowUzALo91@F(>Z(dsWwfyrkdW?Ch^|IQh-6^806mk>YS22E_{u*j-ob$2h{bzU&ot zORP<)1F$^Pk2A?!o>l<_6cj{=>^^r3zgU|@ksL~~B3R(>Q1t?ss)E4y!PMLeJ~7A8zEfoelbf3;;ecW`_{wOtrA4^$^(zj|Ib;75SNZ+I zYIYt>^pC5@EeCXw=uV9*D1Vh+H<|=32%UU^m0z&=_*D^t;0jXNtq1#wNtj^#NvLkE zgnh8!tpm6q6e~%0kcv>KvZFlhfAA_~`RY`{Y4lwSxF-O?)bJj#Lq)5p@%R_|`hc=r(LxSyuVpoh%(>o9{e!?M!3nRVB1mu6v7Wj08ZxcwoKplPJC zmv3H56I%4{wh5;S;4E8cXz1X0|6bZmE0*59V3U;4jOR5*YPI3>to_b-7!n#ZqmW^_ zdX1tQi$`;3nN6CUaH^K&XF!ZmkmsS?dsyA`?X#7w(vP^ppWN|C%l7k7s;jvCUM_@* zQIn6)O#a7x`Rj53RMyq=_Z~ue`Zr(%za&neD+iW*g-gufFEXs&WBq$$1mATNX0>d1 zMXjUtFn`i;V+~Rb61U#ixqaGF!c{HPocn@9K>bs_4;uQ`f0%t<(j9;(&uGg0&=}Zh zC@X;63O66UCs8*k()DyC_R|!}Uint_n>C2k$!37+c%0;r_~<}A?78px+CNf26Ss9P>1-x)osBxi1?62itlE z66Llb3dBfRfo;V=@u&gI6%Ann7{KD>Ty=Ledo*U6tkKdEEoLZ6nRP=o?YnJg6>GA7 zj~#wnLavpWRTCe2;k4SiKi_E4VfWx{%p2WD*N&@Erb}w6(sGg@YIm8qh3dXen{}-tJ{Tm!SkkJziqr|ZV{Ud_^7H~gjsfY&_;Tf-ixS4APd&jPK3#Oa2(nRYf ze)#Lqt+DmS(j$fs#}aw0-F@m0!}#fnKH(ExdHgfJtF}D-gknVMIBy_;rhLScJvBcF zU_GQTLyFRLLO_bRk*knS{=`{krY8!Hx0IzJk&A0$)72$SpBm=S<&#%XETqxUlq3j+ z1ACnfVQ{m;FSbZyUjk?dNCR)86LcYZz#pe4>Ma< zyw5;G-A^4d+0aR3;e~-JEvw=a5gDy{(f99quV59O0XyD6e{k-6bE3KKWm-q|yP`*G zjSt-6vSKsI2|Beu95Y*C6D2kl29H7Rb>W!uP7oNzTM(T3vUvYT(F!B>v)p()+7^I> zU<~iWG%{`LA|F`dRvoA3D((pF>ee^0B?v7`&O%p^jA6NLX;n^3W&2!Ezs3R-$@Cc! zTcH)mgi}dvUs6hG<|J*@oS@a&HgpJnN_9bW>hTdqqp5wD2k`>^;L96 zk0~3st0|{K-yz<(sCG*i9B&7!eMu0cDit6fS5Ro3#{T)=$>x_F;D6i5q7EgE5zv~t9{BV{1u&xp6Rvm_kWkp9?68A(+mSRo6@1>oH1;!G#|-6%JCYfAyD*#6hK@bmMt)?$spRT+C8+o z=w&~3ZP`oV0`lUSO=%qz$QHiP*3TA;VBdy90~BBrt0%Lk z9@rmb`cV(vDnoF#!3XX;RB31T{*4=eat|S93+7Tvy4lZJ1!_?1co+_+VqZNZ2A(eK zz|LshghFvb!`Bl)HH7MyuYr3^l_=?-fcsUYIv)g88wI8Bf2_!#qSsRVDJ+-s`O{w|e-;At; zzG8j(w);QgTkWRTzv6|16tkOPG2GP`)?G9_VJ^{(=EY3qx{Z$@(cwt7y`D)i7aOLy zzc=ubi>ebB4_-!NvzRJVri7I?0sdzR8HPqLCiPg{zuzZ5^F$TWW|? zZkJy>bD+BQYTiH^dLbj;CkO*V(XVz-d?sq}F@ZE&?y6%RfOmZA;*kp;l}^BCi&V1K zXH}a4(Ll1Y%ieue1z9XZS_yvN!W)>h{d+L#|A2~re;mkKToxxQpOZ<~L=txpDP+Bk!kH4o)vuG`sOWFNz%tl?xO%n*CdQs(_>9j7mmVZrmRJRhMRi)UIjGBbitviq zRDB9CqGCq5By#I|Mmf})^=*^euCgBeM%*j$B0X*y@M;@Rfq%i8zZ2U`!kr?T!N2a= z(%_2EqvU-6CF#$b%KN4eQ+ERd#FvVN)5Th9OPFq%^)#)O0+2mIwK*X^ap@{VQMtqeqSFlnFPV-QjSYV zpHMyvWh{hG2k|>}&Bc1YcJ$`l(D=46*q3mNQj>5~%bzrwag`p1L}lP*{`s2Pz(;5^ zdro^E4<>OhfJE(HK)ODunn6uj^<6wnX@|Ifvv(rC?)m5_2cFF@h6czAaemL1cPotF zNf8@+1P|r|pX<@%8GPaQk^DDwYGa1Ml&y#wH|XL4MgzM`+SujSH!~gCf0a1o_sRnq zgz8x=bJ|xT81+ag_5HAEtg*34|HOq{oC=P9Qeei$C3Uuc0WHO(@@E`j#RP|Z1 zR`Nr-seeF#3@T>cG|wP0kXEwZCt73Wzue2N#H-(g{j?oS{TM5b2NdN0Mky=*eFast zuMsmD5Gir~{2Jd?Yt#C<$VQRpwfs0KvdT@CKnJqZe9KWT;tPD4Qw6G(5<0^#oPZae zeshoF_a;Xh9(Y)VfwN{aKeq?=s3Ka!JUfy(S;gl@x^iPL&{=2nRKhMl>Ia?YzT7@< zI2W{L(v9T8;8~b?ysY8{wu6Bll8kGOH$NXoP;_x4Wei%t5CQQ*W}oHu7;E&XuGsDT zpz9PHW9R+-3RJ19cI*=(4Bs+zp%lStGRbP{Rjd&%OquMVgZ11eBZgfxpZw4F0@8Hl z`*gfu6+sm=5TE3p2qzKTdOxA08xYk`3kNB_G67zqveij71Tpjc_IgwpOwhJWN( z#+{TO`%&^lMir}bx-s!?T^VM&yj*cQLiHyvBu9A3GFA)cwS|*1ZUhdKed6_dk(6zo z*ScNO7zV-}A>SoV0#*dqUO;3j-Ht9QSV?+w_gH)uX=LNw_~3)~gIxl?SansdD>7&G z9Ea3Cvr-Ma=AxcUnCxC!@eTY|8U# zX3Zo8HyRRD|DB;wDVCxH(``o|(bjv{$AAj4@u0v>Tp<0Fn3bl`w>ESlLo8PHjTkde z+qVc!g!FwZhHWA>9O~fTcF?O2jKTCp7uFBXUH8JRg0rkumrp8E<8JmFjBB=}vS>2D z|58DEcrn7Z+?UaDI8F5|9D@(i-QYfQ{%E>S>5||)D#|P(2gh4)R3Du$kN=?`6W^OU zHXg<}&JD~X?HPPr1j?Phkp=@DVhy(BTjU>*zmN;EI zo)(q@#2u>5(f&$CaI@j&S1v|6G`*l0MHO=;Z6gDD?7JC}UOOf+$8m*-atkIMpZ4ja z`gy94QF~C+1hIS{y_C@dnzGkFn(BwZ0GPeuc1(QwMLc2!qfYJmo3{w*<@ zRtnUoLNy$qlNhcdoweL{@w zx+|s>@p?S@jJH{Oy-BfX28s@-Y;5MQH5oLy z;-r)a2ElNV5iJT5Wz&bNOD<-;RsYe^oFTI zhGF^&|Hcwhpo)a-lTmANlX9=`^2f-f{p8`1gK2R6wutEk@){1w`hii#9sqtSeI3el6zmNTerlol{TGq|-}`|Hf9UrnD)v=6o2}|=2vvezv11=*0is~VZK!Qb z%n+{PC5l%~-5sso_^X#)8yBc@icUYzi0g=2uvCaQ}) zvv&|?4$YZZ(-UDmnk^rqr`Q{&I9{X2@ox)uY)m86<0y>@xbbytd)zGRHukuPG6;Yh z_MW>mf`vicz{xb`PlAC)CK6r$I_&f^O`-(}8(z@9S!NG*`r_*Kp>GWo3lBcmiJ`kC zzUf4U%NwDEvgT5Wxb7lHkk#eX)tzYI{2R}nyD1{lFY>S<+AI-+CgfG@TVsY{Js+y1O;cxat95oT_&{gpY%&+{y)gHST z(=fNF?_kEj5rn~>N&`AEtMIsPMo&*D4s`2_WF!UwFv`lB7+ix2?qyGLC0AP>BJ{b~wzLWMLEL`hd= z=l3kHuuiO5f64P!;FBNE4fEmx?-HZ(gfX5%y@VEM0r;Q3>c73Ti9t}t3S*?OrUfrA zia|!)a>$p+$VgZoSe*RMrd6UQRWU3L!f^QD1l~?Oq^Z|dfKm->X!KT(lVFYLz7(`IPA$!{?m5=E>*uZbsvN;zC?X#B*w4j z|2(F|P)Ot9efT#=mo@FP^zF4Br}^?}rCvF;#EF5IuWa>hjh`ja90JmzJ729B1BrR7mObD7SCtNl2C(Lvw})8XUQ*((Jy{IFgSWu%LjGQRg9r zRy&9n#(4h^#xTyldknN@!>@_wYZd=0EXXH(^VCUIoymmxGpB}s-u@j6FOC$44qQ%E zLw;XH8jC$`r1-81KG&6KIvEbqcf$|gq}h=mq09)H6`wC>l&`(n1ugBq^Mcc@S)v9S zOfmZ3Ev6@aMgWe;!O29x8~7qN&vq{kvM-5wD5Oy&Y{H5aLooIi20b^xU2hIQkYU9e z>K28I(wRs}B2$&mj%p_9An=<641B1cFT;Ss;W+E+aSdEpZsCB~KH~karDE;>APH;O z(jX&Dm!%|s!G%dafM2Lzh+&2xOfd0>f2={+Uua&$UZmeePhAs(`_CthzAx z6XNTKQRI5~mN=^!ElmoZ@e|B1fKtw-(dvL1g*I&R~83hpksBl97#%aYhX zOqFQK{5l^kBk#ZZ*9k)%0^!rr47|C@s$SLZB;uO=S}?qS-(XZ}h7!3c2wrBbPe$3l z_d#+5@{>`14CPn)xuoFWI@*5#po7MCygsP$a6P7V3HJ5e19Ww`P!tqvl4%T3VGB4p z%&oN?kXJ&%0e>teSOdLTp_@^Y4prj!l}7W4fW%1xmn@iX!d~hA2z}QJF0d!{pAggK zl2z6sotamR3*E9R4lK|>d=^ewEWHc1V0zTpZ28moD#e^S?qxvoF{1G!wYX)?ajopi z52x-KCc%R|1&2w{En8Dt!;GX*Sr6w1bw4X$ra`#NPq8h<`wwP1VtE(Y7a6aXC=GzZ67&kWxJl6QZ{>f!6JkRcAw$6(qE%zol?M>e ztwW~RGuVDw8E6vL^U+53BgiWCy~CMl|M>ZH@jpLE{W7DAQFUFaPlK4AgC_`T%C2Kr_kD)}1-@eE^?pHH znEH>nAKy2-d$4o&K_zQ_w=!E~3XB?q-yp&3`g^oQP*`L-)<3InS0_HM`_sTAx%4#+ z`)4&~sJ8WYTOJWaB}$u%+uMX9&~yAaPhQOT3I(*tcrAs3`oi0Je|?`DrA8D-pEI0= z#{3byqfh&`)kv~YVqrao_#fmHOv&k2in^+Pg5K6v&I7MFggPYup!8eZ zE}vRU6V9o@EFPrGEoEO&Yl)q?e!yERk7FO-%%hK2N8jc+IKD-y50d#p!AbvZMGXEt z)I%x6*!zms_6kM4ZyuhAzQ_Umn}ZXheR11kwcLt8#%;-9sUmIKSk84-`YD32c33 z)jf$^_JnLi7(C3V(yWsFdEsV}UL+qs+L@)5l@mo|`OFQk)T7?FO zYGwu$n+m1w$k7bIINFrb2qtJc{&*!5MV$j32za&MS}nPX5e*HOtZRwrPtA`>FLR|*HjF18?*|H(;q&nWh)Ke;d^{B@;=a3Abp_4$it!Wm$3lY0F*Hn1p3A@Tm+C`TSvp2N(6)?G)R|pBaMW}Xc!?aphzPv-RMBNTN(rmS`-k; z|NQ#9uK(FyJnwexT<5vZIiLFzNi!d_O+tOI_$q25sWoALXvTH}{Kis#{&WorrA!M;j@|u~yDB z*5a@TD1zGODN0VEWt+!6xvO;kcqlL;-7-QS^yO`Pk|j9_mJN0S11>rVP|Kba)k7i6 z@Nls3OOH+a7NEWq6sB0b1qtld;MyD*dSm(7g+e34f;WU?L@$Pfp4imK$pp?71+v9Y zV2IU&5o#^tDbG>cQn>oENKQFD0M@wuH2N`XiS+u;R?Kuoq)^W-oszI~WF1U)CCJp{ z_$}FvU`grM)b~m6Eg=9>1zi7{7K9|5^yx`&B}k4Ybg7Q}pVbpv??6*$z?2NZ<&d73 zVPWpC%;sM$av|liVoNQqL($a}^K~T1S0K->Zl`IDAv@e6$Df%B%K#0PsMpLooflKmQ$eY z7uWO1@qY^l-gX=~v%J^Jf8Q|z>xHhRsnwZa`p;m|m zDPT#aT$_?f>1Z7Lia-D-0r*iSdScp#GZZ-)L4pG@g+lTl;o{NsV9abRJh*G+(E3%T z5I_+e=YmZ_qSFMhG`rMs(?*C^P%FJPd<$Zfv`3bld{7CbpzYs`nJ-Tl>bePTrJaOP z%0A-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�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 KGo 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 U^vig?=^4KgFZ!XGfD-fn0FG;@MgRZ+ diff --git a/media/Particle.tga b/media/Particle.tga deleted file mode 100644 index aec06071790645c9ec42689baa6cd1e0f4060156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12827 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 awr_poxfgBNw&4vI&fB?u!=`iRSN;t%D@MNn diff --git a/media/axe.jpg b/media/axe.jpg deleted file mode 100644 index 2222cc9583f6caac93d6b6778c4a2b7b0def59c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65192 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 z zg=!!~)qvS58P|ydA?r!hDXBs1!VD&$ri}U|{uFc{zwmP(Qqn<{H1&p~dVa?QwT=oBzwAE!h1j&QOEaKau5(unl{>ZCm%OrWiiV9* ze~Bk$OuSAZr_XP&e=zKL@-WV}EIIiz4)AwrhUfv!8|!)fmi6Y}BO+RtyIT={+EL4? zMgUt%I5mR*MJJl>tp^;Liw|A!o_9pdrFILQbSWNjaV*=k57m~Tn4;mNDufd_^F(jW z6_y%78`MXKYkFv5f%4|u1;GZ$g>*%JmN|3A30NNVY!{NSVkQ4!Bo4u({6nOOC5{ke zYXGG2h{7-R8_Z7gGw;?+FolyNRB;vMD$x!}`h#_7rpggOu7`dO5zJR0!0T**dndc99;XtfaG!?I5h)@a&P+kFq;7bZ>n5$tU$D3?p6YJbXlE zWRV_wsx=gXP{n9iSXBXpkH1xr=SuOU=OUH++fa`h3nYh>ZkI7R zw;t#mgr&{m-{d610gm#6dCep%qj1xZp=$q#Ru6P*Y*Q8Dfq^}jy~5z5?%Chb2tpg@WES-Rbpv}7M51f97x%>r`so}Cd?}VzKBpc^L8+|Lxva? zdr+edn<{ix9|({UC09BKG{!j+C8v%%D4*!T_2xy%WAG`DMZT>4yFioDzaqf?!m9{K zWWIk*^|$wlZyuM=6~=QBdSblf>EE)I2eRENCZEHJlU%h5!Lls^ybXI*hBB;H zHME}1O@f_xxi&b8RFKEYHdt6KOAb)f1sV}q!A`s}FWpjA!l@@Y{!BK}nwIxxgPt2dKd?YJ8CLmY??d~B=u$a;(S0avz| z&EykO?d03B9j0Y4_Cfe@YG#ufC7D%x=HdoLqK+e67vQuJN@v35ko>Go=y0EIyXa&5svuynb* zOH8mL&mPll@smwsgL$4wa%dvaUE#Qr7U6W^R+YI6E>szcP-J)rVlIV1=;U9g3}Y3{ zJ(i1)k?0VR9*}**9!n1QsbFtH-uBO(j8`8))lO<^&AXd@$-4wFKMwx{aau`XG6Lqo z5s|s7N`=V z#MFbobnbW(#5uu5;(-^@*jR`B-~aw6>vMpD35S?>w*?-5jS1&?8iSbaeuL?^00_?3 zdrnI7k4ut{OY%?tZU1lmmvT~4@=h7`=_TruGD>vzF=hK5$NYxCm+<&&CoTw<6?EG{I;F!Q+UO6CX6DOH#hSSPs$9<9%7oa15=I z=YG78hAs|G$*ITo=$Av#Bq#`4lnz1?+pi=7d63He%jPHdGRi_n7vuWP%S&-#fzg}E ziLA}b-hZ22%MWjx-Ur7i8u}~~^KO6^MKE!D_1%tEN;OPfW?GOpJ4E#=$sBi&bjp(R zDqT-c;q+EFM(|`X>hEU(DDu|f^+1i)U(NqM|9@W)&gcLD diff --git a/media/ball.wav b/media/ball.wav deleted file mode 100644 index 24094eeecb499c887db35d9bab0ab183ebccf4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4870 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 diff --git a/media/burninglogo.png b/media/burninglogo.png deleted file mode 100644 index 19cf8b3964c7c8835b1a311962363e8c186906d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14035 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 - - - -Welcome to the Mesh Viewer of the "Irrlicht Engine"!. -This program is able to load and display all 3D geometry and models the Irrlicht Engine can. -Controls: Left mouse to rotate, right mouse to move, both buttons to zoom. Escape to Stop FPS Camera - -Supported formats are: -- Irrlicht scene and mesh formats (.irr, .irrmesh, .xml) -- 3D Studio (.3ds) -- Blitz3D (.b3d) -- COLLADA 1.2/1.3 (.dae, .xml) -- Cartography shop 4 (.csm) -- DirectX (.x) -- DeleD (.dmf) -- Maya (.obj) -- Milkshape (.ms3d) -- My3D (.my3D) -- OCT (.oct) -- Ogre3d (.mesh) -- Pulsar LMTools (.lmts) -- Quake 3 levels (.bsp) -- Quake 2 models (.md2) -- Stanford Triangle (.ply) -- Stereolithography format (.stl) - - - diff --git a/media/coolguy_opt.x b/media/coolguy_opt.x new file mode 100755 index 00000000..e806d831 --- /dev/null +++ b/media/coolguy_opt.x @@ -0,0 +1,2 @@ +xof 0303txt 0032 +AnimationSet{Animation{{Armature}AnimationKey{0;2;0;4;1,0,0,0;;,29;4;1,0,0,0;;;}AnimationKey{2;2;0;3;0,0,0;;,29;3;0,0,0;;;}}Animation{{Armature_knee_r}AnimationKey{0;16;0;4;0.864183,0.503177,0,0;;,1;4;0.829812,0.558043,0,0;;,3;4;0.708698,0.705512,0,0;;,5;4;0.589108,0.808054,0,0;;,7;4;0.593659,0.804717,0,0;;,9;4;0.748627,0.662991,0,0;;,11;4;0.910305,0.413938,0,0;;,13;4;0.975925,0.218107,0,0;;,15;4;0.981302,0.192476,0,0;;,17;4;0.975476,0.220108,0,0;;,19;4;0.963662,0.267124,0,0;;,21;4;0.945893,0.324478,0,0;;,23;4;0.923816,0.382838,0,0;;,25;4;0.901205,0.433394,0,0;;,27;4;0.883429,0.468566,0,0;;,29;4;0.876305,0.481757,0,0;;;}AnimationKey{2;2;0;3;0,0,1.10139;;,29;3;0,0,1.10139;;;}}Animation{{Armature_elbow_r}AnimationKey{0;16;0;4;0.756295,0.004619,-0.619265,0.210967;;,1;4;0.771977,0.005599,-0.60257,0.202311;;,3;4;0.825501,0.009164,-0.538259,0.169533;;,5;4;0.891859,0.014253,-0.436142,0.119019;;,7;4;0.949154,0.019821,-0.308768,0.058108;;,9;4;0.983251,0.024703,-0.18057,-0.001258;;,11;4;0.995416,0.028143,-0.07812,-0.047458;;,13;4;0.996672,0.02991,-0.020368,-0.073041;;,15;4;0.996672,0.02991,-0.020368,-0.073041;;,17;4;0.995416,0.028143,-0.07812,-0.047458;;,19;4;0.983251,0.024703,-0.18057,-0.001258;;,21;4;0.949154,0.019821,-0.308768,0.058108;;,23;4;0.891859,0.014253,-0.436142,0.119019;;,25;4;0.825501,0.009164,-0.538259,0.169533;;,27;4;0.771977,0.005599,-0.60257,0.202311;;,29;4;0.750682,0.004275,-0.625038,0.213976;;;}AnimationKey{2;2;0;3;0,0,0.754892;;,29;3;0,0,0.754892;;;}}Animation{{Armature_arm_r}AnimationKey{0;16;0;4;0.28219,0.629905,0.723388,-0.017285;;,1;4;0.277641,0.632543,0.722699,-0.022614;;,3;4;0.261375,0.641615,0.719924,-0.041507;;,5;4;0.238321,0.653533,0.715186,-0.067874;;,7;4;0.212026,0.665838,0.708676,-0.097381;;,9;4;0.186345,0.676585,0.701229,-0.125643;;,11;4;0.165298,0.684491,0.694351,-0.14841;;,13;4;0.152894,0.688778,0.68998,-0.161665;;,15;4;0.152894,0.688779,0.68998,-0.161665;;,17;4;0.165298,0.684491,0.694351,-0.14841;;,19;4;0.186345,0.676585,0.701229,-0.125643;;,21;4;0.212026,0.665838,0.708676,-0.097381;;,23;4;0.238321,0.653533,0.715186,-0.067874;;,25;4;0.261375,0.641615,0.719924,-0.041507;;,27;4;0.277641,0.632543,0.722699,-0.022614;;,29;4;0.283802,0.628959,0.723623,-0.015394;;;}AnimationKey{2;2;0;3;-0.545315,0,1;;,29;3;-0.545315,0,1;;;}}Animation{{Armature_knee_l}AnimationKey{0;16;0;4;0.981896,0.189423,0,0;;,1;4;0.9814,0.191974,0,0;;,3;4;0.979127,0.203251,0,0;;,5;4;0.974526,0.224276,0,0;;,7;4;0.96645,0.256853,0,0;;,9;4;0.953088,0.302692,0,0;;,11;4;0.931731,0.36315,0,0;;,13;4;0.898645,0.438676,0,0;;,15;4;0.848226,0.529634,0,0;;,17;4;0.773692,0.633562,0,0;;,19;4;0.689831,0.72397,0,0;;,21;4;0.629304,0.777159,0,0;;,23;4;0.648685,0.761057,0,0;;,25;4;0.812268,0.583284,0,0;;,27;4;0.948066,0.318074,0,0;;,29;4;0.982049,0.188624,0,0;;;}AnimationKey{2;2;0;3;0,0,1.10139;;,29;3;0,0,1.10139;;;}}Animation{{Armature_Bone_007}AnimationKey{0;16;0;4;0.993671,-0.112331,0,0;;,1;4;0.994784,-0.102002,0,0;;,3;4;0.997507,-0.070564,0,0;;,5;4;0.999237,-0.039056,0,0;;,7;4;0.999694,-0.024737,0,0;;,9;4;0.999079,-0.042907,0,0;;,11;4;0.99677,-0.080308,0,0;;,13;4;0.993798,-0.111199,0,0;;,15;4;0.993599,-0.112965,0,0;;,17;4;0.995813,-0.091409,0,0;;,19;4;0.998181,-0.060285,0,0;;,21;4;0.999479,-0.032286,0,0;;,23;4;0.999797,-0.020142,0,0;;,25;4;0.998983,-0.045097,0,0;;,27;4;0.995813,-0.091409,0,0;;,29;4;0.993221,-0.116243,0,0;;;}AnimationKey{2;2;0;3;0,0,1.221802;;,29;3;0,0,1.221802;;;}}Animation{{Armature_elbow_l}AnimationKey{0;16;0;4;0.995195,-0.034868,-0.015799,-0.090119;;,1;4;0.993465,-0.046368,-0.030155,-0.099838;;,3;4;0.983557,-0.0879,-0.082099,-0.134715;;,5;4;0.959324,-0.146904,-0.156177,-0.183648;;,7;4;0.917546,-0.212233,-0.238611,-0.236921;;,9;4;0.864109,-0.271657,-0.314022,-0.284443;;,11;4;0.813172,-0.315829,-0.370387,-0.319087;;,13;4;0.781004,-0.339668,-0.400938,-0.337501;;,15;4;0.781004,-0.339668,-0.400938,-0.337501;;,17;4;0.813172,-0.315829,-0.370387,-0.319087;;,19;4;0.864109,-0.271657,-0.314022,-0.284443;;,21;4;0.917546,-0.212233,-0.238611,-0.236921;;,23;4;0.959324,-0.146904,-0.156177,-0.183648;;,25;4;0.983557,-0.0879,-0.082099,-0.134715;;,27;4;0.993465,-0.046368,-0.030155,-0.099838;;,29;4;0.995701,-0.030812,-0.010739,-0.086685;;;}AnimationKey{2;2;0;3;0,0,0.754892;;,29;3;0,0,0.754892;;;}}Animation{{Armature_body}AnimationKey{0;16;0;4;-0,0,0.601298,0.799025;;,1;4;-0,0,0.608144,0.793827;;,3;4;-0,0,0.627465,0.778645;;,5;4;-0,0,0.643183,0.765712;;,7;4;-0,0,0.643755,0.765231;;,9;4;-0,0,0.631076,0.775721;;,11;4;-0,0,0.613775,0.789481;;,13;4;-0,0,0.6007,0.799474;;,15;4;-0,0,0.601488,0.798882;;,17;4;-0,0,0.619499,0.784997;;,19;4;-0,0,0.643196,0.765702;;,21;4;-0,0,0.660441,0.750878;;,23;4;-0,0,0.659666,0.751559;;,25;4;-0,0,0.638264,0.769817;;,27;4;-0,0,0.611752,0.791049;;,29;4;-0,0,0.598631,0.801025;;;}AnimationKey{2;2;0;3;0,2.580534,0;;,29;3;0,2.571201,0;;;}}Animation{{Armature_leg_l}AnimationKey{0;16;0;4;0.390287,0.920693,0,0;;,1;4;0.362565,0.931959,0,0;;,3;4;0.266163,0.963928,0,0;;,5;4;0.138294,0.990391,0,0;;,7;4;0.012725,0.999919,0,0;;,9;4;-0.090194,0.995924,0,0;;,11;4;-0.162502,0.986708,0,0;;,13;4;-0.201466,0.979496,0,0;;,15;4;-0.185641,0.982618,0,0;;,17;4;-0.013697,0.999906,0,0;;,19;4;0.24238,0.970181,0,0;;,21;4;0.417271,0.908782,0,0;;,23;4;0.439308,0.898336,0,0;;,25;4;0.424255,0.905543,0,0;;,27;4;0.407664,0.913132,0,0;;,29;4;0.400263,0.9164,0,0;;;}AnimationKey{2;2;0;3;0.246294,0,-0.171352;;,29;3;0.246294,0,-0.171351;;;}}Animation{{Armature_leg_r}AnimationKey{0;16;0;4;0.174933,-0.98458,0,0;;,1;4;0.082829,-0.996564,0,0;;,3;4;-0.21147,-0.977384,0,0;;,5;4;-0.442802,-0.89662,0,0;;,7;4;-0.47604,-0.879424,0,0;;,9;4;-0.47279,-0.881175,0,0;;,11;4;-0.459567,-0.888143,0,0;;,13;4;-0.427425,-0.904051,0,0;;,15;4;-0.361724,-0.932285,0,0;;,17;4;-0.251362,-0.967893,0,0;;,19;4;-0.114531,-0.99342,0,0;;,21;4;0.021053,-0.999778,0,0;;,23;4;0.12473,-0.992191,0,0;;,25;4;0.181473,-0.983396,0,0;;,27;4;0.204037,-0.978963,0,0;;,29;4;0.208187,-0.978089,0,0;;;}AnimationKey{2;2;0;3;-0.246294,0,-0.171352;;,29;3;-0.246294,0,-0.171351;;;}}Animation{{Armature_arm_l}AnimationKey{0;16;0;4;0.200754,-0.659656,-0.716264,-0.107316;;,1;4;0.192268,-0.660735,-0.716526,-0.114246;;,3;4;0.161871,-0.663925,-0.716753,-0.138802;;,5;4;0.118745,-0.666682,-0.715211,-0.17294;;,7;4;0.069733,-0.667364,-0.710872,-0.210767;;,9;4;0.022313,-0.665594,-0.704111,-0.246404;;,11;4;-0.016046,-0.662426,-0.696821,-0.274543;;,13;4;-0.038374,-0.659874,-0.691824,-0.290643;;,15;4;-0.038373,-0.659874,-0.691824,-0.290643;;,17;4;-0.016044,-0.662427,-0.696822,-0.274543;;,19;4;0.022312,-0.665594,-0.70411,-0.246404;;,21;4;0.069733,-0.667365,-0.710872,-0.210767;;,23;4;0.118745,-0.666682,-0.715211,-0.17294;;,25;4;0.161871,-0.663925,-0.716753,-0.138802;;,27;4;0.192268,-0.660735,-0.716526,-0.114246;;,29;4;0.203757,-0.659255,-0.716151,-0.104856;;;}AnimationKey{2;2;0;3;0.545315,0,1;;,29;3;0.545315,0,1;;;}}}Frame Root{FrameTransformMatrix{1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;;}Frame Armature{FrameTransformMatrix{1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;;}Frame Armature_body{FrameTransformMatrix{-1,0,0,0,0,0,1,0,0,1,0,0,0,2.571201,0,1;;}Frame Armature_arm_r{FrameTransformMatrix{-0.047733,0.997488,-0.05233,0,0.901521,0.020464,-0.432251,0,-0.430095,-0.067809,-0.900233,0,-0.545315,0,1,1;;}Frame Armature_elbow_r{FrameTransformMatrix{0.987983,0.151721,-0.029519,0,-0.153228,0.986478,-0.058162,0,0.020295,0.061987,0.997871,0,0,0,0.754892,1;;}}}Frame Armature_arm_l{FrameTransformMatrix{-0.047732,0.994072,-0.097683,0,0.901521,0.084983,0.424309,0,0.430095,-0.067809,-0.900233,0,0.545315,0,1,1;;}Frame Armature_elbow_l{FrameTransformMatrix{0.984741,0.173286,-0.016044,0,-0.171963,0.983073,0.063221,0,0.026727,-0.059497,0.99787,0,0,0,0.754892,1;;}}}Frame Armature_leg_l{FrameTransformMatrix{1,0,0,0,0,-0.998426,-0.056453,0,0,0.056453,-0.998405,0,0.246294,0,-0.171351,1;;}Frame Armature_knee_l{FrameTransformMatrix{1,0,0,0,0,0.993861,-0.110639,0,0,0.110639,0.993861,0,0,0,1.10139,1;;}}}Frame Armature_leg_r{FrameTransformMatrix{1,0,0,0,0,-0.998426,-0.056453,0,0,0.056453,-0.998405,0,-0.246294,0,-0.171351,1;;}Frame Armature_knee_r{FrameTransformMatrix{1,0,0,0,0,0.993861,-0.110639,0,0,0.110639,0.993861,0,0,0,1.10139,1;;}}}Frame Armature_Bone_007{FrameTransformMatrix{1,0,0,0,0,1,0,0,0,0,1,0,0,0,1.221802,1;;}}}Frame cool_dude{FrameTransformMatrix{-1,0,0,0,0,1,0,0,0,0,-1,0,0,0,0,1;;}Mesh{272;0;2.440814;0.219926;,0;3.688199;0.219926;,0.466212;3.688199;0.219926;,0.466212;2.440814;0.219926;,0.466212;2.440814;0.219926;,0.466212;3.688199;0.219926;,0.466212;3.688199;-0.219926;,0.466212;2.440814;-0.219926;,0;2.440814;0.219926;,0.466212;2.440814;0.219926;,0.466212;2.440814;-0.219926;,0;2.440814;-0.219926;,0.055633;1.27575;-0.190081;,0.055633;2.35741;-0.190081;,0.055633;2.35741;0.190081;,0.055633;1.27575;0.190081;,0.055633;1.27575;0.190081;,0.055633;2.35741;0.190081;,0.43017;2.35741;0.190081;,0.43017;1.27575;0.190081;,0.43017;1.27575;0.190081;,0.43017;2.35741;0.190081;,0.43017;2.35741;-0.190081;,0.43017;1.27575;-0.190081;,0.43017;1.27575;-0.190081;,0.43017;2.35741;-0.190081;,0.055633;2.35741;-0.190081;,0.055633;1.27575;-0.190081;,0.055633;1.27575;0.190081;,0.43017;1.27575;0.190081;,0.43017;1.27575;-0.190081;,0.055633;1.27575;-0.190081;,0.43017;2.35741;0.190081;,0.055633;2.35741;0.190081;,0.055633;2.35741;-0.190081;,0.43017;2.35741;-0.190081;,0.466212;3.688199;0.219926;,0;3.688199;0.219926;,0;3.688199;-0.219926;,0.466212;3.688199;-0.219926;,0.466212;2.440814;-0.219926;,0.466212;3.688199;-0.219926;,0;3.688199;-0.219926;,0;2.440814;-0.219926;,0.769341;2.834949;-0.041122;,0.440953;3.555781;-0.041122;,0.440953;3.555781;0.207294;,0.769341;2.834949;0.207294;,0.769341;2.834949;0.207294;,0.440953;3.555781;0.207294;,0.616273;3.635651;0.207294;,0.944661;2.914819;0.207294;,0.944661;2.914819;0.207294;,0.616273;3.635651;0.207294;,0.616273;3.635651;-0.041122;,0.944661;2.914819;-0.041122;,0.944661;2.914819;-0.041122;,0.616273;3.635651;-0.041122;,0.440953;3.555781;-0.041122;,0.769341;2.834949;-0.041122;,0.769341;2.834949;0.207294;,0.944661;2.914819;0.207294;,0.944661;2.914819;-0.041122;,0.769341;2.834949;-0.041122;,0.616273;3.635651;0.207294;,0.440953;3.555781;0.207294;,0.440953;3.555781;-0.041122;,0.616273;3.635651;-0.041122;,1.104504;2.080977;-0.086788;,0.776116;2.801809;-0.086788;,0.776116;2.801809;0.161627;,1.104504;2.080977;0.161627;,1.104504;2.080977;0.161627;,0.776116;2.801809;0.161627;,0.951436;2.881679;0.161627;,1.279824;2.160847;0.161627;,1.279824;2.160847;0.161627;,0.951436;2.881679;0.161627;,0.951436;2.881679;-0.086788;,1.279824;2.160847;-0.086788;,1.279824;2.160847;-0.086788;,0.951436;2.881679;-0.086788;,0.776116;2.801809;-0.086788;,1.104504;2.080977;-0.086788;,1.104504;2.080977;0.161627;,1.279824;2.160847;0.161627;,1.279824;2.160847;-0.086788;,1.104504;2.080977;-0.086788;,0.951436;2.881679;0.161627;,0.776116;2.801809;0.161627;,0.776116;2.801809;-0.086788;,0.951436;2.881679;-0.086788;,0.055633;0.093601;-0.190081;,0.055633;1.205294;-0.190081;,0.055633;1.205294;0.190081;,0.055633;0.093601;0.190081;,0.055633;0.093601;0.190081;,0.055633;1.205294;0.190081;,0.43017;1.205294;0.190081;,0.43017;0.093601;0.190081;,0.43017;0.093601;0.190081;,0.43017;1.205294;0.190081;,0.43017;1.205294;-0.190081;,0.43017;0.093601;-0.190081;,0.43017;0.093601;-0.190081;,0.43017;1.205294;-0.190081;,0.055633;1.205294;-0.190081;,0.055633;0.093601;-0.190081;,0.055633;0.093601;0.190081;,0.43017;0.093601;0.190081;,0.43017;0.093601;-0.190081;,0.055633;0.093601;-0.190081;,0.43017;1.205294;0.190081;,0.055633;1.205294;0.190081;,0.055633;1.205294;-0.190081;,0.43017;1.205294;-0.190081;,0;3.790919;0.428464;,0;4.579204;0.428464;,0.43344;4.560537;0.409797;,0.43344;3.809586;0.409797;,0.43344;3.809586;0.409797;,0.43344;4.560537;0.409797;,0.43344;4.560537;-0.284975;,0.43344;3.809586;-0.284975;,0;3.790919;0.428464;,0.43344;3.809586;0.409797;,0.43344;3.809586;-0.284975;,0;3.790919;-0.303642;,0.43344;4.560537;0.409797;,0;4.579204;0.428464;,0;4.579204;-0.303642;,0.43344;4.560537;-0.284975;,0.43344;3.809586;-0.284975;,0.43344;4.560537;-0.284975;,0;4.579204;-0.303642;,0;3.790919;-0.303642;,0;2.440814;0.219926;,-0.466212;2.440814;0.219926;,-0.466212;3.688199;0.219926;,0;3.688199;0.219926;,-0.466212;2.440814;0.219926;,-0.466212;2.440814;-0.219926;,-0.466212;3.688199;-0.219926;,-0.466212;3.688199;0.219926;,0;2.440814;0.219926;,0;2.440814;-0.219926;,-0.466212;2.440814;-0.219926;,-0.466212;2.440814;0.219926;,-0.055633;1.27575;-0.190081;,-0.055633;1.27575;0.190081;,-0.055633;2.35741;0.190081;,-0.055633;2.35741;-0.190081;,-0.055633;1.27575;0.190081;,-0.43017;1.27575;0.190081;,-0.43017;2.35741;0.190081;,-0.055633;2.35741;0.190081;,-0.43017;1.27575;0.190081;,-0.43017;1.27575;-0.190081;,-0.43017;2.35741;-0.190081;,-0.43017;2.35741;0.190081;,-0.43017;1.27575;-0.190081;,-0.055633;1.27575;-0.190081;,-0.055633;2.35741;-0.190081;,-0.43017;2.35741;-0.190081;,-0.055633;1.27575;0.190081;,-0.055633;1.27575;-0.190081;,-0.43017;1.27575;-0.190081;,-0.43017;1.27575;0.190081;,-0.43017;2.35741;0.190081;,-0.43017;2.35741;-0.190081;,-0.055633;2.35741;-0.190081;,-0.055633;2.35741;0.190081;,-0.466212;3.688199;0.219926;,-0.466212;3.688199;-0.219926;,0;3.688199;-0.219926;,0;3.688199;0.219926;,-0.466212;2.440814;-0.219926;,0;2.440814;-0.219926;,0;3.688199;-0.219926;,-0.466212;3.688199;-0.219926;,-0.769341;2.834949;-0.041122;,-0.769341;2.834949;0.207294;,-0.440953;3.555781;0.207294;,-0.440953;3.555781;-0.041122;,-0.769341;2.834949;0.207294;,-0.944661;2.914819;0.207294;,-0.616273;3.635651;0.207294;,-0.440953;3.555781;0.207294;,-0.944661;2.914819;0.207294;,-0.944661;2.914819;-0.041122;,-0.616273;3.635651;-0.041122;,-0.616273;3.635651;0.207294;,-0.944661;2.914819;-0.041122;,-0.769341;2.834949;-0.041122;,-0.440953;3.555781;-0.041122;,-0.616273;3.635651;-0.041122;,-0.769341;2.834949;0.207294;,-0.769341;2.834949;-0.041122;,-0.944661;2.914819;-0.041122;,-0.944661;2.914819;0.207294;,-0.616273;3.635651;0.207294;,-0.616273;3.635651;-0.041122;,-0.440953;3.555781;-0.041122;,-0.440953;3.555781;0.207294;,-1.104504;2.080977;-0.086788;,-1.104504;2.080977;0.161627;,-0.776116;2.801809;0.161627;,-0.776116;2.801809;-0.086788;,-1.104504;2.080977;0.161627;,-1.279824;2.160847;0.161627;,-0.951436;2.881679;0.161627;,-0.776116;2.801809;0.161627;,-1.279824;2.160847;0.161627;,-1.279824;2.160847;-0.086788;,-0.951436;2.881679;-0.086788;,-0.951436;2.881679;0.161627;,-1.279824;2.160847;-0.086788;,-1.104504;2.080977;-0.086788;,-0.776116;2.801809;-0.086788;,-0.951436;2.881679;-0.086788;,-1.104504;2.080977;0.161627;,-1.104504;2.080977;-0.086788;,-1.279824;2.160847;-0.086788;,-1.279824;2.160847;0.161627;,-0.951436;2.881679;0.161627;,-0.951436;2.881679;-0.086788;,-0.776116;2.801809;-0.086788;,-0.776116;2.801809;0.161627;,-0.055633;0.093601;-0.190081;,-0.055633;0.093601;0.190081;,-0.055633;1.205294;0.190081;,-0.055633;1.205294;-0.190081;,-0.055633;0.093601;0.190081;,-0.43017;0.093601;0.190081;,-0.43017;1.205294;0.190081;,-0.055633;1.205294;0.190081;,-0.43017;0.093601;0.190081;,-0.43017;0.093601;-0.190081;,-0.43017;1.205294;-0.190081;,-0.43017;1.205294;0.190081;,-0.43017;0.093601;-0.190081;,-0.055633;0.093601;-0.190081;,-0.055633;1.205294;-0.190081;,-0.43017;1.205294;-0.190081;,-0.055633;0.093601;0.190081;,-0.055633;0.093601;-0.190081;,-0.43017;0.093601;-0.190081;,-0.43017;0.093601;0.190081;,-0.43017;1.205294;0.190081;,-0.43017;1.205294;-0.190081;,-0.055633;1.205294;-0.190081;,-0.055633;1.205294;0.190081;,0;3.790919;0.428464;,-0.43344;3.809586;0.409797;,-0.43344;4.560537;0.409797;,0;4.579204;0.428464;,-0.43344;3.809586;0.409797;,-0.43344;3.809586;-0.284975;,-0.43344;4.560537;-0.284975;,-0.43344;4.560537;0.409797;,0;3.790919;0.428464;,0;3.790919;-0.303642;,-0.43344;3.809586;-0.284975;,-0.43344;3.809586;0.409797;,-0.43344;4.560537;0.409797;,-0.43344;4.560537;-0.284975;,0;4.579204;-0.303642;,0;4.579204;0.428464;,-0.43344;3.809586;-0.284975;,0;3.790919;-0.303642;,0;4.579204;-0.303642;,-0.43344;4.560537;-0.284975;;68;4;3,2,1,0;,4;7,6,5,4;,4;11,10,9,8;,4;15,14,13,12;,4;19,18,17,16;,4;23,22,21,20;,4;27,26,25,24;,4;31,30,29,28;,4;35,34,33,32;,4;39,38,37,36;,4;43,42,41,40;,4;47,46,45,44;,4;51,50,49,48;,4;55,54,53,52;,4;59,58,57,56;,4;63,62,61,60;,4;67,66,65,64;,4;71,70,69,68;,4;75,74,73,72;,4;79,78,77,76;,4;83,82,81,80;,4;87,86,85,84;,4;91,90,89,88;,4;95,94,93,92;,4;99,98,97,96;,4;103,102,101,100;,4;107,106,105,104;,4;111,110,109,108;,4;115,114,113,112;,4;119,118,117,116;,4;123,122,121,120;,4;127,126,125,124;,4;131,130,129,128;,4;135,134,133,132;,4;139,138,137,136;,4;143,142,141,140;,4;147,146,145,144;,4;151,150,149,148;,4;155,154,153,152;,4;159,158,157,156;,4;163,162,161,160;,4;167,166,165,164;,4;171,170,169,168;,4;175,174,173,172;,4;179,178,177,176;,4;183,182,181,180;,4;187,186,185,184;,4;191,190,189,188;,4;195,194,193,192;,4;199,198,197,196;,4;203,202,201,200;,4;207,206,205,204;,4;211,210,209,208;,4;215,214,213,212;,4;219,218,217,216;,4;223,222,221,220;,4;227,226,225,224;,4;231,230,229,228;,4;235,234,233,232;,4;239,238,237,236;,4;243,242,241,240;,4;247,246,245,244;,4;251,250,249,248;,4;255,254,253,252;,4;259,258,257,256;,4;263,262,261,260;,4;267,266,265,264;,4;271,270,269,268;;MeshNormals{272;0;-0.707083;0.707083;,0;0.707083;0.707083;,0.577349;0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0;-0.707083;0.707083;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;-0.577349;,0;-0.707083;-0.707083;,-0.577349;-0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;-0.577349;,0.577349;0.577349;0.577349;,-0.577349;0.577349;0.577349;,-0.577349;0.577349;-0.577349;,0.577349;0.577349;-0.577349;,0.577349;0.577349;0.577349;,0;0.707083;0.707083;,0;0.707083;-0.707083;,0.577349;0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;0.577349;-0.577349;,0;0.707083;-0.707083;,0;-0.707083;-0.707083;,-0.286019;-0.764733;-0.577349;,-0.764733;0.286019;-0.577349;,-0.764733;0.286019;0.577349;,-0.286019;-0.764733;0.577349;,-0.286019;-0.764733;0.577349;,-0.764733;0.286019;0.577349;,0.286019;0.764733;0.577349;,0.764733;-0.286019;0.577349;,0.764733;-0.286019;0.577349;,0.286019;0.764733;0.577349;,0.286019;0.764733;-0.577349;,0.764733;-0.286019;-0.577349;,0.764733;-0.286019;-0.577349;,0.286019;0.764733;-0.577349;,-0.764733;0.286019;-0.577349;,-0.286019;-0.764733;-0.577349;,-0.286019;-0.764733;0.577349;,0.764733;-0.286019;0.577349;,0.764733;-0.286019;-0.577349;,-0.286019;-0.764733;-0.577349;,0.286019;0.764733;0.577349;,-0.764733;0.286019;0.577349;,-0.764733;0.286019;-0.577349;,0.286019;0.764733;-0.577349;,-0.286019;-0.764733;-0.577349;,-0.764733;0.286019;-0.577349;,-0.764733;0.286019;0.577349;,-0.286019;-0.764733;0.577349;,-0.286019;-0.764733;0.577349;,-0.764733;0.286019;0.577349;,0.286019;0.764733;0.577349;,0.764733;-0.286019;0.577349;,0.764733;-0.286019;0.577349;,0.286019;0.764733;0.577349;,0.286019;0.764733;-0.577349;,0.764733;-0.286019;-0.577349;,0.764733;-0.286019;-0.577349;,0.286019;0.764733;-0.577349;,-0.764733;0.286019;-0.577349;,-0.286019;-0.764733;-0.577349;,-0.286019;-0.764733;0.577349;,0.764733;-0.286019;0.577349;,0.764733;-0.286019;-0.577349;,-0.286019;-0.764733;-0.577349;,0.286019;0.764733;0.577349;,-0.764733;0.286019;0.577349;,-0.764733;0.286019;-0.577349;,0.286019;0.764733;-0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;-0.577349;,0.577349;0.577349;0.577349;,-0.577349;0.577349;0.577349;,-0.577349;0.577349;-0.577349;,0.577349;0.577349;-0.577349;,0;-0.707083;0.707083;,0;0.707083;0.707083;,0.599902;0.565722;0.565722;,0.599902;-0.565722;0.565722;,0.599902;-0.565722;0.565722;,0.599902;0.565722;0.565722;,0.599902;0.565722;-0.565722;,0.599902;-0.565722;-0.565722;,0;-0.707083;0.707083;,0.599902;-0.565722;0.565722;,0.599902;-0.565722;-0.565722;,0;-0.707083;-0.707083;,0.599902;0.565722;0.565722;,0;0.707083;0.707083;,0;0.707083;-0.707083;,0.599902;0.565722;-0.565722;,0.599902;-0.565722;-0.565722;,0.599902;0.565722;-0.565722;,0;0.707083;-0.707083;,0;-0.707083;-0.707083;,0;-0.707083;0.707083;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,0;0.707083;0.707083;,-0.577349;-0.577349;0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;0.577349;0.577349;,0;-0.707083;0.707083;,0;-0.707083;-0.707083;,-0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;0.577349;,0.577349;-0.577349;-0.577349;,0.577349;-0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;0.577349;-0.577349;,0.577349;-0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,0.577349;0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;0.577349;0.577349;,-0.577349;-0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,-0.577349;0.577349;-0.577349;,0.577349;0.577349;-0.577349;,0.577349;0.577349;0.577349;,-0.577349;0.577349;0.577349;,-0.577349;0.577349;-0.577349;,0;0.707083;-0.707083;,0;0.707083;0.707083;,-0.577349;-0.577349;-0.577349;,0;-0.707083;-0.707083;,0;0.707083;-0.707083;,-0.577349;0.577349;-0.577349;,0.286019;-0.764733;-0.577349;,0.286019;-0.764733;0.577349;,0.764733;0.286019;0.577349;,0.764733;0.286019;-0.577349;,0.286019;-0.764733;0.577349;,-0.764733;-0.286019;0.577349;,-0.286019;0.764733;0.577349;,0.764733;0.286019;0.577349;,-0.764733;-0.286019;0.577349;,-0.764733;-0.286019;-0.577349;,-0.286019;0.764733;-0.577349;,-0.286019;0.764733;0.577349;,-0.764733;-0.286019;-0.577349;,0.286019;-0.764733;-0.577349;,0.764733;0.286019;-0.577349;,-0.286019;0.764733;-0.577349;,0.286019;-0.764733;0.577349;,0.286019;-0.764733;-0.577349;,-0.764733;-0.286019;-0.577349;,-0.764733;-0.286019;0.577349;,-0.286019;0.764733;0.577349;,-0.286019;0.764733;-0.577349;,0.764733;0.286019;-0.577349;,0.764733;0.286019;0.577349;,0.286019;-0.764733;-0.577349;,0.286019;-0.764733;0.577349;,0.764733;0.286019;0.577349;,0.764733;0.286019;-0.577349;,0.286019;-0.764733;0.577349;,-0.764733;-0.286019;0.577349;,-0.286019;0.764733;0.577349;,0.764733;0.286019;0.577349;,-0.764733;-0.286019;0.577349;,-0.764733;-0.286019;-0.577349;,-0.286019;0.764733;-0.577349;,-0.286019;0.764733;0.577349;,-0.764733;-0.286019;-0.577349;,0.286019;-0.764733;-0.577349;,0.764733;0.286019;-0.577349;,-0.286019;0.764733;-0.577349;,0.286019;-0.764733;0.577349;,0.286019;-0.764733;-0.577349;,-0.764733;-0.286019;-0.577349;,-0.764733;-0.286019;0.577349;,-0.286019;0.764733;0.577349;,-0.286019;0.764733;-0.577349;,0.764733;0.286019;-0.577349;,0.764733;0.286019;0.577349;,0.577349;-0.577349;-0.577349;,0.577349;-0.577349;0.577349;,0.577349;0.577349;0.577349;,0.577349;0.577349;-0.577349;,0.577349;-0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,0.577349;0.577349;0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,-0.577349;0.577349;0.577349;,-0.577349;-0.577349;-0.577349;,0.577349;-0.577349;-0.577349;,0.577349;0.577349;-0.577349;,-0.577349;0.577349;-0.577349;,0.577349;-0.577349;0.577349;,0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;-0.577349;,-0.577349;-0.577349;0.577349;,-0.577349;0.577349;0.577349;,-0.577349;0.577349;-0.577349;,0.577349;0.577349;-0.577349;,0.577349;0.577349;0.577349;,0;-0.707083;0.707083;,-0.599902;-0.565722;0.565722;,-0.599872;0.565722;0.565722;,0;0.707083;0.707083;,-0.599902;-0.565722;0.565722;,-0.599902;-0.565722;-0.565722;,-0.599872;0.565722;-0.565722;,-0.599872;0.565722;0.565722;,0;-0.707083;0.707083;,0;-0.707083;-0.707083;,-0.599902;-0.565722;-0.565722;,-0.599902;-0.565722;0.565722;,-0.599872;0.565722;0.565722;,-0.599872;0.565722;-0.565722;,0;0.707083;-0.707083;,0;0.707083;0.707083;,-0.599902;-0.565722;-0.565722;,0;-0.707083;-0.707083;,0;0.707083;-0.707083;,-0.599872;0.565722;-0.565722;;68;4;3,2,1,0;,4;7,6,5,4;,4;11,10,9,8;,4;15,14,13,12;,4;19,18,17,16;,4;23,22,21,20;,4;27,26,25,24;,4;31,30,29,28;,4;35,34,33,32;,4;39,38,37,36;,4;43,42,41,40;,4;47,46,45,44;,4;51,50,49,48;,4;55,54,53,52;,4;59,58,57,56;,4;63,62,61,60;,4;67,66,65,64;,4;71,70,69,68;,4;75,74,73,72;,4;79,78,77,76;,4;83,82,81,80;,4;87,86,85,84;,4;91,90,89,88;,4;95,94,93,92;,4;99,98,97,96;,4;103,102,101,100;,4;107,106,105,104;,4;111,110,109,108;,4;115,114,113,112;,4;119,118,117,116;,4;123,122,121,120;,4;127,126,125,124;,4;131,130,129,128;,4;135,134,133,132;,4;139,138,137,136;,4;143,142,141,140;,4;147,146,145,144;,4;151,150,149,148;,4;155,154,153,152;,4;159,158,157,156;,4;163,162,161,160;,4;167,166,165,164;,4;171,170,169,168;,4;175,174,173,172;,4;179,178,177,176;,4;183,182,181,180;,4;187,186,185,184;,4;191,190,189,188;,4;195,194,193,192;,4;199,198,197,196;,4;203,202,201,200;,4;207,206,205,204;,4;211,210,209,208;,4;215,214,213,212;,4;219,218,217,216;,4;223,222,221,220;,4;227,226,225,224;,4;231,230,229,228;,4;235,234,233,232;,4;239,238,237,236;,4;243,242,241,240;,4;247,246,245,244;,4;251,250,249,248;,4;255,254,253,252;,4;259,258,257,256;,4;263,262,261,260;,4;267,266,265,264;,4;271,270,269,268;;}MeshTextureCoords{272;0.849264;0.899246;,0.849264;0.931916;,0.861547;0.931916;,0.861547;0.899246;,0.916988;0.931916;,0.916988;0.899246;,0.9054;0.899246;,0.9054;0.931916;,0.84857;0.844707;,0.84857;0.83254;,0.836981;0.83254;,0.836981;0.844707;,0.927004;0.903587;,0.927004;0.931916;,0.937019;0.931916;,0.937019;0.903587;,0.937019;0.903587;,0.937019;0.931916;,0.946887;0.931916;,0.946887;0.903587;,0.888533;0.856954;,0.888533;0.828625;,0.878517;0.828625;,0.878517;0.856954;,0.939292;0.870917;,0.939292;0.899246;,0.949159;0.899246;,0.949159;0.870917;,0.946887;0.91117;,0.956719;0.91117;,0.956719;0.901213;,0.946887;0.901213;,0.865118;0.813135;,0.855286;0.813135;,0.855286;0.823092;,0.865118;0.823092;,0.866874;0.847426;,0.866874;0.835259;,0.855286;0.835259;,0.855286;0.847426;,0.598002;0.973516;,0.598002;0.206739;,0.309722;0.206739;,0.309722;0.973516;,0.909393;0.822135;,0.909393;0.841014;,0.915938;0.841014;,0.915938;0.822135;,0.951962;0.931916;,0.951962;0.91117;,0.946887;0.91117;,0.946887;0.931916;,0.948762;0.841801;,0.948762;0.822921;,0.942217;0.822921;,0.942217;0.841801;,0.893608;0.838075;,0.893608;0.817329;,0.888533;0.817329;,0.888533;0.838075;,0.900724;0.909292;,0.90515;0.909292;,0.90515;0.902786;,0.900724;0.902786;,0.953585;0.871994;,0.949159;0.871994;,0.949159;0.8785;,0.953585;0.8785;,0.84857;0.837995;,0.84857;0.856874;,0.855114;0.856874;,0.855114;0.837995;,0.902881;0.83746;,0.902881;0.816714;,0.897805;0.816714;,0.897805;0.83746;,0.942217;0.841801;,0.942217;0.822921;,0.935673;0.822921;,0.935673;0.841801;,0.949159;0.8785;,0.949159;0.899246;,0.954235;0.899246;,0.954235;0.8785;,0.919226;0.822135;,0.923651;0.822135;,0.923651;0.815629;,0.919226;0.815629;,0.928077;0.815629;,0.923651;0.815629;,0.923651;0.822135;,0.928077;0.822135;,0.865301;0.847426;,0.865301;0.876542;,0.875317;0.876542;,0.875317;0.847426;,0.909393;0.841014;,0.909393;0.87013;,0.919261;0.87013;,0.919261;0.841014;,0.855286;0.847426;,0.855286;0.876542;,0.865301;0.876542;,0.865301;0.847426;,0.919261;0.841014;,0.919261;0.87013;,0.929128;0.87013;,0.929128;0.841014;,0.878517;0.828625;,0.888349;0.828625;,0.88835;0.818668;,0.878517;0.818668;,0.836981;0.83254;,0.846814;0.83254;,0.846814;0.822583;,0.836981;0.822583;,0.857749;0.887894;,0.836981;0.887894;,0.837473;0.899246;,0.857257;0.899246;,0.855286;0.876542;,0.855286;0.856874;,0.836981;0.856874;,0.836981;0.876542;,0.897805;0.887893;,0.897313;0.876622;,0.879009;0.876622;,0.878517;0.887893;,0.886604;0.909292;,0.886112;0.920645;,0.9054;0.920645;,0.904908;0.909292;,0.977665;0.442421;,0.977665;0.131438;,0.799225;0.123708;,0.799225;0.450151;,0.849264;0.899246;,0.836981;0.899246;,0.836981;0.931916;,0.849264;0.931916;,0.909393;0.866576;,0.897805;0.866576;,0.897805;0.899246;,0.909393;0.899246;,0.84857;0.844707;,0.836981;0.844707;,0.836981;0.856874;,0.84857;0.856874;,0.929276;0.899246;,0.939292;0.899246;,0.939292;0.870917;,0.929276;0.870917;,0.876741;0.819096;,0.866874;0.819096;,0.866874;0.847426;,0.876741;0.847426;,0.939144;0.841801;,0.929128;0.841801;,0.929128;0.87013;,0.939144;0.87013;,0.949011;0.841801;,0.939144;0.841801;,0.939144;0.87013;,0.949011;0.87013;,0.836981;0.812626;,0.836981;0.822583;,0.846814;0.822583;,0.846814;0.812626;,0.909393;0.812178;,0.909393;0.822135;,0.919226;0.822135;,0.919226;0.812178;,0.866874;0.823092;,0.855286;0.823092;,0.855286;0.835259;,0.866874;0.835259;,0.021442;0.973516;,0.309722;0.973516;,0.309722;0.206739;,0.021442;0.206739;,0.916039;0.841014;,0.922583;0.841014;,0.922583;0.822135;,0.916039;0.822135;,0.907956;0.816714;,0.902881;0.816714;,0.902881;0.83746;,0.907956;0.83746;,0.929128;0.822135;,0.922583;0.822135;,0.922583;0.841014;,0.929128;0.841014;,0.853645;0.817249;,0.84857;0.817249;,0.84857;0.837995;,0.853645;0.837995;,0.900724;0.909292;,0.900724;0.902786;,0.895944;0.902786;,0.895944;0.909292;,0.93896;0.816415;,0.93896;0.822921;,0.94374;0.822921;,0.94374;0.816415;,0.935673;0.822921;,0.929128;0.822921;,0.929128;0.841801;,0.935673;0.841801;,0.954087;0.849384;,0.949011;0.849384;,0.949011;0.87013;,0.954087;0.87013;,0.895077;0.838075;,0.888533;0.838075;,0.888533;0.856954;,0.895077;0.856954;,0.948762;0.841801;,0.953838;0.841801;,0.953838;0.821055;,0.948762;0.821055;,0.94374;0.816415;,0.94374;0.822921;,0.94852;0.822921;,0.94852;0.816415;,0.949011;0.842878;,0.949011;0.849384;,0.953791;0.849384;,0.953791;0.842878;,0.919409;0.87013;,0.909393;0.87013;,0.909393;0.899246;,0.919409;0.899246;,0.897805;0.866576;,0.907672;0.866576;,0.907672;0.83746;,0.897805;0.83746;,0.927004;0.9028;,0.916988;0.9028;,0.916988;0.931916;,0.927004;0.931916;,0.929276;0.87013;,0.919409;0.87013;,0.919409;0.899246;,0.929276;0.899246;,0.93896;0.822921;,0.93896;0.812965;,0.929128;0.812965;,0.929128;0.822921;,0.886112;0.899336;,0.886112;0.909292;,0.895944;0.909292;,0.895944;0.899336;,0.857749;0.887894;,0.857257;0.876542;,0.837473;0.876542;,0.836981;0.887894;,0.896821;0.856954;,0.878517;0.856954;,0.878517;0.876622;,0.896821;0.876622;,0.897805;0.887893;,0.878517;0.887893;,0.879009;0.899246;,0.897313;0.899246;,0.886604;0.931916;,0.904908;0.931916;,0.9054;0.920645;,0.886112;0.920645;,0.620785;0.44242;,0.799225;0.450151;,0.799225;0.123708;,0.620785;0.131438;;}XSkinMeshHeader{3;9;10;}SkinWeights{"Armature_arm_l";24;44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,66;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;-0.047733,0.901521,0.430095,0,-0.097683,0.424309,-0.900233,0,-0.994073,-0.084983,0.06781,0,0.374873,-2.006904,2.980378,1;;}SkinWeights{"Armature_elbow_r";24;216,219,218,213,212,215,214,209,224,208,227,211,226,210,206,221,207,220,204,223,205,222,225,217;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;0.102316,0.92166,-0.374266,0,-0.090709,-0.366028,-0.926173,0,-0.990608,0.128712,0.046152,0,0.402018,1.853661,2.350172,1;;}SkinWeights{"Armature_arm_r";24;186,187,184,185,182,183,180,194,195,203,202,192,193,201,200,199,190,198,191,197,188,196,189,181;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;-0.047733,0.901521,-0.430095,0,-0.05233,-0.432251,-0.900234,0,-0.997489,-0.020464,0.067809,0,0.160852,2.035269,2.980378,1;;}SkinWeights{"Armature_knee_l";24;105,99,114,106,98,115,107,101,93,108,100,92,109,103,95,110,102,94,111,97,112,104,113,96;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;1,0,0,0,0,0.054357,-0.998522,0,0,0.998501,0.054355,0,-0.246294,-0.008592,1.301673,1;;}SkinWeights{"Armature_Bone_007";40;132,133,134,135,124,125,126,252,253,254,255,121,122,264,265,123,267,268,269,270,116,256,258,259,260,261,262,263,271,266,120,119,117,128,129,127,130,118,131,257;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;1,0,0,0,0,0,1,0,0,-1,0,0,0,0,-3.793003,1;;}SkinWeights{"Armature_elbow_l";24;88,80,72,91,83,75,90,82,74,70,85,77,71,84,76,68,87,79,69,86,78,89,81,73;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;0.102316,0.92166,0.374266,0,-0.008222,0.377011,-0.926173,0,-0.994719,0.091686,0.046152,0,-0.014321,-1.896701,2.350171,1;;}SkinWeights{"Armature_knee_r";24;249,235,250,234,251,229,244,228,245,231,246,230,247,240,241,242,243,237,236,239,238,233,248,232;1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;1,0,0,0,0,0.054357,-0.998522,0,0,0.998501,0.054355,0,0.246294,-0.008592,1.301673,1;;}SkinWeights{"Armature_leg_l";38;0,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,40,43,136,145,177,144;0.055873,0.852304,0.852304,0.82998,0.055873,0.852304,0.82998,0.054606,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82998,0.054606,0.055873,0.054606,0.054606,0.055873;1,0,0,0,0,-0.056452,-0.998405,0,0,0.998385,-0.056452,0,-0.246294,0.135476,2.396023,1;;}SkinWeights{"Armature_leg_r";38;0,170,169,11,168,151,150,149,148,147,146,176,145,177,144,159,158,157,156,155,154,153,167,136,166,137,165,164,163,140,162,141,161,43,160,152,8,171;0.055873,1,1,0.054606,1,1,1,1,1,0.852304,0.82998,0.82998,0.054606,0.054606,0.055873,1,1,1,1,1,1,1,1,0.055873,1,0.852304,1,1,1,0.852304,1,0.82998,1,0.054606,1,1,0.055873,1;1,0,0,0,0,-0.056452,-0.998405,0,0,0.998385,-0.056452,0,0.246294,0.135476,2.396023,1;;}SkinWeights{"Armature_body";40;0,1,2,3,4,5,6,7,8,9,10,11,36,37,38,39,40,41,42,43,136,137,138,139,140,147,141,146,142,145,143,144,179,174,178,173,177,172,176,175;0.888255,1,1,0.147696,0.147696,1,1,0.17002,0.888255,0.147696,0.17002,0.890788,1,1,1,1,0.17002,1,1,0.890788,0.888255,0.147696,1,1,0.147696,0.147696,0.17002,0.17002,1,0.890788,1,0.888255,1,1,1,1,0.890788,1,0.17002,1;1,0,0,0,0,0,1,0,0,-1,0,0,0,0,-2.571201,1;;}}}}} \ No newline at end of file diff --git a/media/cooltexture.png b/media/cooltexture.png new file mode 100755 index 0000000000000000000000000000000000000000..fcc219ac7ea95c2ad9b49ad0064835638cb51c69 GIT binary patch literal 4828 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 literal 0 HcmV?d00001 diff --git a/media/cubeMapReflection.frag b/media/cubeMapReflection.frag deleted file mode 100644 index f1a4a1fc..00000000 --- a/media/cubeMapReflection.frag +++ /dev/null @@ -1,12 +0,0 @@ -uniform samplerCube cubeTex; -uniform float Roughness; - -void main( void ) -{ -// gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - vec3 uvw = vec3(gl_TexCoord[0]); - //gl_FragColor = textureCube( cubeTex, uvw ); - gl_FragColor = textureLod( cubeTex, uvw, Roughness ); - //gl_FragColor = textureCube( cubeTex, uvw, Roughness ); -} - diff --git a/media/cubeMapReflection.vert b/media/cubeMapReflection.vert deleted file mode 100644 index 97f9ac5b..00000000 --- a/media/cubeMapReflection.vert +++ /dev/null @@ -1,27 +0,0 @@ -uniform int StyleUVW ; // 0 = specular reflection, 1 = diffuse reflection, 2 = use model vertex coordinates for uvw. -uniform vec3 CameraPos; -uniform mat4 World; - -void main(void) -{ - gl_Position = ftransform(); // same as gl_ModelViewProjectionMatrix * gl_Vertex; - - // compute the reflection vector, and assign it to texcoord 0 - if ( StyleUVW == 0 ) - { - vec4 worldPos = World*gl_Vertex; - vec3 viewNormal = normalize(worldPos.xyz - CameraPos); // view vector - - gl_TexCoord[0] = vec4( reflect( viewNormal, normalize(gl_Normal) ), 1.0 ); - } - else if ( StyleUVW == 1 ) - { - // just use the normal for the reflection vector - gl_TexCoord[0] = vec4(normalize(gl_Normal), 1.0); - } - else if ( StyleUVW == 2 ) - { - // use vertex-coordinates for texture coordinates - gl_TexCoord[0] = normalize(gl_Vertex); - } -} diff --git a/media/cubeMapReflectionPS.hlsl b/media/cubeMapReflectionPS.hlsl deleted file mode 100644 index 179979dc..00000000 --- a/media/cubeMapReflectionPS.hlsl +++ /dev/null @@ -1,10 +0,0 @@ -sampler cubeTex: register(s0); -float Roughness; - -float4 PS( float4 uvwTex : TEXCOORD0 ) : COLOR -{ - uvwTex.w = Roughness; - //return texCUBEbias( cubeTex, uvwTex); - return texCUBElod( cubeTex, uvwTex); - //return texCUBE( cubeTex, uvwTex); -} diff --git a/media/cubeMapReflectionVS.hlsl b/media/cubeMapReflectionVS.hlsl deleted file mode 100644 index 64033060..00000000 --- a/media/cubeMapReflectionVS.hlsl +++ /dev/null @@ -1,38 +0,0 @@ -int StyleUVW ; // 0 = specular reflection, 1 = diffuse reflection, 2 = use model vertex coordinates for uvw. -float4x4 WorldViewProj; -float4x4 World; -float3 CameraPos; - -// Vertex Shader -void VS( - in float4 VPos : POSITION, - in float3 VNorm : NORMAL, - in float3 VTex : TEXCOORD0, - out float4 outPos : POSITION, - out float4 outTex : TEXCOORD0 ) -{ - // vertex position from model-space to view-space - outPos = mul( VPos, WorldViewProj ); - - if ( StyleUVW == 0 ) - { - // create ray from camera position to the vertex, in world space - float4 worldPos = mul(float4(VPos.x, VPos.y, VPos.z, 1.0), World); - float3 view = CameraPos - worldPos.xyz; - - float4 normWorld = normalize(mul(float4(VNorm.x, VNorm.y, VNorm.z, 0.0), World)); // TODO: when objects are scaled non-uniform we need to multiply by WorldInverseTranspose instead - - // compute the reflection vector, and assign it to texcoord 0 - outTex.xyz = reflect( -normalize(view), normWorld.xyz ); - } - else if ( StyleUVW == 1 ) - { - // just use the normal for the reflection vector - outTex.xyz = normalize(VNorm); - } - else if ( StyleUVW == 2 ) - { - // use vertex-coordinates for texture coordinates - outTex.xyz = VPos.xyz; - } -} diff --git a/media/cubemap_license.txt b/media/cubemap_license.txt deleted file mode 100644 index 2bfb4a5a..00000000 --- a/media/cubemap_license.txt +++ /dev/null @@ -1,18 +0,0 @@ -License for the cubemap_*.jpg files in this folder. - -Author -====== - -This is the work of Emil Persson, aka Humus. -http://www.humus.name - -License -======= - -This work is licensed under a Creative Commons Attribution 3.0 Unported License. -http://creativecommons.org/licenses/by/3.0/ - - -Changes -======= -For the Irrlicht engine we downscaled the images to 512x512. Get the full 2048x2048 resolution at http://www.humus.name diff --git a/media/cubemap_negx.jpg b/media/cubemap_negx.jpg deleted file mode 100644 index abb77ce14b3698499f71c8273d0a2dca99662eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133410 zcmb4qWl&sAu=b+CgF6IwcXxNU#oZQn4esvl4vV`52yQ_aC%BW~mcWhq|EJ<(7=VEQ z4S)u~Kw$u&F`!^Dpgz6>NB{r;JPg#o@_z^l8s?umfKLdB|C))R0MIc1b^SlB0H}Wg z{!V*`Nlj}aOj1|0x^y3-aA_y9m(cpD9@J}k(K3to>dJc`2mHdfqzaz1Vg{Bzqz zPfjC;B&|mN4W*2H*tJ-U1NJLI8(j{({MS7K#6$9Ic*O9ZVKj0Uu;R95GkV%NG;;3n zSakSoFcRMIC}f8bv}6Qui7y8ajhC;jG74l>EjeEx-jb)r!;ZvTd40=Ovh3H#T_I><0NsVFpR zp4n#Q?5=<@?0gw`br_Vj=Z;II0^_Wcznsx;Ce(vdJ*6`b`H2LO3IR{sDU(^|HtrUj zVoYs5Y$*Y-d~ygBjeG(;Iu;5XpUl4wL&$Pcq4UXBEDsm*S@CJ9NXlSCgOYq72_uDvsVOWzZ15wIEP^ zg%yg7ixpE!#<#$LMVVw%;-mt|proM;K`U`WO~Rs3N#TRm{42SVD>>4uL**)5@w}+^ zk%r7Ukcq=_QOv$-WsU+^yS)6&%6K_#mb`EuNOJ?qW=q&r-TFPs_y&3zHrZu2Vp8>F z0DwxA$ghli*7D&{lxX;v=HEEUCt$y!Lt(NJn=(j1u|Z)m69<=UX=clgrGE-1bDA2P zxz*ZLJ$G5_mmq@W%C<%f&r!ih#m=|dF}$u2JGnx3H@Z5%?8}g}pFZYs$d6p(Mil4I zs|e-TNVOit|53*w&PfHAO(qA8n7xEJ1en1>A%GT7!ww-Jo4`cjCxdbtfq3WDu&tZz z@@1E%uqjPaF?6){7GVW3rJ;N$GY#c1!zW8cVT*G@^~Wp#ev&pGz2`6VyX7+2Epb~) zn+kxWD#u~TJB(rkQiV4G$V}ysT)tsJ4MU5wSx$(}U{N8WSj$11^2x~2SbjyA=mO@35kZR{>w>Ea&KSp03Le;UF{o!9K0ERlPTsJJo^xbQWO~!w0N@k z7z`OSJieln^6FOJ;?jf(twrnAXcJfLHrfxNh_)F!V&MFCb^Fgo+mmpza>+v&L?eZ7 z;uvgVoUL?c7niZq(uH9A@gpx(;9yyn_+8t~{!*n!eXO=FB(lAgUk{0e3mQNiMb4Ci zfKF!KloF2Os7C`!31tbzHUq1N5|J#W!83L8V0qT5>vZHeLsHSUG-$6fc6Pj=@7Szx zMMe&i;~qPQ=lLdM+hYJvkE#a6$YR~jx1iyRvi|F)7-sBBxW;CzEiP2LEw)<`-zw(@e9?a z;*7FH#-bnJH)5-AV&as?rvp5~3b~dk2Ax}UUf#FpTq^sI8F$t zd1Oe{7fCI%E5E&>iE^hkV+G!#S*MQ|XAV3bog&}q|`t*fW7`oVUUA&CY= zt$gj!3;IIoc zFysv^X%Wa^!#QCQWKcLO*{-%3Jo~*I|F#=BOuSCV7{~c-4rmsQt@VGRGnrWuMv